Skip to content

Commit 9b1a322

Browse files
committed
handle iterable parameters for Lookup, Loader, Conditional Loader,
don't do a fetchAll, the user should CONCAT if there are multiple results
1 parent 046c602 commit 9b1a322

File tree

5 files changed

+712
-343
lines changed

5 files changed

+712
-343
lines changed

src/Builder/AlternativeLoader.php

Lines changed: 190 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ final class AlternativeLoader implements StepBuilderInterface
1111
{
1212
/** @var array<array-key, array{value: Node\Expr, type: string}> */
1313
private array $parameters = [];
14+
/** @var array<array-key, array{value: Node\Expr, type: string}> */
15+
private array $parametersLists = [];
1416

1517
public function __construct(private readonly Node\Expr $query)
1618
{
@@ -101,6 +103,76 @@ public function addBinaryParam(int|string $key, Node\Expr $param): self
101103
return $this;
102104
}
103105

106+
public function addStringParamList(int|string $key, Node\Expr $param): StepBuilderInterface
107+
{
108+
$this->parametersLists[$key] = [
109+
'value' => $param,
110+
'type' => 'string',
111+
];
112+
113+
return $this;
114+
}
115+
116+
public function addIntegerParamList(int|string $key, Node\Expr $param): StepBuilderInterface
117+
{
118+
$this->parametersLists[$key] = [
119+
'value' => $param,
120+
'type' => 'integer',
121+
];
122+
123+
return $this;
124+
}
125+
126+
public function addBooleanParamList(int|string $key, Node\Expr $param): StepBuilderInterface
127+
{
128+
$this->parametersLists[$key] = [
129+
'value' => $param,
130+
'type' => 'boolean',
131+
];
132+
133+
return $this;
134+
}
135+
136+
public function addDateParamList(int|string $key, Node\Expr $param): self
137+
{
138+
$this->parametersLists[$key] = [
139+
'value' => $param,
140+
'type' => 'date',
141+
];
142+
143+
return $this;
144+
}
145+
146+
public function addDateTimeParamList(int|string $key, Node\Expr $param): self
147+
{
148+
$this->parametersLists[$key] = [
149+
'value' => $param,
150+
'type' => 'datetime',
151+
];
152+
153+
return $this;
154+
}
155+
156+
public function addJSONParamList(int|string $key, Node\Expr $param): self
157+
{
158+
$this->parametersLists[$key] = [
159+
'value' => $param,
160+
'type' => 'json',
161+
];
162+
163+
return $this;
164+
}
165+
166+
public function addBinaryParamList(int|string $key, Node\Expr $param): self
167+
{
168+
$this->parametersLists[$key] = [
169+
'value' => $param,
170+
'type' => 'binary',
171+
];
172+
173+
return $this;
174+
}
175+
104176
public function getNode(): Node
105177
{
106178
return new Node\Stmt\Expression(
@@ -126,7 +198,7 @@ public function getNode(): Node
126198
)
127199
)
128200
),
129-
...$this->compileParameters(),
201+
...$this->getParameters(),
130202
new Node\Stmt\Expression(
131203
expr: new Node\Expr\MethodCall(
132204
var: new Node\Expr\Variable('statement'),
@@ -147,115 +219,135 @@ public function getNode(): Node
147219
);
148220
}
149221

150-
public function compileParameters(): iterable
222+
public function getParameters(): iterable
151223
{
152224
foreach ($this->parameters as $key => $parameter) {
153-
yield match ($parameter['type']) {
154-
'datetime' => new Node\Stmt\Expression(
155-
new Node\Expr\MethodCall(
156-
var: new Node\Expr\Variable('statement'),
157-
name: new Node\Identifier('bindValue'),
158-
args: [
225+
yield $this->compileParameter($key, $parameter);
226+
}
227+
228+
foreach ($this->parametersLists as $key => $parameter) {
229+
yield new Node\Stmt\Foreach_(
230+
expr: $parameter['value'],
231+
valueVar: new Node\Expr\Variable('value'),
232+
subNodes: [
233+
'keyVar' => new Node\Expr\Variable('key'),
234+
'stmts' => [
235+
$this->compileParameter(
159236
new Node\Arg(
160-
\is_string($key) ? new Node\Scalar\Encapsed(
161-
[
162-
new Node\Scalar\EncapsedStringPart(':'),
163-
new Node\Scalar\EncapsedStringPart($key),
164-
]
165-
) : new Node\Scalar\LNumber($key)
237+
new Node\Expr\BinaryOp\Concat(
238+
new Node\Scalar\String_($key.'_'),
239+
new Node\Expr\Variable('key'),
240+
)
166241
),
167-
new Node\Arg(
168-
value: new Node\Expr\MethodCall(
169-
var: $parameter['value'],
170-
name: new Node\Name('format'),
171-
args: [
172-
new Node\Arg(
173-
value: new Node\Scalar\String_('YYYY-MM-DD HH:MI:SS')
174-
),
175-
],
176-
),
242+
[
243+
'type' => $parameter['type'],
244+
'value' => new Node\Expr\Variable('value'),
245+
]
246+
),
247+
],
248+
]
249+
);
250+
}
251+
}
252+
253+
public function compileParameter(int|string|Node\Arg $key, array $parameter): Node\Stmt\Expression
254+
{
255+
return match ($parameter['type']) {
256+
'datetime' => new Node\Stmt\Expression(
257+
new Node\Expr\MethodCall(
258+
var: new Node\Expr\Variable('statement'),
259+
name: new Node\Identifier('bindValue'),
260+
args: [
261+
$this->compileParameterKey($key),
262+
new Node\Arg(
263+
value: new Node\Expr\MethodCall(
264+
var: $parameter['value'],
265+
name: new Node\Name('format'),
266+
args: [
267+
new Node\Arg(
268+
value: new Node\Scalar\String_('YYYY-MM-DD HH:MI:SS')
269+
),
270+
],
177271
),
178-
$this->compileParameterType($parameter),
179-
],
180-
),
272+
),
273+
$this->compileParameterType($parameter),
274+
],
181275
),
182-
'date' => new Node\Stmt\Expression(
183-
new Node\Expr\MethodCall(
184-
var: new Node\Expr\Variable('statement'),
185-
name: new Node\Identifier('bindValue'),
186-
args: [
187-
new Node\Arg(
188-
\is_string($key) ? new Node\Scalar\Encapsed(
189-
[
190-
new Node\Scalar\EncapsedStringPart(':'),
191-
new Node\Scalar\EncapsedStringPart($key),
192-
]
193-
) : new Node\Scalar\LNumber($key)
194-
),
195-
new Node\Arg(
196-
value: new Node\Expr\MethodCall(
197-
var: $parameter['value'],
198-
name: new Node\Name('format'),
199-
args: [
200-
new Node\Arg(
201-
value: new Node\Scalar\String_('YYYY-MM-DD')
202-
),
203-
],
204-
),
276+
),
277+
'date' => new Node\Stmt\Expression(
278+
new Node\Expr\MethodCall(
279+
var: new Node\Expr\Variable('statement'),
280+
name: new Node\Identifier('bindValue'),
281+
args: [
282+
$this->compileParameterKey($key),
283+
new Node\Arg(
284+
value: new Node\Expr\MethodCall(
285+
var: $parameter['value'],
286+
name: new Node\Name('format'),
287+
args: [
288+
new Node\Arg(
289+
value: new Node\Scalar\String_('YYYY-MM-DD')
290+
),
291+
],
205292
),
206-
$this->compileParameterType($parameter),
207-
],
208-
),
293+
),
294+
$this->compileParameterType($parameter),
295+
],
209296
),
210-
'json' => new Node\Stmt\Expression(
211-
new Node\Expr\MethodCall(
212-
var: new Node\Expr\Variable('statement'),
213-
name: new Node\Identifier('bindValue'),
214-
args: [
215-
new Node\Arg(
216-
\is_string($key) ? new Node\Scalar\Encapsed(
217-
[
218-
new Node\Scalar\EncapsedStringPart(':'),
219-
new Node\Scalar\EncapsedStringPart($key),
220-
]
221-
) : new Node\Scalar\LNumber($key)
222-
),
223-
new Node\Arg(
224-
new Node\Expr\FuncCall(
225-
name: new Node\Name('json_encode'),
226-
args: [
227-
new Node\Arg(
228-
value: $parameter['value']
229-
),
230-
],
231-
),
297+
),
298+
'json' => new Node\Stmt\Expression(
299+
new Node\Expr\MethodCall(
300+
var: new Node\Expr\Variable('statement'),
301+
name: new Node\Identifier('bindValue'),
302+
args: [
303+
$this->compileParameterKey($key),
304+
new Node\Arg(
305+
new Node\Expr\FuncCall(
306+
name: new Node\Name('json_encode'),
307+
args: [
308+
new Node\Arg(
309+
value: $parameter['value']
310+
),
311+
],
232312
),
233-
$this->compileParameterType($parameter),
234-
],
235-
),
313+
),
314+
$this->compileParameterType($parameter),
315+
],
236316
),
237-
default => new Node\Stmt\Expression(
238-
new Node\Expr\MethodCall(
239-
var: new Node\Expr\Variable('statement'),
240-
name: new Node\Identifier('bindValue'),
241-
args: [
242-
new Node\Arg(
243-
\is_string($key) ? new Node\Scalar\Encapsed(
244-
[
245-
new Node\Scalar\EncapsedStringPart(':'),
246-
new Node\Scalar\EncapsedStringPart($key),
247-
]
248-
) : new Node\Scalar\LNumber($key)
249-
),
250-
new Node\Arg(
251-
$parameter['value']
252-
),
253-
$this->compileParameterType($parameter),
254-
],
255-
),
317+
),
318+
default => new Node\Stmt\Expression(
319+
new Node\Expr\MethodCall(
320+
var: new Node\Expr\Variable('statement'),
321+
name: new Node\Identifier('bindValue'),
322+
args: [
323+
$this->compileParameterKey($key),
324+
new Node\Arg(
325+
$parameter['value']
326+
),
327+
$this->compileParameterType($parameter),
328+
],
256329
),
257-
};
330+
),
331+
};
332+
}
333+
334+
private function compileParameterKey(int|string|Node\Arg $key): Node\Arg
335+
{
336+
if (\is_string($key)) {
337+
return new Node\Arg(
338+
new Node\Scalar\Encapsed([
339+
new Node\Scalar\EncapsedStringPart(':'),
340+
new Node\Scalar\EncapsedStringPart($key),
341+
])
342+
);
258343
}
344+
if ($key instanceof Node\Arg) {
345+
return $key;
346+
}
347+
348+
return new Node\Arg(
349+
new Node\Scalar\LNumber($key)
350+
);
259351
}
260352

261353
private function compileParameterType(array $parameter): Node\Arg

0 commit comments

Comments
 (0)