Skip to content

Commit a6c420a

Browse files
committed
used driver setup manager in client builder
1 parent 4690cf5 commit a6c420a

File tree

2 files changed

+83
-97
lines changed

2 files changed

+83
-97
lines changed

src/ClientBuilder.php

Lines changed: 42 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;
@@ -28,6 +29,7 @@
2829
use Laudis\Neo4j\Databags\SummarizedResult;
2930
use Laudis\Neo4j\Databags\TransactionConfiguration;
3031
use Laudis\Neo4j\Exception\UnsupportedScheme;
32+
use Laudis\Neo4j\Formatter\OGMFormatter;
3133
use Laudis\Neo4j\Formatter\SummarizedResultFormatter;
3234
use Laudis\Neo4j\Http\HttpConfig;
3335
use Laudis\Neo4j\Types\CypherMap;
@@ -37,43 +39,32 @@
3739
*
3840
* @template T
3941
*
40-
* @psalm-import-type OGMTypes from \Laudis\Neo4j\Formatter\OGMFormatter
42+
* @psalm-import-type OGMTypes from OGMFormatter
4143
*/
4244
final class ClientBuilder
4345
{
4446
public const SUPPORTED_SCHEMES = ['', 'bolt', 'bolt+s', 'bolt+ssc', 'neo4j', 'neo4j+s', 'neo4j+ssc', 'http', 'https'];
4547

46-
/**
47-
* @psalm-readonly
48-
*
49-
* @var array<string, DriverSetup>
50-
*/
51-
private array $driverConfigurations;
5248
/** @psalm-readonly */
5349
private DriverConfiguration $defaultDriverConfig;
5450
/** @psalm-readonly */
5551
private TransactionConfiguration $defaultTransactionConfig;
5652
/** @psalm-readonly */
5753
private SessionConfiguration $defaultSessionConfig;
58-
/** @psalm-readonly */
59-
private ?string $defaultDriver;
60-
/** @psalm-readonly */
61-
private FormatterInterface $formatter;
54+
/** @var DriverSetupManager<T> */
55+
private DriverSetupManager $driverSetups;
6256

6357
/**
6458
* @psalm-mutation-free
6559
*
66-
* @param array<string, DriverSetup> $driverConfigurations
67-
* @param FormatterInterface<T> $formatter
60+
* @param DriverSetupManager<T> $driverSetups
6861
*/
69-
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)
7063
{
71-
$this->driverConfigurations = $driverConfigurations;
7264
$this->defaultDriverConfig = $configuration;
73-
$this->defaultDriver = $defaultDriver;
74-
$this->formatter = $formatter;
7565
$this->defaultSessionConfig = $sessionConfiguration;
7666
$this->defaultTransactionConfig = $transactionConfiguration;
67+
$this->driverSetups = $driverSetups;
7768
}
7869

7970
/**
@@ -89,9 +80,7 @@ public static function create(): ClientBuilder
8980
DriverConfiguration::default(),
9081
SessionConfiguration::default(),
9182
TransactionConfiguration::default(),
92-
SummarizedResultFormatter::create(),
93-
[],
94-
null
83+
new DriverSetupManager(SummarizedResultFormatter::create(), DriverConfiguration::default())
9584
);
9685
}
9786

@@ -100,39 +89,32 @@ public static function create(): ClientBuilder
10089
*
10190
* @return self<T>
10291
*/
103-
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
10493
{
10594
$uri = Uri::create($url);
10695

10796
$authentication ??= Authenticate::fromUrl($uri);
10897

109-
return $this->withParsedUrl($alias, $uri, $authentication);
98+
return $this->withParsedUrl($alias, $uri, $authentication, $priority ?? 0);
11099
}
111100

112101
/**
113-
* @psalm-mutation-free
102+
* @psalm-external-mutation-free
114103
*
115104
* @return self<T>
116105
*/
117-
private function withParsedUrl(string $alias, Uri $uri, AuthenticateInterface $authentication): self
106+
private function withParsedUrl(string $alias, Uri $uri, AuthenticateInterface $authentication, int $priority): self
118107
{
119108
$scheme = $uri->getScheme();
120109

121110
if (!in_array($scheme, self::SUPPORTED_SCHEMES, true)) {
122111
throw UnsupportedScheme::make($scheme, self::SUPPORTED_SCHEMES);
123112
}
124113

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

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

138120
/**
@@ -171,7 +153,7 @@ public function addBoltConnection(string $alias, string $url, BoltConfiguration
171153
$parsedUrl = $parsedUrl->withScheme('bolt'.$postScheme);
172154
}
173155

174-
return $this->withParsedUrl($alias, $parsedUrl, Authenticate::fromUrl($parsedUrl));
156+
return $this->withParsedUrl($alias, $parsedUrl, Authenticate::fromUrl($parsedUrl), 0);
175157
}
176158

177159
/**
@@ -196,16 +178,10 @@ public function addHttpConnection(string $alias, string $url, HttpConfig $config
196178
$uri = $uri->withScheme($scheme === '' ? 'http' : $scheme);
197179
$uri = $uri->withPort($uri->getPort() === 7687 ? 7474 : $uri->getPort());
198180

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

208-
return $self->withParsedUrl($alias, $uri, Authenticate::fromUrl($uri));
184+
return $tbr->withParsedUrl($alias, $uri, Authenticate::fromUrl($uri), 0);
209185
}
210186

211187
/**
@@ -230,14 +206,10 @@ public function setDefaultConnection(string $alias): self
230206
*/
231207
public function withDefaultDriver(string $alias): self
232208
{
233-
return new self(
234-
$this->defaultDriverConfig,
235-
$this->defaultSessionConfig,
236-
$this->defaultTransactionConfig,
237-
$this->formatter,
238-
$this->driverConfigurations,
239-
$alias
240-
);
209+
$tbr = clone $this;
210+
$tbr->driverSetups = $this->driverSetups->withDefault($alias);
211+
212+
return $tbr;
241213
}
242214

243215
/**
@@ -254,9 +226,7 @@ public function withFormatter(FormatterInterface $formatter): self
254226
$this->defaultDriverConfig,
255227
$this->defaultSessionConfig,
256228
$this->defaultTransactionConfig,
257-
$formatter,
258-
$this->driverConfigurations,
259-
$this->defaultDriver
229+
$this->driverSetups->withFormatter($formatter)
260230
);
261231
}
262232

@@ -268,12 +238,9 @@ public function withFormatter(FormatterInterface $formatter): self
268238
public function build(): ClientInterface
269239
{
270240
return new Client(
271-
$this->driverConfigurations,
272-
$this->defaultDriverConfig,
241+
$this->driverSetups,
273242
$this->defaultSessionConfig,
274243
$this->defaultTransactionConfig,
275-
$this->formatter,
276-
$this->defaultDriver
277244
);
278245
}
279246

@@ -287,14 +254,10 @@ public function withHttpPsrBindings(HttpPsrBindings $bindings): self
287254
{
288255
$config = $this->defaultDriverConfig->withHttpPsrBindings($bindings);
289256

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

300263
/**
@@ -304,14 +267,10 @@ public function withHttpPsrBindings(HttpPsrBindings $bindings): self
304267
*/
305268
public function withDefaultDriverConfiguration(DriverConfiguration $config): self
306269
{
307-
return new self(
308-
$config,
309-
$this->defaultSessionConfig,
310-
$this->defaultTransactionConfig,
311-
$this->formatter,
312-
$this->driverConfigurations,
313-
$this->defaultDriver
314-
);
270+
$tbr = clone $this;
271+
$tbr->defaultDriverConfig = $config;
272+
273+
return $tbr;
315274
}
316275

317276
/**
@@ -321,14 +280,10 @@ public function withDefaultDriverConfiguration(DriverConfiguration $config): sel
321280
*/
322281
public function withDefaultSessionConfiguration(SessionConfiguration $config): self
323282
{
324-
return new self(
325-
$this->defaultDriverConfig,
326-
$config,
327-
$this->defaultTransactionConfig,
328-
$this->formatter,
329-
$this->driverConfigurations,
330-
$this->defaultDriver
331-
);
283+
$tbr = clone $this;
284+
$tbr->defaultSessionConfig = $config;
285+
286+
return $tbr;
332287
}
333288

334289
/**
@@ -338,13 +293,9 @@ public function withDefaultSessionConfiguration(SessionConfiguration $config): s
338293
*/
339294
public function withDefaultTransactionConfiguration(TransactionConfiguration $config): self
340295
{
341-
return new self(
342-
$this->defaultDriverConfig,
343-
$this->defaultSessionConfig,
344-
$config,
345-
$this->formatter,
346-
$this->driverConfigurations,
347-
$this->defaultDriver
348-
);
296+
$tbr = clone $this;
297+
$tbr->defaultTransactionConfig = $config;
298+
299+
return $tbr;
349300
}
350301
}

src/Common/DriverSetupManager.php

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,33 @@ class DriverSetupManager implements Countable
4242
private DriverConfiguration $configuration;
4343

4444
/**
45+
* @psalm-mutation-free
46+
*
4547
* @param FormatterInterface<ResultFormat> $formatter
46-
* @param DriverConfiguration $configuration
4748
*/
4849
public function __construct(FormatterInterface $formatter, DriverConfiguration $configuration)
4950
{
5051
$this->formatter = $formatter;
5152
$this->configuration = $configuration;
5253
}
5354

54-
public function addSetup(DriverSetup $setup, ?string $alias = null, ?int $priority = 0): void
55+
/**
56+
* @psalm-mutation-free
57+
*/
58+
public function withSetup(DriverSetup $setup, ?string $alias = null, ?int $priority = 0): self
5559
{
5660
$alias ??= $this->decideAlias($alias);
5761

58-
$this->driverSetups[$alias] ??= new SplPriorityQueue();
59-
$this->driverSetups[$alias]->insert($setup, $priority ?? 0);
62+
$setups = $this->driverSetups;
63+
64+
$setups[$alias] ??= new SplPriorityQueue();
65+
/** @psalm-suppress ImpureMethodCall */
66+
$setups[$alias]->insert($setup, $priority ?? 0);
67+
68+
$tbr = clone $this;
69+
$tbr->driverSetups = $setups;
70+
71+
return $tbr;
6072
}
6173

6274
/**
@@ -118,13 +130,36 @@ private function decideAlias(?string $alias): string
118130
return $alias ?? $this->default ?? array_key_first($this->driverSetups) ?? 'default';
119131
}
120132

121-
public function setDefault(string $default): void
133+
/**
134+
* @psalm-mutation-free
135+
*/
136+
public function withDefault(string $default): self
122137
{
123-
$this->default = $default;
138+
$tbr = clone $this;
139+
$tbr->default = $default;
140+
141+
return $tbr;
124142
}
125143

126144
public function count(): int
127145
{
128146
return array_reduce($this->driverSetups, static fn (int $acc, SplPriorityQueue $x) => $acc + $x->count(), 0);
129147
}
148+
149+
/**
150+
* @template U
151+
*
152+
* @param FormatterInterface<U>
153+
*
154+
* return self<U>
155+
*
156+
* @psalm-mutation-free
157+
*/
158+
public function withFormatter(FormatterInterface $formatter): self
159+
{
160+
$tbr = clone $this;
161+
$tbr->formatter = $formatter;
162+
163+
return $tbr;
164+
}
130165
}

0 commit comments

Comments
 (0)