Skip to content

Commit 2cbdc13

Browse files
committed
Added a param named "type" for the parameters + updated tests
1 parent e2a6cdb commit 2cbdc13

File tree

14 files changed

+335
-92
lines changed

14 files changed

+335
-92
lines changed

src/Builder/AlternativeLoader.php

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Kiboko\Plugin\SQL\Builder;
44

55
use Kiboko\Contract\Configurator\StepBuilderInterface;
6+
use Kiboko\Plugin\SQL\Builder\DTO\Parameter;
67
use PhpParser\Node;
78

89
final class AlternativeLoader implements StepBuilderInterface
@@ -43,9 +44,9 @@ public function withState(Node\Expr $state): StepBuilderInterface
4344
return $this;
4445
}
4546

46-
public function addParam(int|string $key, Node\Expr $param): StepBuilderInterface
47+
public function addParam(Parameter $parameter): StepBuilderInterface
4748
{
48-
$this->parameters[$key] = $param;
49+
$this->parameters[] = $parameter;
4950

5051
return $this;
5152
}
@@ -98,24 +99,31 @@ public function getNode(): Node
9899

99100
public function compileParameters(): iterable
100101
{
101-
foreach ($this->parameters as $key => $parameter) {
102+
/** @var Parameter $parameter */
103+
foreach ($this->parameters as $parameter) {
102104
yield new Node\Stmt\Expression(
103105
new Node\Expr\MethodCall(
104106
var: new Node\Expr\Variable('statement'),
105107
name: new Node\Identifier('bindParam'),
106-
args: [
108+
args: array_filter([
107109
new Node\Arg(
108-
is_string($key) ? new Node\Scalar\Encapsed(
110+
is_string($parameter->key) ? new Node\Scalar\Encapsed(
109111
[
110112
new Node\Scalar\EncapsedStringPart(':'),
111-
new Node\Scalar\EncapsedStringPart($key)
113+
new Node\Scalar\EncapsedStringPart($parameter->key)
112114
]
113-
) : new Node\Scalar\LNumber($key)
115+
) : new Node\Scalar\LNumber($parameter->key)
114116
),
115117
new Node\Arg(
116-
$parameter
118+
$parameter->value
117119
),
118-
],
120+
$parameter->type !== null ? new Node\Arg(
121+
value: new Node\Expr\ClassConstFetch(
122+
class: new Node\Name\FullyQualified(name: 'PDO'),
123+
name: $parameter->type === 'boolean' ? new Node\Identifier(name: 'PARAM_BOOL') : new Node\Identifier(name: 'PARAM_INT')
124+
)
125+
) : null,
126+
]),
119127
)
120128
);
121129
}

src/Builder/AlternativeLookup.php

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Kiboko\Component\SatelliteToolbox\Builder\IsolatedValueAppendingBuilder;
66
use Kiboko\Contract\Configurator\StepBuilderInterface;
7+
use Kiboko\Plugin\SQL\Builder\DTO\Parameter;
78
use PhpParser\Builder;
89
use PhpParser\Node;
910

@@ -46,9 +47,9 @@ public function withState(Node\Expr $state): StepBuilderInterface
4647
return $this;
4748
}
4849

49-
public function addParam(int|string $key, Node\Expr $param): StepBuilderInterface
50+
public function addParam(Parameter $parameter): StepBuilderInterface
5051
{
51-
$this->parameters[$key] = $param;
52+
$this->parameters[] = $parameter;
5253

5354
return $this;
5455
}
@@ -189,20 +190,32 @@ public function compileParameters(): array
189190
{
190191
$output = [];
191192

192-
foreach ($this->parameters as $key => $parameter) {
193+
/** @var Parameter $parameter */
194+
foreach ($this->parameters as $parameter) {
193195
$output[] = new Node\Stmt\Expression(
194196
expr: new Node\Expr\MethodCall(
195197
var: new Node\Expr\Variable('stmt'),
196198
name: new Node\Identifier('bindParam'),
197-
args: [
199+
args: array_filter([
198200
new Node\Arg(
199-
is_string($key) ? new Node\Scalar\Encapsed([new Node\Scalar\EncapsedStringPart(':'), new Node\Scalar\EncapsedStringPart($key)]) : new Node\Scalar\LNumber($key)
201+
is_string($parameter->key) ? new Node\Scalar\Encapsed(
202+
[
203+
new Node\Scalar\EncapsedStringPart(':'),
204+
new Node\Scalar\EncapsedStringPart($parameter->key)
205+
]
206+
) : new Node\Scalar\LNumber($parameter->key)
200207
),
201208
new Node\Arg(
202-
$parameter
209+
$parameter->value
203210
),
204-
],
205-
),
211+
$parameter->type !== null ? new Node\Arg(
212+
value: new Node\Expr\ClassConstFetch(
213+
class: new Node\Name\FullyQualified(name: 'PDO'),
214+
name: $parameter->type === 'boolean' ? new Node\Identifier(name: 'PARAM_BOOL') : new Node\Identifier(name: 'PARAM_INT')
215+
)
216+
) : null,
217+
]),
218+
)
206219
);
207220
}
208221

src/Builder/DTO/Parameter.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Kiboko\Plugin\SQL\Builder\DTO;
4+
5+
use PhpParser\Node;
6+
7+
class Parameter
8+
{
9+
public function __construct(
10+
public string|int $key,
11+
public Node\Expr $value,
12+
public ?string $type = null,
13+
){}
14+
}

src/Builder/Extractor.php

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Kiboko\Plugin\SQL\Builder;
44

55
use Kiboko\Contract\Configurator\StepBuilderInterface;
6+
use Kiboko\Plugin\SQL\Builder\DTO\Parameter;
67
use PhpParser\Node;
78

89
final class Extractor implements StepBuilderInterface
@@ -84,9 +85,9 @@ public function withAfterQueries(InitializerQueries ...$queries): self
8485
return $this;
8586
}
8687

87-
public function addParameter(string|int $key, Node\Expr $parameter): StepBuilderInterface
88+
public function addParam(Parameter $parameter): StepBuilderInterface
8889
{
89-
$this->parameters[$key] = $parameter;
90+
$this->parameters[] = $parameter;
9091

9192
return $this;
9293
}
@@ -134,24 +135,31 @@ class: new Node\Name\FullyQualified('Kiboko\\Component\\Flow\\SQL\\Extractor'),
134135

135136
public function compileParameters(): iterable
136137
{
137-
foreach ($this->parameters as $key => $parameter) {
138+
/** @var Parameter $parameter */
139+
foreach ($this->parameters as $parameter) {
138140
yield new Node\Stmt\Expression(
139141
new Node\Expr\MethodCall(
140142
var: new Node\Expr\Variable('statement'),
141143
name: new Node\Identifier('bindParam'),
142-
args: [
144+
args: array_filter([
143145
new Node\Arg(
144-
is_string($key) ? new Node\Scalar\Encapsed(
146+
is_string($parameter->key) ? new Node\Scalar\Encapsed(
145147
[
146148
new Node\Scalar\EncapsedStringPart(':'),
147-
new Node\Scalar\EncapsedStringPart($key)
149+
new Node\Scalar\EncapsedStringPart($parameter->key)
148150
]
149-
) : new Node\Scalar\LNumber($key)
151+
) : new Node\Scalar\LNumber($parameter->key)
150152
),
151153
new Node\Arg(
152-
$parameter
154+
$parameter->value
153155
),
154-
],
156+
$parameter->type !== null ? new Node\Arg(
157+
value: new Node\Expr\ClassConstFetch(
158+
class: new Node\Name\FullyQualified(name: 'PDO'),
159+
name: $parameter->type === 'boolean' ? new Node\Identifier(name: 'PARAM_BOOL') : new Node\Identifier(name: 'PARAM_INT')
160+
)
161+
) : null,
162+
]),
155163
)
156164
);
157165
}

src/Builder/Loader.php

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Kiboko\Plugin\SQL\Builder;
44

55
use Kiboko\Contract\Configurator\StepBuilderInterface;
6+
use Kiboko\Plugin\SQL\Builder\DTO\Parameter;
67
use PhpParser\Node;
78

89
final class Loader implements StepBuilderInterface
@@ -84,9 +85,9 @@ public function withAfterQueries(InitializerQueries ...$queries): self
8485
return $this;
8586
}
8687

87-
public function addParameter(string|int $key, Node\Expr $parameter): StepBuilderInterface
88+
public function addParam(Parameter $parameter): StepBuilderInterface
8889
{
89-
$this->parameters[$key] = $parameter;
90+
$this->parameters[] = $parameter;
9091

9192
return $this;
9293
}
@@ -137,24 +138,31 @@ class: new Node\Name\FullyQualified('Kiboko\\Component\\Flow\\SQL\\Loader'),
137138

138139
public function compileParameters(): iterable
139140
{
140-
foreach ($this->parameters as $key => $parameter) {
141+
/** @var Parameter $parameter */
142+
foreach ($this->parameters as $parameter) {
141143
yield new Node\Stmt\Expression(
142144
new Node\Expr\MethodCall(
143145
var: new Node\Expr\Variable('statement'),
144146
name: new Node\Identifier('bindParam'),
145-
args: [
147+
args: array_filter([
146148
new Node\Arg(
147-
is_string($key) ? new Node\Scalar\Encapsed(
149+
is_string($parameter->key) ? new Node\Scalar\Encapsed(
148150
[
149151
new Node\Scalar\EncapsedStringPart(':'),
150-
new Node\Scalar\EncapsedStringPart($key)
152+
new Node\Scalar\EncapsedStringPart($parameter->key)
151153
]
152-
) : new Node\Scalar\LNumber($key)
154+
) : new Node\Scalar\LNumber($parameter->key)
153155
),
154156
new Node\Arg(
155-
$parameter
157+
$parameter->value
156158
),
157-
],
159+
$parameter->type !== null ? new Node\Arg(
160+
value: new Node\Expr\ClassConstFetch(
161+
class: new Node\Name\FullyQualified(name: 'PDO'),
162+
name: $parameter->type === 'boolean' ? new Node\Identifier(name: 'PARAM_BOOL') : new Node\Identifier(name: 'PARAM_INT')
163+
)
164+
) : null,
165+
]),
158166
)
159167
);
160168
}

src/Configuration/Lookup.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
final class Lookup implements ConfigurationInterface
1212
{
13-
public function getConfigTreeBuilder()
13+
public function getConfigTreeBuilder(): TreeBuilder
1414
{
1515
$builder = new TreeBuilder('lookup');
1616

src/Configuration/Parameters.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ public function getConfigTreeBuilder()
1515

1616
/** @phpstan-ignore-next-line */
1717
$builder->getRootNode()
18-
->cannotBeEmpty()
19-
->requiresAtLeastOneElement()
2018
->validate()
2119
->ifTrue(function ($data) {
2220
return count($data) <= 0;
@@ -39,7 +37,9 @@ public function getConfigTreeBuilder()
3937
->then(asExpression())
4038
->end()
4139
->end()
42-
->scalarNode('type')->end()
40+
->enumNode('type')
41+
->values(['boolean', 'integer'])
42+
->end()
4343
->end()
4444
->end();
4545

src/Configuration/Query.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
class Query implements ConfigurationInterface
1111
{
12-
public function getConfigTreeBuilder()
12+
public function getConfigTreeBuilder(): TreeBuilder
1313
{
1414
return new TreeBuilder('query', 'scalar');
1515
}

src/Factory/Extractor.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,15 @@ public function compile(array $config): SQL\Factory\Repository\Extractor
5353
compileValueWhenExpression($this->interpreter, $config['query']),
5454
);
5555

56-
if ($config['parameters'] !== null) {
57-
foreach ($config["parameters"] as $key => $parameter) {
58-
$extractor->addParameter($key, compileValueWhenExpression($this->interpreter, $parameter));
56+
if (array_key_exists('parameters', $config)) {
57+
foreach ($config["parameters"] as $parameter) {
58+
$extractor->addParam(
59+
new SQL\Builder\DTO\Parameter(
60+
$parameter["key"],
61+
compileValueWhenExpression($this->interpreter, $parameter["value"]),
62+
array_key_exists('type', $parameter) ? $parameter["type"] : null
63+
)
64+
);
5965
}
6066
}
6167

src/Factory/Loader.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,15 @@ public function compile(array $config): SQL\Factory\Repository\Loader
5555
compileValueWhenExpression($this->interpreter, $config["query"]),
5656
);
5757

58-
if ($config['parameters'] !== null) {
59-
foreach ($config["parameters"] as $key => $parameter) {
60-
$loader->addParameter($key, compileValue($this->interpreter, $parameter));
58+
if (array_key_exists('parameters', $config)) {
59+
foreach ($config["parameters"] as $parameter) {
60+
$loader->addParam(
61+
new SQL\Builder\DTO\Parameter(
62+
$parameter["key"],
63+
compileValueWhenExpression($this->interpreter, $parameter["value"]),
64+
array_key_exists('type', $parameter) ? $parameter["type"] : null,
65+
)
66+
);
6167
}
6268
}
6369
} else {
@@ -69,8 +75,14 @@ public function compile(array $config): SQL\Factory\Repository\Loader
6975
);
7076

7177
if (array_key_exists('parameters', $alternative)) {
72-
foreach ($alternative["parameters"] as $key => $parameter) {
73-
$alternativeLoaderBuilder->addParam($key, compileValueWhenExpression($this->interpreter, $parameter));
78+
foreach ($alternative["parameters"] as $parameter) {
79+
$alternativeLoaderBuilder->addParam(
80+
new SQL\Builder\DTO\Parameter(
81+
$parameter["key"],
82+
compileValueWhenExpression($this->interpreter, $parameter["value"]),
83+
array_key_exists('type', $parameter) ? $parameter["type"] : null,
84+
)
85+
);
7486
}
7587
}
7688

0 commit comments

Comments
 (0)