17
17
use Laudis \Neo4j \Contracts \ClientInterface ;
18
18
use Laudis \Neo4j \Contracts \DriverInterface ;
19
19
use Laudis \Neo4j \Contracts \SessionInterface ;
20
+ use Laudis \Neo4j \Contracts \TransactionInterface ;
20
21
use Laudis \Neo4j \Contracts \UnmanagedTransactionInterface ;
21
22
use Laudis \Neo4j \Databags \SessionConfiguration ;
22
23
use Laudis \Neo4j \Databags \Statement ;
@@ -38,6 +39,11 @@ final class Client implements ClientInterface
38
39
*/
39
40
private array $ boundTransactions = [];
40
41
42
+ /**
43
+ * @var array<string, SessionInterface<ResultFormat>>
44
+ */
45
+ private array $ boundSessions = [];
46
+
41
47
/**
42
48
* @psalm-mutation-free
43
49
*
@@ -59,16 +65,42 @@ public function runStatement(Statement $statement, ?string $alias = null)
59
65
return $ this ->runStatements ([$ statement ], $ alias )->first ();
60
66
}
61
67
68
+ private function getRunner (?string $ alias = null ): TransactionInterface |SessionInterface
69
+ {
70
+ $ alias ??= $ this ->driverSetups ->getDefaultAlias ();
71
+
72
+ if (array_key_exists ($ alias , $ this ->boundTransactions ) &&
73
+ count ($ this ->boundTransactions [$ alias ]) > 0 ) {
74
+ return $ this ->boundTransactions [$ alias ][array_key_last ($ this ->boundTransactions [$ alias ])];
75
+ }
76
+
77
+ return $ this ->getSession ($ alias );
78
+ }
79
+
80
+ private function getSession (?string $ alias = null ): SessionInterface
81
+ {
82
+ $ alias ??= $ this ->driverSetups ->getDefaultAlias ();
83
+
84
+ if (array_key_exists ($ alias , $ this ->boundSessions )) {
85
+ return $ this ->boundSessions [$ alias ];
86
+ }
87
+
88
+ return $ this ->boundSessions [$ alias ] = $ this ->startSession ($ alias , $ this ->defaultSessionConfiguration );
89
+ }
90
+
62
91
public function runStatements (iterable $ statements , ?string $ alias = null ): CypherList
63
92
{
64
- $ session = $ this ->startSession ($ alias , $ this ->defaultSessionConfiguration );
93
+ $ runner = $ this ->getRunner ($ alias );
94
+ if ($ runner instanceof SessionInterface) {
95
+ return $ runner ->runStatements ($ statements , $ this ->defaultTransactionConfiguration );
96
+ }
65
97
66
- return $ session ->runStatements ($ statements, $ this -> defaultTransactionConfiguration );
98
+ return $ runner ->runStatements ($ statements );
67
99
}
68
100
69
101
public function beginTransaction (?iterable $ statements = null , ?string $ alias = null , ?TransactionConfiguration $ config = null ): UnmanagedTransactionInterface
70
102
{
71
- $ session = $ this ->startSession ($ alias, $ this -> defaultSessionConfiguration );
103
+ $ session = $ this ->getSession ($ alias );
72
104
$ config = $ this ->getTsxConfig ($ config );
73
105
74
106
return $ session ->beginTransaction ($ statements , $ config );
@@ -89,16 +121,24 @@ private function startSession(?string $alias, SessionConfiguration $configuratio
89
121
90
122
public function writeTransaction (callable $ tsxHandler , ?string $ alias = null , ?TransactionConfiguration $ config = null )
91
123
{
92
- $ sessionConfig = $ this ->defaultSessionConfiguration ->withAccessMode (AccessMode::WRITE ());
93
- $ startSession = $ this ->startSession ($ alias , $ sessionConfig );
124
+ if ($ this ->defaultSessionConfiguration ->getAccessMode () === AccessMode::WRITE ()) {
125
+ $ session = $ this ->getSession ($ alias );
126
+ } else {
127
+ $ sessionConfig = $ this ->defaultSessionConfiguration ->withAccessMode (AccessMode::WRITE ());
128
+ $ session = $ this ->startSession ($ alias , $ sessionConfig );
129
+ }
94
130
95
- return $ startSession ->writeTransaction ($ tsxHandler , $ this ->getTsxConfig ($ config ));
131
+ return $ session ->writeTransaction ($ tsxHandler , $ this ->getTsxConfig ($ config ));
96
132
}
97
133
98
134
public function readTransaction (callable $ tsxHandler , ?string $ alias = null , ?TransactionConfiguration $ config = null )
99
135
{
100
- $ sessionConfig = $ this ->defaultSessionConfiguration ->withAccessMode (AccessMode::READ ());
101
- $ session = $ this ->startSession ($ alias , $ sessionConfig );
136
+ if ($ this ->defaultSessionConfiguration ->getAccessMode () === AccessMode::READ ()) {
137
+ $ session = $ this ->getSession ($ alias );
138
+ } else {
139
+ $ sessionConfig = $ this ->defaultSessionConfiguration ->withAccessMode (AccessMode::WRITE ());
140
+ $ session = $ this ->startSession ($ alias , $ sessionConfig );
141
+ }
102
142
103
143
return $ session ->readTransaction ($ tsxHandler , $ this ->getTsxConfig ($ config ));
104
144
}
0 commit comments