17
17
use function in_array ;
18
18
use Laudis \Neo4j \Authentication \Authenticate ;
19
19
use Laudis \Neo4j \Bolt \BoltConfiguration ;
20
+ use Laudis \Neo4j \Common \DriverSetupManager ;
20
21
use Laudis \Neo4j \Common \Uri ;
21
22
use Laudis \Neo4j \Contracts \AuthenticateInterface ;
22
23
use Laudis \Neo4j \Contracts \ClientInterface ;
38
39
*
39
40
* @template T
40
41
*
41
- * @psalm-import-type OGMTypes from \Laudis\Neo4j\Formatter\ OGMFormatter
42
+ * @psalm-import-type OGMTypes from OGMFormatter
42
43
*/
43
44
final class ClientBuilder
44
45
{
45
46
public const SUPPORTED_SCHEMES = ['' , 'bolt ' , 'bolt+s ' , 'bolt+ssc ' , 'neo4j ' , 'neo4j+s ' , 'neo4j+ssc ' , 'http ' , 'https ' ];
46
47
47
- /**
48
- * @psalm-readonly
49
- *
50
- * @var array<string, DriverSetup>
51
- */
52
- private array $ driverConfigurations ;
53
48
/** @psalm-readonly */
54
49
private DriverConfiguration $ defaultDriverConfig ;
55
50
/** @psalm-readonly */
56
51
private TransactionConfiguration $ defaultTransactionConfig ;
57
52
/** @psalm-readonly */
58
53
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 ;
63
56
64
57
/**
65
58
* @psalm-mutation-free
66
59
*
67
- * @param array<string, DriverSetup> $driverConfigurations
68
- * @param FormatterInterface<T> $formatter
60
+ * @param DriverSetupManager<T> $driverSetups
69
61
*/
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 )
71
63
{
72
- $ this ->driverConfigurations = $ driverConfigurations ;
73
64
$ this ->defaultDriverConfig = $ configuration ;
74
- $ this ->defaultDriver = $ defaultDriver ;
75
- $ this ->formatter = $ formatter ;
76
65
$ this ->defaultSessionConfig = $ sessionConfiguration ;
77
66
$ this ->defaultTransactionConfig = $ transactionConfiguration ;
67
+ $ this ->driverSetups = $ driverSetups ;
78
68
}
79
69
80
70
/**
@@ -90,9 +80,7 @@ public static function create(): ClientBuilder
90
80
DriverConfiguration::default (),
91
81
SessionConfiguration::default (),
92
82
TransactionConfiguration::default (),
93
- SummarizedResultFormatter::create (),
94
- [],
95
- null
83
+ new DriverSetupManager (SummarizedResultFormatter::create (), DriverConfiguration::default ())
96
84
);
97
85
}
98
86
@@ -101,39 +89,32 @@ public static function create(): ClientBuilder
101
89
*
102
90
* @return self<T>
103
91
*/
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
105
93
{
106
94
$ uri = Uri::create ($ url );
107
95
108
96
$ authentication ??= Authenticate::fromUrl ($ uri );
109
97
110
- return $ this ->withParsedUrl ($ alias , $ uri , $ authentication );
98
+ return $ this ->withParsedUrl ($ alias , $ uri , $ authentication, $ priority ?? 0 );
111
99
}
112
100
113
101
/**
114
- * @psalm-mutation-free
102
+ * @psalm-external- mutation-free
115
103
*
116
104
* @return self<T>
117
105
*/
118
- private function withParsedUrl (string $ alias , Uri $ uri , AuthenticateInterface $ authentication ): self
106
+ private function withParsedUrl (string $ alias , Uri $ uri , AuthenticateInterface $ authentication, int $ priority ): self
119
107
{
120
108
$ scheme = $ uri ->getScheme ();
121
109
122
110
if (!in_array ($ scheme , self ::SUPPORTED_SCHEMES , true )) {
123
111
throw UnsupportedScheme::make ($ scheme , self ::SUPPORTED_SCHEMES );
124
112
}
125
113
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 );
128
116
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 ;
137
118
}
138
119
139
120
/**
@@ -172,7 +153,7 @@ public function addBoltConnection(string $alias, string $url, BoltConfiguration
172
153
$ parsedUrl = $ parsedUrl ->withScheme ('bolt ' .$ postScheme );
173
154
}
174
155
175
- return $ this ->withParsedUrl ($ alias , $ parsedUrl , Authenticate::fromUrl ($ parsedUrl ));
156
+ return $ this ->withParsedUrl ($ alias , $ parsedUrl , Authenticate::fromUrl ($ parsedUrl ), 0 );
176
157
}
177
158
178
159
/**
@@ -197,16 +178,10 @@ public function addHttpConnection(string $alias, string $url, HttpConfig $config
197
178
$ uri = $ uri ->withScheme ($ scheme === '' ? 'http ' : $ scheme );
198
179
$ uri = $ uri ->withPort ($ uri ->getPort () === 7687 ? 7474 : $ uri ->getPort ());
199
180
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 );
208
183
209
- return $ self ->withParsedUrl ($ alias , $ uri , Authenticate::fromUrl ($ uri ));
184
+ return $ tbr ->withParsedUrl ($ alias , $ uri , Authenticate::fromUrl ($ uri ), 0 );
210
185
}
211
186
212
187
/**
@@ -231,14 +206,10 @@ public function setDefaultConnection(string $alias): self
231
206
*/
232
207
public function withDefaultDriver (string $ alias ): self
233
208
{
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 ;
242
213
}
243
214
244
215
/**
@@ -255,9 +226,7 @@ public function withFormatter(FormatterInterface $formatter): self
255
226
$ this ->defaultDriverConfig ,
256
227
$ this ->defaultSessionConfig ,
257
228
$ this ->defaultTransactionConfig ,
258
- $ formatter ,
259
- $ this ->driverConfigurations ,
260
- $ this ->defaultDriver
229
+ $ this ->driverSetups ->withFormatter ($ formatter )
261
230
);
262
231
}
263
232
@@ -269,12 +238,9 @@ public function withFormatter(FormatterInterface $formatter): self
269
238
public function build (): ClientInterface
270
239
{
271
240
return new Client (
272
- $ this ->driverConfigurations ,
273
- $ this ->defaultDriverConfig ,
241
+ $ this ->driverSetups ,
274
242
$ this ->defaultSessionConfig ,
275
243
$ this ->defaultTransactionConfig ,
276
- $ this ->formatter ,
277
- $ this ->defaultDriver
278
244
);
279
245
}
280
246
@@ -288,14 +254,10 @@ public function withHttpPsrBindings(HttpPsrBindings $bindings): self
288
254
{
289
255
$ config = $ this ->defaultDriverConfig ->withHttpPsrBindings ($ bindings );
290
256
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 ;
299
261
}
300
262
301
263
/**
@@ -305,14 +267,10 @@ public function withHttpPsrBindings(HttpPsrBindings $bindings): self
305
267
*/
306
268
public function withDefaultDriverConfiguration (DriverConfiguration $ config ): self
307
269
{
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 ;
316
274
}
317
275
318
276
/**
@@ -322,14 +280,10 @@ public function withDefaultDriverConfiguration(DriverConfiguration $config): sel
322
280
*/
323
281
public function withDefaultSessionConfiguration (SessionConfiguration $ config ): self
324
282
{
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 ;
333
287
}
334
288
335
289
/**
@@ -339,13 +293,9 @@ public function withDefaultSessionConfiguration(SessionConfiguration $config): s
339
293
*/
340
294
public function withDefaultTransactionConfiguration (TransactionConfiguration $ config ): self
341
295
{
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 ;
350
300
}
351
301
}
0 commit comments