Skip to content

Commit bf66b10

Browse files
committed
merged graceful driver fallback into main
2 parents 178b0c1 + d019354 commit bf66b10

File tree

6 files changed

+224
-158
lines changed

6 files changed

+224
-158
lines changed

src/Basic/Client.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ public function beginTransaction(?iterable $statements = null, ?string $alias =
5757
return new UnmanagedTransaction($this->client->beginTransaction($statements, $alias, $config));
5858
}
5959

60-
/**
61-
* @psalm-mutation-free
62-
*/
6360
public function getDriver(?string $alias): DriverInterface
6461
{
6562
return $this->client->getDriver($alias);

src/Client.php

Lines changed: 12 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,11 @@
1313

1414
namespace Laudis\Neo4j;
1515

16-
use function array_key_exists;
17-
use InvalidArgumentException;
16+
use Laudis\Neo4j\Common\DriverSetupManager;
1817
use Laudis\Neo4j\Contracts\ClientInterface;
1918
use Laudis\Neo4j\Contracts\DriverInterface;
20-
use Laudis\Neo4j\Contracts\FormatterInterface;
2119
use Laudis\Neo4j\Contracts\SessionInterface;
2220
use Laudis\Neo4j\Contracts\UnmanagedTransactionInterface;
23-
use Laudis\Neo4j\Databags\DriverConfiguration;
24-
use Laudis\Neo4j\Databags\DriverSetup;
2521
use Laudis\Neo4j\Databags\SessionConfiguration;
2622
use Laudis\Neo4j\Databags\Statement;
2723
use Laudis\Neo4j\Databags\TransactionConfiguration;
@@ -37,26 +33,24 @@
3733
*/
3834
final class Client implements ClientInterface
3935
{
40-
private const DEFAULT_DRIVER_CONFIG = 'bolt://localhost:7687';
41-
/** @var non-empty-array<string, DriverInterface<ResultFormat>> */
42-
private array $drivers;
43-
/** @psalm-readonly */
44-
private ?string $default;
4536
private SessionConfiguration $defaultSessionConfiguration;
4637
private TransactionConfiguration $defaultTransactionConfiguration;
38+
/** @var DriverSetupManager<ResultFormat> */
39+
private DriverSetupManager $driverSetups;
4740

4841
/**
4942
* @psalm-mutation-free
5043
*
51-
* @param array<string, DriverSetup> $driverSetups
52-
* @param FormatterInterface<ResultFormat> $formatter
44+
* @param DriverSetupManager<ResultFormat> $driverSetups
5345
*/
54-
public function __construct(array $driverSetups, DriverConfiguration $defaultDriverConfiguration, SessionConfiguration $defaultSessionConfiguration, TransactionConfiguration $defaultTransactionConfiguration, FormatterInterface $formatter, ?string $default)
55-
{
56-
$this->default = $default;
57-
$this->drivers = $this->createDrivers($driverSetups, $formatter, $defaultDriverConfiguration);
46+
public function __construct(
47+
DriverSetupManager $driverSetups,
48+
SessionConfiguration $defaultSessionConfiguration,
49+
TransactionConfiguration $defaultTransactionConfiguration
50+
) {
5851
$this->defaultSessionConfiguration = $defaultSessionConfiguration;
5952
$this->defaultTransactionConfiguration = $defaultTransactionConfiguration;
53+
$this->driverSetups = $driverSetups;
6054
}
6155

6256
public function run(string $statement, iterable $parameters = [], ?string $alias = null)
@@ -84,23 +78,12 @@ public function beginTransaction(?iterable $statements = null, ?string $alias =
8478
return $session->beginTransaction($statements, $config);
8579
}
8680

87-
/**
88-
* @psalm-mutation-free
89-
*/
9081
public function getDriver(?string $alias): DriverInterface
9182
{
92-
$alias = $this->decideAlias($alias);
93-
94-
if (!array_key_exists($alias, $this->drivers)) {
95-
throw new InvalidArgumentException(sprintf('The provided alias: "%s" was not found in the client', $alias));
96-
}
97-
98-
return $this->drivers[$alias];
83+
return $this->driverSetups->getDriver($alias);
9984
}
10085

10186
/**
102-
* @psalm-mutation-free
103-
*
10487
* @return SessionInterface<ResultFormat>
10588
*/
10689
private function startSession(?string $alias, SessionConfiguration $configuration): SessionInterface
@@ -131,39 +114,7 @@ public function transaction(callable $tsxHandler, ?string $alias = null, ?Transa
131114

132115
public function verifyConnectivity(?string $driver = null): bool
133116
{
134-
return $this->getDriver($driver)->verifyConnectivity();
135-
}
136-
137-
/**
138-
* @psalm-mutation-free
139-
*/
140-
private function decideAlias(?string $alias): string
141-
{
142-
return $alias ?? $this->default ?? array_key_first($this->drivers);
143-
}
144-
145-
/**
146-
* @param array<string, DriverSetup> $driverSetups
147-
* @param FormatterInterface<ResultFormat> $formatter
148-
*
149-
* @return non-empty-array<string, DriverInterface<ResultFormat>>
150-
*/
151-
private function createDrivers(array $driverSetups, FormatterInterface $formatter, DriverConfiguration $configuration): array
152-
{
153-
if (count($driverSetups) === 0) {
154-
$drivers = ['default' => DriverFactory::create(self::DEFAULT_DRIVER_CONFIG, null, null, $formatter)];
155-
} else {
156-
$drivers = [];
157-
foreach ($driverSetups as $alias => $setup) {
158-
$uri = $setup->getUri();
159-
$auth = $setup->getAuth();
160-
161-
$drivers[$alias] = DriverFactory::create($uri, $configuration, $auth, $formatter);
162-
}
163-
}
164-
165-
/** @var non-empty-array<string, DriverInterface<ResultFormat>> */
166-
return $drivers;
117+
return $this->driverSetups->verifyConnectivity($driver);
167118
}
168119

169120
private function getTsxConfig(?TransactionConfiguration $config): TransactionConfiguration

src/ClientBuilder.php

Lines changed: 41 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use function in_array;
1818
use Laudis\Neo4j\Authentication\Authenticate;
1919
use Laudis\Neo4j\Bolt\BoltConfiguration;
20+
use Laudis\Neo4j\Common\DriverSetupManager;
2021
use Laudis\Neo4j\Common\Uri;
2122
use Laudis\Neo4j\Contracts\AuthenticateInterface;
2223
use Laudis\Neo4j\Contracts\ClientInterface;
@@ -38,43 +39,32 @@
3839
*
3940
* @template T
4041
*
41-
* @psalm-import-type OGMTypes from \Laudis\Neo4j\Formatter\OGMFormatter
42+
* @psalm-import-type OGMTypes from OGMFormatter
4243
*/
4344
final class ClientBuilder
4445
{
4546
public const SUPPORTED_SCHEMES = ['', 'bolt', 'bolt+s', 'bolt+ssc', 'neo4j', 'neo4j+s', 'neo4j+ssc', 'http', 'https'];
4647

47-
/**
48-
* @psalm-readonly
49-
*
50-
* @var array<string, DriverSetup>
51-
*/
52-
private array $driverConfigurations;
5348
/** @psalm-readonly */
5449
private DriverConfiguration $defaultDriverConfig;
5550
/** @psalm-readonly */
5651
private TransactionConfiguration $defaultTransactionConfig;
5752
/** @psalm-readonly */
5853
private SessionConfiguration $defaultSessionConfig;
59-
/** @psalm-readonly */
60-
private ?string $defaultDriver;
61-
/** @psalm-readonly */
62-
private FormatterInterface $formatter;
54+
/** @var DriverSetupManager<T> */
55+
private DriverSetupManager $driverSetups;
6356

6457
/**
6558
* @psalm-mutation-free
6659
*
67-
* @param array<string, DriverSetup> $driverConfigurations
68-
* @param FormatterInterface<T> $formatter
60+
* @param DriverSetupManager<T> $driverSetups
6961
*/
70-
public function __construct(DriverConfiguration $configuration, SessionConfiguration $sessionConfiguration, TransactionConfiguration $transactionConfiguration, FormatterInterface $formatter, array $driverConfigurations, ?string $defaultDriver)
62+
public function __construct(DriverConfiguration $configuration, SessionConfiguration $sessionConfiguration, TransactionConfiguration $transactionConfiguration, DriverSetupManager $driverSetups)
7163
{
72-
$this->driverConfigurations = $driverConfigurations;
7364
$this->defaultDriverConfig = $configuration;
74-
$this->defaultDriver = $defaultDriver;
75-
$this->formatter = $formatter;
7665
$this->defaultSessionConfig = $sessionConfiguration;
7766
$this->defaultTransactionConfig = $transactionConfiguration;
67+
$this->driverSetups = $driverSetups;
7868
}
7969

8070
/**
@@ -90,9 +80,7 @@ public static function create(): ClientBuilder
9080
DriverConfiguration::default(),
9181
SessionConfiguration::default(),
9282
TransactionConfiguration::default(),
93-
SummarizedResultFormatter::create(),
94-
[],
95-
null
83+
new DriverSetupManager(SummarizedResultFormatter::create(), DriverConfiguration::default())
9684
);
9785
}
9886

@@ -101,39 +89,32 @@ public static function create(): ClientBuilder
10189
*
10290
* @return self<T>
10391
*/
104-
public function withDriver(string $alias, string $url, ?AuthenticateInterface $authentication = null): self
92+
public function withDriver(string $alias, string $url, ?AuthenticateInterface $authentication = null, ?int $priority = 0): self
10593
{
10694
$uri = Uri::create($url);
10795

10896
$authentication ??= Authenticate::fromUrl($uri);
10997

110-
return $this->withParsedUrl($alias, $uri, $authentication);
98+
return $this->withParsedUrl($alias, $uri, $authentication, $priority ?? 0);
11199
}
112100

113101
/**
114-
* @psalm-mutation-free
102+
* @psalm-external-mutation-free
115103
*
116104
* @return self<T>
117105
*/
118-
private function withParsedUrl(string $alias, Uri $uri, AuthenticateInterface $authentication): self
106+
private function withParsedUrl(string $alias, Uri $uri, AuthenticateInterface $authentication, int $priority): self
119107
{
120108
$scheme = $uri->getScheme();
121109

122110
if (!in_array($scheme, self::SUPPORTED_SCHEMES, true)) {
123111
throw UnsupportedScheme::make($scheme, self::SUPPORTED_SCHEMES);
124112
}
125113

126-
$setup = new DriverSetup($uri, $authentication);
127-
$configs = array_merge($this->driverConfigurations, [$alias => $setup]);
114+
$tbr = clone $this;
115+
$tbr->driverSetups = $this->driverSetups->withSetup(new DriverSetup($uri, $authentication), $alias, $priority);
128116

129-
return new self(
130-
$this->defaultDriverConfig,
131-
$this->defaultSessionConfig,
132-
$this->defaultTransactionConfig,
133-
$this->formatter,
134-
$configs,
135-
$this->defaultDriver
136-
);
117+
return $tbr;
137118
}
138119

139120
/**
@@ -172,7 +153,7 @@ public function addBoltConnection(string $alias, string $url, BoltConfiguration
172153
$parsedUrl = $parsedUrl->withScheme('bolt'.$postScheme);
173154
}
174155

175-
return $this->withParsedUrl($alias, $parsedUrl, Authenticate::fromUrl($parsedUrl));
156+
return $this->withParsedUrl($alias, $parsedUrl, Authenticate::fromUrl($parsedUrl), 0);
176157
}
177158

178159
/**
@@ -197,16 +178,10 @@ public function addHttpConnection(string $alias, string $url, HttpConfig $config
197178
$uri = $uri->withScheme($scheme === '' ? 'http' : $scheme);
198179
$uri = $uri->withPort($uri->getPort() === 7687 ? 7474 : $uri->getPort());
199180

200-
$self = new self(
201-
$this->defaultDriverConfig->withHttpPsrBindings($bindings),
202-
$this->defaultSessionConfig,
203-
$this->defaultTransactionConfig,
204-
$this->formatter,
205-
$this->driverConfigurations,
206-
$this->defaultDriver
207-
);
181+
$tbr = clone $this;
182+
$tbr->defaultDriverConfig = $this->defaultDriverConfig->withHttpPsrBindings($bindings);
208183

209-
return $self->withParsedUrl($alias, $uri, Authenticate::fromUrl($uri));
184+
return $tbr->withParsedUrl($alias, $uri, Authenticate::fromUrl($uri), 0);
210185
}
211186

212187
/**
@@ -231,14 +206,10 @@ public function setDefaultConnection(string $alias): self
231206
*/
232207
public function withDefaultDriver(string $alias): self
233208
{
234-
return new self(
235-
$this->defaultDriverConfig,
236-
$this->defaultSessionConfig,
237-
$this->defaultTransactionConfig,
238-
$this->formatter,
239-
$this->driverConfigurations,
240-
$alias
241-
);
209+
$tbr = clone $this;
210+
$tbr->driverSetups = $this->driverSetups->withDefault($alias);
211+
212+
return $tbr;
242213
}
243214

244215
/**
@@ -255,9 +226,7 @@ public function withFormatter(FormatterInterface $formatter): self
255226
$this->defaultDriverConfig,
256227
$this->defaultSessionConfig,
257228
$this->defaultTransactionConfig,
258-
$formatter,
259-
$this->driverConfigurations,
260-
$this->defaultDriver
229+
$this->driverSetups->withFormatter($formatter)
261230
);
262231
}
263232

@@ -269,12 +238,9 @@ public function withFormatter(FormatterInterface $formatter): self
269238
public function build(): ClientInterface
270239
{
271240
return new Client(
272-
$this->driverConfigurations,
273-
$this->defaultDriverConfig,
241+
$this->driverSetups,
274242
$this->defaultSessionConfig,
275243
$this->defaultTransactionConfig,
276-
$this->formatter,
277-
$this->defaultDriver
278244
);
279245
}
280246

@@ -288,14 +254,10 @@ public function withHttpPsrBindings(HttpPsrBindings $bindings): self
288254
{
289255
$config = $this->defaultDriverConfig->withHttpPsrBindings($bindings);
290256

291-
return new self(
292-
$config,
293-
$this->defaultSessionConfig,
294-
$this->defaultTransactionConfig,
295-
$this->formatter,
296-
$this->driverConfigurations,
297-
$this->defaultDriver
298-
);
257+
$tbr = clone $this;
258+
$tbr->defaultDriverConfig = $config;
259+
260+
return $tbr;
299261
}
300262

301263
/**
@@ -305,14 +267,10 @@ public function withHttpPsrBindings(HttpPsrBindings $bindings): self
305267
*/
306268
public function withDefaultDriverConfiguration(DriverConfiguration $config): self
307269
{
308-
return new self(
309-
$config,
310-
$this->defaultSessionConfig,
311-
$this->defaultTransactionConfig,
312-
$this->formatter,
313-
$this->driverConfigurations,
314-
$this->defaultDriver
315-
);
270+
$tbr = clone $this;
271+
$tbr->defaultDriverConfig = $config;
272+
273+
return $tbr;
316274
}
317275

318276
/**
@@ -322,14 +280,10 @@ public function withDefaultDriverConfiguration(DriverConfiguration $config): sel
322280
*/
323281
public function withDefaultSessionConfiguration(SessionConfiguration $config): self
324282
{
325-
return new self(
326-
$this->defaultDriverConfig,
327-
$config,
328-
$this->defaultTransactionConfig,
329-
$this->formatter,
330-
$this->driverConfigurations,
331-
$this->defaultDriver
332-
);
283+
$tbr = clone $this;
284+
$tbr->defaultSessionConfig = $config;
285+
286+
return $tbr;
333287
}
334288

335289
/**
@@ -339,13 +293,9 @@ public function withDefaultSessionConfiguration(SessionConfiguration $config): s
339293
*/
340294
public function withDefaultTransactionConfiguration(TransactionConfiguration $config): self
341295
{
342-
return new self(
343-
$this->defaultDriverConfig,
344-
$this->defaultSessionConfig,
345-
$config,
346-
$this->formatter,
347-
$this->driverConfigurations,
348-
$this->defaultDriver
349-
);
296+
$tbr = clone $this;
297+
$tbr->defaultTransactionConfig = $config;
298+
299+
return $tbr;
350300
}
351301
}

0 commit comments

Comments
 (0)