Skip to content

Commit 7d9f8a2

Browse files
committed
added default configuration for client
1 parent 970d169 commit 7d9f8a2

File tree

5 files changed

+194
-22
lines changed

5 files changed

+194
-22
lines changed

src/Client.php

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,37 +43,46 @@ final class Client implements ClientInterface
4343
private array $drivers;
4444
/** @psalm-readonly */
4545
private ?string $default;
46+
private SessionConfiguration $defaultSessionConfiguration;
47+
private TransactionConfiguration $defaultTransactionConfiguration;
4648

4749
/**
4850
* @psalm-mutation-free
4951
*
5052
* @param CypherMap<DriverSetup> $driverSetups
5153
* @param FormatterInterface<ResultFormat> $formatter
5254
*/
53-
public function __construct(CypherMap $driverSetups, DriverConfiguration $configuration, FormatterInterface $formatter, ?string $default)
55+
public function __construct(CypherMap $driverSetups, DriverConfiguration $defaultDriverConfiguration, SessionConfiguration $defaultSessionConfiguration, TransactionConfiguration $defaultTransactionConfiguration, FormatterInterface $formatter, ?string $default)
5456
{
5557
$this->default = $default;
56-
$this->drivers = $this->createDrivers($driverSetups, $formatter, $configuration);
58+
$this->drivers = $this->createDrivers($driverSetups, $formatter, $defaultDriverConfiguration);
59+
$this->defaultSessionConfiguration = $defaultSessionConfiguration;
60+
$this->defaultTransactionConfiguration = $defaultTransactionConfiguration;
5761
}
5862

5963
public function run(string $query, iterable $parameters = [], ?string $alias = null)
6064
{
61-
return $this->startSession($alias, SessionConfiguration::default())->run($query, $parameters);
65+
return $this->runStatement(Statement::create($query, $parameters), $alias);
6266
}
6367

6468
public function runStatement(Statement $statement, ?string $alias = null)
6569
{
66-
return $this->startSession($alias, SessionConfiguration::default())->runStatement($statement);
70+
return $this->runStatements([$statement], $alias)->first();
6771
}
6872

6973
public function runStatements(iterable $statements, ?string $alias = null): CypherList
7074
{
71-
return $this->startSession($alias, SessionConfiguration::default())->runStatements($statements);
75+
$session = $this->startSession($alias, $this->defaultSessionConfiguration);
76+
77+
return $session->runStatements($statements, $this->defaultTransactionConfiguration);
7278
}
7379

7480
public function beginTransaction(?iterable $statements = null, ?string $alias = null, ?TransactionConfiguration $config = null): UnmanagedTransactionInterface
7581
{
76-
return $this->startSession($alias, SessionConfiguration::default())->beginTransaction($statements, $config);
82+
$session = $this->startSession($alias, $this->defaultSessionConfiguration);
83+
$config = $this->getTsxConfig($config);
84+
85+
return $session->beginTransaction($statements, $config);
7786
}
7887

7988
/**
@@ -95,19 +104,25 @@ public function getDriver(?string $alias): DriverInterface
95104
*
96105
* @return SessionInterface<ResultFormat>
97106
*/
98-
private function startSession(?string $alias = null, SessionConfiguration $configuration = null): SessionInterface
107+
private function startSession(?string $alias, SessionConfiguration $configuration): SessionInterface
99108
{
100-
return $this->getDriver($alias)->createSession($configuration ?? SessionConfiguration::default());
109+
return $this->getDriver($alias)->createSession($configuration);
101110
}
102111

103112
public function writeTransaction(callable $tsxHandler, ?string $alias = null, ?TransactionConfiguration $config = null)
104113
{
105-
return $this->startSession($alias, SessionConfiguration::default()->withAccessMode(AccessMode::WRITE()))->writeTransaction($tsxHandler, $config);
114+
$sessionConfig = $this->defaultSessionConfiguration->withAccessMode(AccessMode::WRITE());
115+
$startSession = $this->startSession($alias, $sessionConfig);
116+
117+
return $startSession->writeTransaction($tsxHandler, $this->getTsxConfig($config));
106118
}
107119

108120
public function readTransaction(callable $tsxHandler, ?string $alias = null, ?TransactionConfiguration $config = null)
109121
{
110-
return $this->startSession($alias, SessionConfiguration::default()->withAccessMode(AccessMode::READ()))->readTransaction($tsxHandler, $config);
122+
$sessionConfig = $this->defaultSessionConfiguration->withAccessMode(AccessMode::READ());
123+
$session = $this->startSession($alias, $sessionConfig);
124+
125+
return $session->readTransaction($tsxHandler, $this->getTsxConfig($config));
111126
}
112127

113128
public function transaction(callable $tsxHandler, ?string $alias = null, ?TransactionConfiguration $config = null)
@@ -157,4 +172,13 @@ private function createDrivers(CypherMap $driverSetups, FormatterInterface $form
157172
/** @var non-empty-array<string, DriverInterface<ResultFormat>> */
158173
return $drivers;
159174
}
175+
176+
private function getTsxConfig(?TransactionConfiguration $config): TransactionConfiguration
177+
{
178+
if ($config !== null) {
179+
return $this->defaultTransactionConfiguration->merge($config);
180+
}
181+
182+
return $this->defaultTransactionConfiguration;
183+
}
160184
}

src/ClientBuilder.php

Lines changed: 118 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Laudis\Neo4j\Databags\DriverConfiguration;
2525
use Laudis\Neo4j\Databags\DriverSetup;
2626
use Laudis\Neo4j\Databags\HttpPsrBindings;
27+
use Laudis\Neo4j\Databags\SessionConfiguration;
2728
use Laudis\Neo4j\Databags\TransactionConfiguration;
2829
use Laudis\Neo4j\Exception\UnsupportedScheme;
2930
use Laudis\Neo4j\Formatter\OGMFormatter;
@@ -49,7 +50,11 @@ final class ClientBuilder
4950
*/
5051
private CypherMap $driverConfigurations;
5152
/** @psalm-readonly */
52-
private DriverConfiguration $configuration;
53+
private DriverConfiguration $defaultDriverConfig;
54+
/** @psalm-readonly */
55+
private TransactionConfiguration $defaultTransactionConfig;
56+
/** @psalm-readonly */
57+
private SessionConfiguration $defaultSessionConfig;
5358
/** @psalm-readonly */
5459
private ?string $defaultDriver;
5560
/** @psalm-readonly */
@@ -61,22 +66,33 @@ final class ClientBuilder
6166
* @param CypherMap<DriverSetup> $driverConfigurations
6267
* @param FormatterInterface<T> $formatter
6368
*/
64-
public function __construct(DriverConfiguration $configuration, FormatterInterface $formatter, CypherMap $driverConfigurations, ?string $defaultDriver)
69+
public function __construct(DriverConfiguration $configuration, SessionConfiguration $sessionConfiguration, TransactionConfiguration $transactionConfiguration, FormatterInterface $formatter, CypherMap $driverConfigurations, ?string $defaultDriver)
6570
{
6671
$this->driverConfigurations = $driverConfigurations;
67-
$this->configuration = $configuration;
72+
$this->defaultDriverConfig = $configuration;
6873
$this->defaultDriver = $defaultDriver;
6974
$this->formatter = $formatter;
75+
$this->defaultSessionConfig = $sessionConfiguration;
76+
$this->defaultTransactionConfig = $transactionConfiguration;
7077
}
7178

7279
/**
80+
* Creates a client builder with default configurations and an OGMFormatter.
81+
*
7382
* @pure
7483
*
7584
* @return ClientBuilder<CypherList<CypherMap<OGMTypes>>>
7685
*/
7786
public static function create(): ClientBuilder
7887
{
79-
return new self(DriverConfiguration::default(), OGMFormatter::create(), new CypherMap(), null);
88+
return new self(
89+
DriverConfiguration::default(),
90+
SessionConfiguration::default(),
91+
TransactionConfiguration::default(),
92+
OGMFormatter::create(),
93+
new CypherMap(),
94+
null
95+
);
8096
}
8197

8298
/**
@@ -108,7 +124,14 @@ private function withParsedUrl(string $alias, Uri $uri, AuthenticateInterface $a
108124
$setup = new DriverSetup($uri, $authentication, $socketTimeout);
109125
$configs = new CypherMap(array_merge($this->driverConfigurations->toArray(), [$alias => $setup]));
110126

111-
return new self($this->configuration, $this->formatter, $configs, $this->defaultDriver);
127+
return new self(
128+
$this->defaultDriverConfig,
129+
$this->defaultSessionConfig,
130+
$this->defaultTransactionConfig,
131+
$this->formatter,
132+
$configs,
133+
$this->defaultDriver
134+
);
112135
}
113136

114137
/**
@@ -173,7 +196,9 @@ public function addHttpConnection(string $alias, string $url, HttpConfig $config
173196
$uri = $uri->withPort($uri->getPort() === 7687 ? 7474 : $uri->getPort());
174197

175198
$self = new self(
176-
$this->configuration->withHttpPsrBindings($bindings),
199+
$this->defaultDriverConfig->withHttpPsrBindings($bindings),
200+
$this->defaultSessionConfig,
201+
$this->defaultTransactionConfig,
177202
$this->formatter,
178203
$this->driverConfigurations,
179204
$this->defaultDriver
@@ -204,7 +229,14 @@ public function setDefaultConnection(string $alias): self
204229
*/
205230
public function withDefaultDriver(string $alias): self
206231
{
207-
return new self($this->configuration, $this->formatter, $this->driverConfigurations, $alias);
232+
return new self(
233+
$this->defaultDriverConfig,
234+
$this->defaultSessionConfig,
235+
$this->defaultTransactionConfig,
236+
$this->formatter,
237+
$this->driverConfigurations,
238+
$alias
239+
);
208240
}
209241

210242
/**
@@ -217,7 +249,14 @@ public function withDefaultDriver(string $alias): self
217249
*/
218250
public function withFormatter(FormatterInterface $formatter): self
219251
{
220-
return new self($this->configuration, $formatter, $this->driverConfigurations, $this->defaultDriver);
252+
return new self(
253+
$this->defaultDriverConfig,
254+
$this->defaultSessionConfig,
255+
$this->defaultTransactionConfig,
256+
$formatter,
257+
$this->driverConfigurations,
258+
$this->defaultDriver
259+
);
221260
}
222261

223262
/**
@@ -227,16 +266,84 @@ public function withFormatter(FormatterInterface $formatter): self
227266
*/
228267
public function build(): ClientInterface
229268
{
230-
return new Client($this->driverConfigurations, $this->configuration, $this->formatter, $this->defaultDriver);
269+
return new Client(
270+
$this->driverConfigurations,
271+
$this->defaultDriverConfig,
272+
$this->defaultSessionConfig,
273+
$this->defaultTransactionConfig,
274+
$this->formatter,
275+
$this->defaultDriver
276+
);
231277
}
232278

233279
/**
280+
* @deprecated
281+
* @see self::withDefaultDriverConfiguration
282+
*
234283
* @psalm-mutation-free
235284
*/
236285
public function withHttpPsrBindings(HttpPsrBindings $bindings): self
237286
{
238-
$config = $this->configuration->withHttpPsrBindings($bindings);
287+
$config = $this->defaultDriverConfig->withHttpPsrBindings($bindings);
239288

240-
return new self($config, $this->formatter, $this->driverConfigurations, $this->defaultDriver);
289+
return new self(
290+
$config,
291+
$this->defaultSessionConfig,
292+
$this->defaultTransactionConfig,
293+
$this->formatter,
294+
$this->driverConfigurations,
295+
$this->defaultDriver
296+
);
297+
}
298+
299+
/**
300+
* @return self<T>
301+
*
302+
* @psalm-mutation-free
303+
*/
304+
public function withDefaultDriverConfiguration(DriverConfiguration $config): self
305+
{
306+
return new self(
307+
$config,
308+
$this->defaultSessionConfig,
309+
$this->defaultTransactionConfig,
310+
$this->formatter,
311+
$this->driverConfigurations,
312+
$this->defaultDriver
313+
);
314+
}
315+
316+
/**
317+
* @return self<T>
318+
*
319+
* @psalm-mutation-free
320+
*/
321+
public function withDefaultSessionConfiguration(SessionConfiguration $config): self
322+
{
323+
return new self(
324+
$this->defaultDriverConfig,
325+
$config,
326+
$this->defaultTransactionConfig,
327+
$this->formatter,
328+
$this->driverConfigurations,
329+
$this->defaultDriver
330+
);
331+
}
332+
333+
/**
334+
* @return self<T>
335+
*
336+
* @psalm-mutation-free
337+
*/
338+
public function withDefaultTransactionConfiguration(TransactionConfiguration $config): self
339+
{
340+
return new self(
341+
$this->defaultDriverConfig,
342+
$this->defaultSessionConfig,
343+
$config,
344+
$this->formatter,
345+
$this->driverConfigurations,
346+
$this->defaultDriver
347+
);
241348
}
242349
}

src/Formatter/BasicFormatter.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
use UnexpectedValueException;
3131

3232
/**
33-
* Formats the result in basic CypherLists, CypherMaps and arrays by erasing all other types.
33+
* Formats the result in basic CypherLists and CypherMaps. All cypher types are erased so that the map only contains scalar, null or array values.
3434
*
3535
* @psalm-import-type CypherError from \Laudis\Neo4j\Contracts\FormatterInterface
3636
* @psalm-import-type CypherRowResponse from \Laudis\Neo4j\Contracts\FormatterInterface
@@ -45,6 +45,16 @@
4545
*/
4646
final class BasicFormatter implements FormatterInterface
4747
{
48+
/**
49+
* Creates a new instance of itself.
50+
*
51+
* @pure
52+
*/
53+
public static function create(): self
54+
{
55+
return new self();
56+
}
57+
4858
/**
4959
* @param array{fields: array<int, string>} $meta
5060
* @param array<array-key, array> $results

src/Formatter/OGMFormatter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ public function __construct(BoltOGMTranslator $boltTranslator, HttpOGMArrayTrans
6464
}
6565

6666
/**
67+
* Creates a new instance of itself.
68+
*
6769
* @pure
6870
*/
6971
public static function create(): OGMFormatter

src/Formatter/SummarizedResultFormatter.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
* @psalm-import-type CypherResponseSet from \Laudis\Neo4j\Contracts\FormatterInterface
3737
* @psalm-import-type CypherResponse from \Laudis\Neo4j\Contracts\FormatterInterface
3838
* @psalm-import-type BoltCypherStats from \Laudis\Neo4j\Contracts\FormatterInterface
39+
* @psalm-import-type OGMResults from \Laudis\Neo4j\Formatter\OGMFormatter
3940
*
4041
* @implements FormatterInterface<SummarizedResult<T>>
4142
*
@@ -46,6 +47,34 @@ final class SummarizedResultFormatter implements FormatterInterface
4647
/** @var FormatterInterface<T> */
4748
private FormatterInterface $formatter;
4849

50+
/**
51+
* Creates a new instance of itself by decorating an OGMFormatter.
52+
*
53+
* @return self<OGMResults>
54+
*
55+
* @pure
56+
*/
57+
public static function create(): self
58+
{
59+
return self::createWithFormatter(OGMFormatter::create());
60+
}
61+
62+
/**
63+
* @template U
64+
*
65+
* Creates a new summarized result formatter by decorating the given formatter.
66+
*
67+
* @param FormatterInterface<U> $formatter
68+
*
69+
* @return self<U>
70+
*
71+
* @pure
72+
*/
73+
public static function createWithFormatter(FormatterInterface $formatter): self
74+
{
75+
return new self($formatter);
76+
}
77+
4978
/**
5079
* @param FormatterInterface<T> $formatter
5180
*/

0 commit comments

Comments
 (0)