Commit cfc70933 authored by vitaly.erofeev's avatar vitaly.erofeev
Browse files

fix: Исправлена работа с полем адреса

1 merge request!21fix: Исправлена работа с полем адреса
Pipeline #19883 failed with stage
in 38 seconds
{
"config": {
"vendor-dir": "./vendor"
"vendor-dir": "./vendor",
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
},
"require": {
"doctrine/dbal": "*",
......@@ -31,4 +34,4 @@
"Tests\\": "./tests"
}
}
}
\ No newline at end of file
}
......@@ -359,7 +359,7 @@ class ApiQueryBuilder
*/
public function andWhere($where): void
{
$this->builder->andWhere($where);
$where && $this->builder->andWhere($where);
}
/**
......
......@@ -27,39 +27,58 @@ class Address extends AbstractSpec
*
* @return string
*/
public function match(QueryBuilder $queryBuilder): string
public function match(QueryBuilder $queryBuilder): ?string
{
$fieldName = $this->getJsonFieldName($this->parameter, $this->value);
switch ($this->value['address_level_id']) {
case 'house':
$orValues = [];
if (isset($this->value['house']) && strlen($this->value['house']) > 0) {
$fieldNameHouse = sprintf("%s_house", $fieldName);
$queryBuilder->setParameter($fieldNameHouse, $this->value['house']);
$orValues[] = $queryBuilder->expr()->eq(
sprintf(":%s::varchar", $fieldNameHouse),
sprintf("ANY(json_column(%s, '%s'))", $this->parameter, 'house')
);
}
$expression = null;
if (isset($this->value['house_guid']) && strlen($this->value['house_guid']) > 0) {
$fieldNameHouse = sprintf("%s_house_guid", $fieldName);
$queryBuilder->setParameter($fieldNameHouse, $this->value['house_guid']);
$orValues[] = $queryBuilder->expr()->eq(
$expression = $queryBuilder->expr()->eq(
sprintf(":%s::varchar", $fieldNameHouse),
sprintf("ANY(json_column(%s, '%s'))", $this->parameter, 'house_guid')
);
} elseif (isset($this->value['house']) && strlen($this->value['house']) > 0) {
$fieldNameHouse = sprintf("%s_house", $fieldName);
$queryBuilder->setParameter($fieldNameHouse, sprintf("д. %s", $this->value['house']));
$expression = $queryBuilder->expr()->eq(
sprintf(":%s::varchar", $fieldNameHouse),
sprintf("ANY(json_column(%s, '%s'))", $this->parameter, 'house_name')
);
}
if (count($orValues) > 0) {
return $queryBuilder->expr()->or(...$orValues);
if (
$previousLevelExpression = $this->preparePreviousLevel(
$queryBuilder,
$this->value['previous_type'] ?? null,
$this->value['previous_value'] ?? null
)
) {
$expression = $queryBuilder->expr()->and($expression, $previousLevelExpression);
}
return '';
return $expression;
case 'flat':
$queryBuilder->setParameter($fieldName, $this->value['flat']);
return $queryBuilder->expr()->eq(
$expression = $queryBuilder->expr()->eq(
sprintf(":%s::varchar", $fieldName),
sprintf("ANY(json_column(%s, '%s'))", $this->parameter, 'flat')
);
if (
$previousLevelExpression = $this->preparePreviousLevel(
$queryBuilder,
$this->value['previous_type'],
$this->value['previous_value']
)
) {
$expression = $queryBuilder->expr()->and($expression, $previousLevelExpression);
}
return $expression;
default:
$queryBuilder->setParameter($fieldName, $this->value['guid']);
return $queryBuilder->expr()->eq(
......@@ -68,4 +87,18 @@ class Address extends AbstractSpec
);
}
}
private function preparePreviousLevel(QueryBuilder $queryBuilder, ?string $type, ?string $guid): ?string
{
if (!$type || !$guid) {
return null;
}
$fieldName = $this->getJsonFieldName($type, $guid);
return $queryBuilder->expr()->eq(
sprintf(":%s::varchar", $fieldName),
sprintf("ANY(json_column(%s, '%s_guid'))", $this->parameter, $type)
);
}
}
......@@ -1479,7 +1479,7 @@ class ApiQLUnitTest extends TestCase
);
}
public function testAddressFlatFilter()
public function testAddressFlatFilter(): void
{
$qb = new QueryBuilder($this->conn);
......@@ -1487,7 +1487,9 @@ class ApiQLUnitTest extends TestCase
$payload =
["spec" => "address", "attr_5039_address" => [
"address_level_id" => "flat",
"flat" => "13"
"flat" => "13",
"previous_type" => "city",
"previous_value" => "555e7d61-d9a7-4ba6-9770-6caa8198c483"
]
];
......@@ -1495,13 +1497,14 @@ class ApiQLUnitTest extends TestCase
$api->execute();
self::assertEquals(
"SELECT * FROM messages WHERE :attr_5039_address_address_level_id_::varchar " .
"= ANY(json_column(attr_5039_address, 'flat'))",
"SELECT * FROM messages WHERE (:attr_5039_address_address_level_id_::varchar " .
"= ANY(json_column(attr_5039_address, 'flat'))) " .
"AND (:city::varchar = ANY(json_column(attr_5039_address, 'city_guid')))",
(string) $qb
);
}
public function testAddressHouseFilter()
public function testAddressHouseFilter(): void
{
$qb = new QueryBuilder($this->conn);
......@@ -1509,7 +1512,9 @@ class ApiQLUnitTest extends TestCase
$payload =
["spec" => "address", "attr_5039_address" => [
"address_level_id" => "house",
"house" => "13"
"house" => "13",
"previous_type" => "city",
"previous_value" => "555e7d61-d9a7-4ba6-9770-6caa8198c483"
]
];
......@@ -1517,8 +1522,9 @@ class ApiQLUnitTest extends TestCase
$api->execute();
self::assertEquals(
"SELECT * FROM messages WHERE :attr_5039_address_address_level_id__house::varchar " .
"= ANY(json_column(attr_5039_address, 'house'))",
"SELECT * FROM messages WHERE (:attr_5039_address_address_level_id__house::varchar " .
"= ANY(json_column(attr_5039_address, 'house_name'))) AND " .
"(:city::varchar = ANY(json_column(attr_5039_address, 'city_guid')))",
(string) $qb
);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment