Skip to content

Commit 396856f

Browse files
feat: add NULL value support for array_append(), array_replace(), array_prepend(), array_remove() and improve test scenarios for NULL (#322)
1 parent 7b1ccac commit 396856f

File tree

9 files changed

+33
-9
lines changed

9 files changed

+33
-9
lines changed

src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayAppend.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ protected function customizeFunction(): void
1818
{
1919
$this->setFunctionPrototype('array_append(%s, %s)');
2020
$this->addNodeMapping('StringPrimary');
21-
$this->addNodeMapping('ArithmeticPrimary');
21+
$this->addNodeMapping('NewValue');
2222
}
2323
}

src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPrepend.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ArrayPrepend extends BaseFunction
1717
protected function customizeFunction(): void
1818
{
1919
$this->setFunctionPrototype('array_prepend(%s, %s)');
20-
$this->addNodeMapping('ArithmeticPrimary');
20+
$this->addNodeMapping('NewValue');
2121
$this->addNodeMapping('StringPrimary');
2222
}
2323
}

src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayRemove.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ protected function customizeFunction(): void
1818
{
1919
$this->setFunctionPrototype('array_remove(%s, %s)');
2020
$this->addNodeMapping('StringPrimary');
21-
$this->addNodeMapping('ArithmeticPrimary');
21+
$this->addNodeMapping('NewValue');
2222
}
2323
}

src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayReplace.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ protected function customizeFunction(): void
1818
{
1919
$this->setFunctionPrototype('array_replace(%s, %s, %s)');
2020
$this->addNodeMapping('StringPrimary');
21-
$this->addNodeMapping('ArithmeticPrimary');
22-
$this->addNodeMapping('ArithmeticPrimary');
21+
$this->addNodeMapping('NewValue');
22+
$this->addNodeMapping('NewValue');
2323
}
2424
}

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayAppendTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ protected function getExpectedSqlStatements(): array
2222
'appends string element to array' => "SELECT array_append(c0_.array1, 'new-value') AS sclr_0 FROM ContainsArrays c0_",
2323
'appends numeric element to array' => 'SELECT array_append(c0_.array1, 42) AS sclr_0 FROM ContainsArrays c0_',
2424
'appends element using parameter' => 'SELECT array_append(c0_.array1, ?) AS sclr_0 FROM ContainsArrays c0_',
25+
'appends null to array' => 'SELECT array_append(c0_.array1, null) AS sclr_0 FROM ContainsArrays c0_',
2526
];
2627
}
2728

@@ -31,6 +32,7 @@ protected function getDqlStatements(): array
3132
'appends string element to array' => \sprintf("SELECT ARRAY_APPEND(e.array1, 'new-value') FROM %s e", ContainsArrays::class),
3233
'appends numeric element to array' => \sprintf('SELECT ARRAY_APPEND(e.array1, 42) FROM %s e', ContainsArrays::class),
3334
'appends element using parameter' => \sprintf('SELECT ARRAY_APPEND(e.array1, :dql_parameter) FROM %s e', ContainsArrays::class),
35+
'appends null to array' => \sprintf('SELECT ARRAY_APPEND(e.array1, NULL) FROM %s e', ContainsArrays::class),
3436
];
3537
}
3638
}

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayPrependTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ protected function getExpectedSqlStatements(): array
2222
'prepends string element to array' => "SELECT array_prepend('new-value', c0_.array1) AS sclr_0 FROM ContainsArrays c0_",
2323
'prepends numeric element to array' => 'SELECT array_prepend(42, c0_.array1) AS sclr_0 FROM ContainsArrays c0_',
2424
'prepends element using parameter' => 'SELECT array_prepend(?, c0_.array1) AS sclr_0 FROM ContainsArrays c0_',
25+
'prepends null to array' => 'SELECT array_prepend(null, c0_.array1) AS sclr_0 FROM ContainsArrays c0_',
2526
];
2627
}
2728

@@ -31,6 +32,7 @@ protected function getDqlStatements(): array
3132
'prepends string element to array' => \sprintf("SELECT ARRAY_PREPEND('new-value', e.array1) FROM %s e", ContainsArrays::class),
3233
'prepends numeric element to array' => \sprintf('SELECT ARRAY_PREPEND(42, e.array1) FROM %s e', ContainsArrays::class),
3334
'prepends element using parameter' => \sprintf('SELECT ARRAY_PREPEND(:dql_parameter, e.array1) FROM %s e', ContainsArrays::class),
35+
'prepends null to array' => \sprintf('SELECT ARRAY_PREPEND(NULL, e.array1) FROM %s e', ContainsArrays::class),
3436
];
3537
}
3638
}

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayRemoveTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ protected function getExpectedSqlStatements(): array
2222
'removes string element from array' => "SELECT array_remove(c0_.array1, 'value-to-remove') AS sclr_0 FROM ContainsArrays c0_",
2323
'removes numeric element from array' => 'SELECT array_remove(c0_.array1, 42) AS sclr_0 FROM ContainsArrays c0_',
2424
'removes element using parameter' => 'SELECT array_remove(c0_.array1, ?) AS sclr_0 FROM ContainsArrays c0_',
25+
'removes null from array' => 'SELECT array_remove(c0_.array1, null) AS sclr_0 FROM ContainsArrays c0_',
2526
];
2627
}
2728

@@ -31,6 +32,7 @@ protected function getDqlStatements(): array
3132
'removes string element from array' => \sprintf("SELECT ARRAY_REMOVE(e.array1, 'value-to-remove') FROM %s e", ContainsArrays::class),
3233
'removes numeric element from array' => \sprintf('SELECT ARRAY_REMOVE(e.array1, 42) FROM %s e', ContainsArrays::class),
3334
'removes element using parameter' => \sprintf('SELECT ARRAY_REMOVE(e.array1, :dql_parameter) FROM %s e', ContainsArrays::class),
35+
'removes null from array' => \sprintf('SELECT ARRAY_REMOVE(e.array1, NULL) FROM %s e', ContainsArrays::class),
3436
];
3537
}
3638
}

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayReplaceTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ protected function getExpectedSqlStatements(): array
2222
'replaces string element in array' => "SELECT array_replace(c0_.array1, 'old-value', 'new-value') AS sclr_0 FROM ContainsArrays c0_",
2323
'replaces numeric element in array' => 'SELECT array_replace(c0_.array1, 42, 43) AS sclr_0 FROM ContainsArrays c0_',
2424
'replaces element using parameters' => 'SELECT array_replace(c0_.array1, ?, ?) AS sclr_0 FROM ContainsArrays c0_',
25+
'replaces null with string' => "SELECT array_replace(c0_.array1, null, 'new-value') AS sclr_0 FROM ContainsArrays c0_",
26+
'replaces value with null' => "SELECT array_replace(c0_.array1, 'old-value', null) AS sclr_0 FROM ContainsArrays c0_",
27+
'replaces null with null' => 'SELECT array_replace(c0_.array1, null, null) AS sclr_0 FROM ContainsArrays c0_',
2528
];
2629
}
2730

@@ -31,6 +34,9 @@ protected function getDqlStatements(): array
3134
'replaces string element in array' => \sprintf("SELECT ARRAY_REPLACE(e.array1, 'old-value', 'new-value') FROM %s e", ContainsArrays::class),
3235
'replaces numeric element in array' => \sprintf('SELECT ARRAY_REPLACE(e.array1, 42, 43) FROM %s e', ContainsArrays::class),
3336
'replaces element using parameters' => \sprintf('SELECT ARRAY_REPLACE(e.array1, :old_value, :new_value) FROM %s e', ContainsArrays::class),
37+
'replaces null with string' => \sprintf("SELECT ARRAY_REPLACE(e.array1, NULL, 'new-value') FROM %s e", ContainsArrays::class),
38+
'replaces value with null' => \sprintf("SELECT ARRAY_REPLACE(e.array1, 'old-value', NULL) FROM %s e", ContainsArrays::class),
39+
'replaces null with null' => \sprintf('SELECT ARRAY_REPLACE(e.array1, NULL, NULL) FROM %s e', ContainsArrays::class),
3440
];
3541
}
3642
}

tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/JsonbSetLaxTest.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,28 @@ protected function getStringFunctions(): array
1919
protected function getExpectedSqlStatements(): array
2020
{
2121
return [
22-
"SELECT jsonb_set_lax(c0_.object1, '{country}', '{\"iso_3166_a3_code\":\"BGR\"}') AS sclr_0 FROM ContainsJsons c0_",
23-
"SELECT jsonb_set_lax(c0_.object1, '{country}', null) AS sclr_0 FROM ContainsJsons c0_",
22+
'modifies top-level property' => "SELECT jsonb_set_lax(c0_.object1, '{country}', '{\"iso_3166_a3_code\":\"BGR\"}') AS sclr_0 FROM ContainsJsons c0_",
23+
'sets property to null' => "SELECT jsonb_set_lax(c0_.object1, '{country}', null) AS sclr_0 FROM ContainsJsons c0_",
24+
'modifies nested property' => "SELECT jsonb_set_lax(c0_.object1, '{address,city}', '\"Sofia\"') AS sclr_0 FROM ContainsJsons c0_",
25+
'modifies array element at index' => "SELECT jsonb_set_lax(c0_.object1, '{phones,0}', '\"+1234567890\"') AS sclr_0 FROM ContainsJsons c0_",
26+
'uses parameters for path and value' => 'SELECT jsonb_set_lax(c0_.object1, ?, ?) AS sclr_0 FROM ContainsJsons c0_',
27+
'modifies deeply nested array element' => "SELECT jsonb_set_lax(c0_.object1, '{user,contacts,0,phone}', '\"+1234567890\"') AS sclr_0 FROM ContainsJsons c0_",
28+
'sets boolean property' => "SELECT jsonb_set_lax(c0_.object1, '{is_active}', 'true') AS sclr_0 FROM ContainsJsons c0_",
29+
'sets numeric property' => "SELECT jsonb_set_lax(c0_.object1, '{count}', '42') AS sclr_0 FROM ContainsJsons c0_",
2430
];
2531
}
2632

2733
protected function getDqlStatements(): array
2834
{
2935
return [
30-
\sprintf("SELECT JSONB_SET_LAX(e.object1, '{country}', '{\"iso_3166_a3_code\":\"BGR\"}') FROM %s e", ContainsJsons::class),
31-
\sprintf("SELECT JSONB_SET_LAX(e.object1, '{country}', null) FROM %s e", ContainsJsons::class),
36+
'modifies top-level property' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{country}', '{\"iso_3166_a3_code\":\"BGR\"}') FROM %s e", ContainsJsons::class),
37+
'sets property to null' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{country}', null) FROM %s e", ContainsJsons::class),
38+
'modifies nested property' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{address,city}', '\"Sofia\"') FROM %s e", ContainsJsons::class),
39+
'modifies array element at index' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{phones,0}', '\"+1234567890\"') FROM %s e", ContainsJsons::class),
40+
'uses parameters for path and value' => \sprintf('SELECT JSONB_SET_LAX(e.object1, :path, :value) FROM %s e', ContainsJsons::class),
41+
'modifies deeply nested array element' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{user,contacts,0,phone}', '\"+1234567890\"') FROM %s e", ContainsJsons::class),
42+
'sets boolean property' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{is_active}', 'true') FROM %s e", ContainsJsons::class),
43+
'sets numeric property' => \sprintf("SELECT JSONB_SET_LAX(e.object1, '{count}', '42') FROM %s e", ContainsJsons::class),
3244
];
3345
}
3446
}

0 commit comments

Comments
 (0)