Skip to content

Commit aa93c84

Browse files
committed
introduced session and transaction reusage in client for optimal performance
1 parent 7186750 commit aa93c84

File tree

1 file changed

+48
-8
lines changed

1 file changed

+48
-8
lines changed

src/Client.php

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Laudis\Neo4j\Contracts\ClientInterface;
1818
use Laudis\Neo4j\Contracts\DriverInterface;
1919
use Laudis\Neo4j\Contracts\SessionInterface;
20+
use Laudis\Neo4j\Contracts\TransactionInterface;
2021
use Laudis\Neo4j\Contracts\UnmanagedTransactionInterface;
2122
use Laudis\Neo4j\Databags\SessionConfiguration;
2223
use 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

Comments
 (0)