Skip to content

Commit edebecd

Browse files
committed
Updated the loader builder with new types
1 parent 63e7a85 commit edebecd

File tree

1 file changed

+151
-23
lines changed

1 file changed

+151
-23
lines changed

src/Builder/Loader.php

Lines changed: 151 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
namespace Kiboko\Plugin\SQL\Builder;
44

55
use Kiboko\Contract\Configurator\StepBuilderInterface;
6-
use Kiboko\Plugin\SQL\Builder\DTO\Parameter;
76
use PhpParser\Node;
7+
use function Kiboko\Component\SatelliteToolbox\AST\variable;
88

99
final class Loader implements StepBuilderInterface
1010
{
@@ -248,30 +248,153 @@ public function compileAfterQueries(): Node\Expr
248248
public function compileParameters(): iterable
249249
{
250250
foreach ($this->parameters as $key => $parameter) {
251-
yield new Node\Stmt\Expression(
252-
new Node\Expr\MethodCall(
253-
var: new Node\Expr\Variable('statement'),
254-
name: new Node\Identifier('bindParam'),
255-
args: array_filter([
256-
new Node\Arg(
257-
is_string($key) ? new Node\Scalar\Encapsed(
258-
[
259-
new Node\Scalar\EncapsedStringPart(':'),
260-
new Node\Scalar\EncapsedStringPart($key)
261-
]
262-
) : new Node\Scalar\LNumber($key)
251+
yield match ($parameter['type']) {
252+
'datetime' => [
253+
new Node\Stmt\Expression(
254+
expr: new Node\Expr\Assign(
255+
var: new Node\Expr\Variable('datetime'),
256+
expr: new Node\Expr\FuncCall(
257+
name: new Node\Name('strtotime'),
258+
args: [
259+
new Node\Arg(
260+
value: new Node\Expr\MethodCall(
261+
var: $parameter['value'],
262+
name: new Node\Name('format'),
263+
args: [
264+
new Node\Arg(
265+
value: new Node\Scalar\String_('YYYY-MM-DD HH:MI:SS')
266+
),
267+
],
268+
),
269+
),
270+
],
271+
),
263272
),
264-
new Node\Arg(
265-
$parameter["value"]
273+
),
274+
new Node\Stmt\Expression(
275+
new Node\Expr\MethodCall(
276+
var: new Node\Expr\Variable('statement'),
277+
name: new Node\Identifier('bindParam'),
278+
args: array_filter([
279+
new Node\Arg(
280+
is_string($key) ? new Node\Scalar\Encapsed(
281+
[
282+
new Node\Scalar\EncapsedStringPart(':'),
283+
new Node\Scalar\EncapsedStringPart($key)
284+
]
285+
) : new Node\Scalar\LNumber($key)
286+
),
287+
new Node\Arg(
288+
new Node\Expr\Variable('datetime')
289+
),
290+
$this->compileParameterType($parameter)
291+
]),
266292
),
267-
$this->compileParameterType($parameter)
268-
]),
269-
)
270-
);
293+
),
294+
],
295+
'date' => [
296+
new Node\Stmt\Expression(
297+
expr: new Node\Expr\Assign(
298+
var: new Node\Expr\Variable('date'),
299+
expr: new Node\Expr\FuncCall(
300+
name: new Node\Name('strtotime'),
301+
args: [
302+
new Node\Arg(
303+
value: new Node\Expr\MethodCall(
304+
var: $parameter['value'],
305+
name: new Node\Name('format'),
306+
args: [
307+
new Node\Arg(
308+
value: new Node\Scalar\String_('YYYY-MM-DD')
309+
),
310+
],
311+
),
312+
),
313+
],
314+
),
315+
),
316+
),
317+
new Node\Stmt\Expression(
318+
new Node\Expr\MethodCall(
319+
var: new Node\Expr\Variable('statement'),
320+
name: new Node\Identifier('bindParam'),
321+
args: array_filter([
322+
new Node\Arg(
323+
is_string($key) ? new Node\Scalar\Encapsed(
324+
[
325+
new Node\Scalar\EncapsedStringPart(':'),
326+
new Node\Scalar\EncapsedStringPart($key)
327+
]
328+
) : new Node\Scalar\LNumber($key)
329+
),
330+
new Node\Arg(
331+
new Node\Expr\Variable('date')
332+
),
333+
$this->compileParameterType($parameter)
334+
]),
335+
),
336+
),
337+
],
338+
'json' => [
339+
new Node\Stmt\Expression(
340+
expr: new Node\Expr\Assign(
341+
var: new Node\Expr\Variable('json'),
342+
expr: new Node\Expr\FuncCall(
343+
name: new Node\Name('json_encode'),
344+
args: [
345+
new Node\Arg(
346+
value: $parameter['value']
347+
)
348+
],
349+
),
350+
),
351+
),
352+
new Node\Stmt\Expression(
353+
new Node\Expr\MethodCall(
354+
var: new Node\Expr\Variable('statement'),
355+
name: new Node\Identifier('bindParam'),
356+
args: array_filter([
357+
new Node\Arg(
358+
is_string($key) ? new Node\Scalar\Encapsed(
359+
[
360+
new Node\Scalar\EncapsedStringPart(':'),
361+
new Node\Scalar\EncapsedStringPart($key)
362+
]
363+
) : new Node\Scalar\LNumber($key)
364+
),
365+
new Node\Arg(
366+
new Node\Expr\Variable('json')
367+
),
368+
$this->compileParameterType($parameter)
369+
]),
370+
),
371+
),
372+
],
373+
default => new Node\Stmt\Expression(
374+
new Node\Expr\MethodCall(
375+
var: new Node\Expr\Variable('statement'),
376+
name: new Node\Identifier('bindParam'),
377+
args: array_filter([
378+
new Node\Arg(
379+
is_string($key) ? new Node\Scalar\Encapsed(
380+
[
381+
new Node\Scalar\EncapsedStringPart(':'),
382+
new Node\Scalar\EncapsedStringPart($key)
383+
]
384+
) : new Node\Scalar\LNumber($key)
385+
),
386+
new Node\Arg(
387+
$parameter["value"]
388+
),
389+
$this->compileParameterType($parameter)
390+
]),
391+
),
392+
),
393+
};
271394
}
272395
}
273396

274-
private function compileParameterType(array $parameter): ?Node\Arg
397+
private function compileParameterType(array $parameter): Node\Arg
275398
{
276399
return match ($parameter["type"]) {
277400
'integer' => new Node\Arg(
@@ -286,13 +409,18 @@ class: new Node\Name\FullyQualified(name: 'PDO'),
286409
name: new Node\Identifier(name: 'PARAM_BOOL')
287410
)
288411
),
289-
'string' => new Node\Arg(
412+
'binary' => new Node\Arg(
290413
value: new Node\Expr\ClassConstFetch(
291414
class: new Node\Name\FullyQualified(name: 'PDO'),
292-
name: new Node\Identifier(name: 'PARAM_STR')
415+
name: new Node\Identifier(name: 'PARAM_LOB')
293416
)
294417
),
295-
default => null
418+
default => new Node\Arg(
419+
value: new Node\Expr\ClassConstFetch(
420+
class: new Node\Name\FullyQualified(name: 'PDO'),
421+
name: new Node\Identifier(name: 'PARAM_STR')
422+
)
423+
)
296424
};
297425
}
298426
}

0 commit comments

Comments
 (0)