1717use Laudis \Neo4j \Contracts \ClientInterface ;
1818use Laudis \Neo4j \Contracts \DriverInterface ;
1919use Laudis \Neo4j \Contracts \SessionInterface ;
20+ use Laudis \Neo4j \Contracts \TransactionInterface ;
2021use Laudis \Neo4j \Contracts \UnmanagedTransactionInterface ;
2122use Laudis \Neo4j \Databags \SessionConfiguration ;
2223use Laudis \Neo4j \Databags \Statement ;
@@ -38,6 +39,11 @@ final class Client implements ClientInterface
3839 */
3940 private array $ boundTransactions = [];
4041
42+ /**
43+ * @var array<string, SessionInterface<ResultFormat>>
44+ */
45+ private array $ boundSessions = [];
46+
4147 /**
4248 * @psalm-mutation-free
4349 *
@@ -59,16 +65,42 @@ public function runStatement(Statement $statement, ?string $alias = null)
5965 return $ this ->runStatements ([$ statement ], $ alias )->first ();
6066 }
6167
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+
6291 public function runStatements (iterable $ statements , ?string $ alias = null ): CypherList
6392 {
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+ }
6597
66- return $ session ->runStatements ($ statements, $ this -> defaultTransactionConfiguration );
98+ return $ runner ->runStatements ($ statements );
6799 }
68100
69101 public function beginTransaction (?iterable $ statements = null , ?string $ alias = null , ?TransactionConfiguration $ config = null ): UnmanagedTransactionInterface
70102 {
71- $ session = $ this ->startSession ($ alias, $ this -> defaultSessionConfiguration );
103+ $ session = $ this ->getSession ($ alias );
72104 $ config = $ this ->getTsxConfig ($ config );
73105
74106 return $ session ->beginTransaction ($ statements , $ config );
@@ -89,16 +121,24 @@ private function startSession(?string $alias, SessionConfiguration $configuratio
89121
90122 public function writeTransaction (callable $ tsxHandler , ?string $ alias = null , ?TransactionConfiguration $ config = null )
91123 {
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+ }
94130
95- return $ startSession ->writeTransaction ($ tsxHandler , $ this ->getTsxConfig ($ config ));
131+ return $ session ->writeTransaction ($ tsxHandler , $ this ->getTsxConfig ($ config ));
96132 }
97133
98134 public function readTransaction (callable $ tsxHandler , ?string $ alias = null , ?TransactionConfiguration $ config = null )
99135 {
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+ }
102142
103143 return $ session ->readTransaction ($ tsxHandler , $ this ->getTsxConfig ($ config ));
104144 }
0 commit comments