Skip to content
This repository was archived by the owner on Feb 13, 2023. It is now read-only.

Commit 7c537f8

Browse files
authored
bugfix(product) Optymise product grid query building (#1849) (#1850)
1 parent 0a21ad7 commit 7c537f8

19 files changed

+250
-85
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
## CHANGELOG FOR 1.1.x
2+
#### 1.1.8
3+
- bugfix [#1848](https://github.com/ergonode/backend/issues/1848) Long response times for product grid endpoint (rprzedzik)
24
#### 1.1.7
35
- bugfix [#1816](https://github.com/ergonode/backend/issues/1816) Fixed product audits (rprzedzik)
46

module/product/src/Infrastructure/Grid/Builder/Query/AbstractAttributeDataSetBuilder.php

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3030
{
3131
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
3232

33-
$sql = sprintf(
34-
'(SELECT
33+
if ($attribute->getScope()->isLocal()) {
34+
$sql = sprintf(
35+
'
36+
(
37+
SELECT
3538
DISTINCT ON (product_id) product_id,
3639
value AS "%s"
3740
FROM value_translation vt
@@ -41,11 +44,28 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
4144
AND lt.lft <= %s AND lt.rgt >= %s
4245
ORDER BY product_id, lft DESC NULLS LAST
4346
)',
44-
$key,
45-
$attribute->getId()->getValue(),
46-
$info['lft'],
47-
$info['rgt'],
48-
);
47+
$key,
48+
$attribute->getId()->getValue(),
49+
$info['lft'],
50+
$info['rgt'],
51+
);
52+
} else {
53+
$sql = sprintf(
54+
'
55+
(
56+
SELECT
57+
product_id,
58+
value AS "%s"
59+
FROM value_translation vt
60+
JOIN product_value pv ON pv.value_id = vt.value_id
61+
WHERE attribute_id = \'%s\'
62+
AND language = \'%s\'
63+
)',
64+
$key,
65+
$attribute->getId()->getValue(),
66+
$info['code'],
67+
);
68+
}
4969

5070
$query->addSelect(sprintf('"%s"', $key));
5171
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/DateAttributeDataSetQueryBuilder.php

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3030
{
3131
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
3232

33-
$sql = sprintf(
34-
'(SELECT
33+
if ($attribute->getScope()->isLocal()) {
34+
$sql = sprintf(
35+
'
36+
(
37+
SELECT
3538
DISTINCT ON (product_id) product_id,
3639
value::DATE AS "%s"
3740
FROM value_translation vt
@@ -41,11 +44,24 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
4144
AND lt.lft <= %s AND lt.rgt >= %s
4245
ORDER BY product_id, lft DESC NULLS LAST
4346
)',
44-
$key,
45-
$attribute->getId()->getValue(),
46-
$info['lft'],
47-
$info['rgt'],
48-
);
47+
$key,
48+
$attribute->getId()->getValue(),
49+
$info['lft'],
50+
$info['rgt'],
51+
);
52+
} else {
53+
$sql = sprintf(
54+
'( SELECT product_id, value::DATE AS "%s"
55+
FROM value_translation vt
56+
JOIN product_value pv ON pv.value_id = vt.value_id
57+
WHERE attribute_id = \'%s\'
58+
AND language = \'%s\'
59+
)',
60+
$key,
61+
$attribute->getId()->getValue(),
62+
$info['code']
63+
);
64+
}
4965

5066
$query->addSelect(sprintf('"%s"', $key));
5167
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/FileAttributeDataSetQueryBuilder.php

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3131
{
3232
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
3333

34-
$sql = sprintf(
35-
'(SELECT
34+
if ($attribute->getScope()->isLocal()) {
35+
$sql = sprintf(
36+
'
37+
(
38+
SELECT
3639
DISTINCT ON (product_id) product_id,
3740
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
3841
FROM value_translation vt
@@ -42,11 +45,28 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
4245
AND lt.lft <= %s AND lt.rgt >= %s
4346
ORDER BY product_id, lft DESC NULLS LAST
4447
)',
45-
$key,
46-
$attribute->getId()->getValue(),
47-
$info['lft'],
48-
$info['rgt'],
49-
);
48+
$key,
49+
$attribute->getId()->getValue(),
50+
$info['lft'],
51+
$info['rgt'],
52+
);
53+
} else {
54+
$sql = sprintf(
55+
'
56+
(
57+
SELECT
58+
product_id,
59+
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
60+
FROM value_translation vt
61+
JOIN product_value pv ON pv.value_id = vt.value_id
62+
WHERE attribute_id = \'%s\'
63+
AND language = \'%s\'
64+
)',
65+
$key,
66+
$attribute->getId()->getValue(),
67+
$info['code'],
68+
);
69+
}
5070

5171
$query->addSelect(sprintf('"%s"', $key));
5272
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/GalleryAttributeDataSetQueryBuilder.php

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,42 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3131
{
3232
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
3333

34-
$sql = sprintf(
35-
'(SELECT
36-
DISTINCT ON (product_id) product_id,
37-
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
38-
FROM value_translation vt
34+
if ($attribute->getScope()->isLocal()) {
35+
$sql = sprintf(
36+
'
37+
(
38+
SELECT
39+
DISTINCT ON (product_id) product_id,
40+
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
41+
FROM value_translation vt
3942
JOIN product_value pv ON pv.value_id = vt.value_id
4043
LEFT JOIN language_tree lt ON lt.code = vt.language
4144
WHERE attribute_id = \'%s\'
4245
AND lt.lft <= %s AND lt.rgt >= %s
4346
ORDER BY product_id, lft DESC NULLS LAST
4447
)',
45-
$key,
46-
$attribute->getId()->getValue(),
47-
$info['lft'],
48-
$info['rgt'],
49-
);
48+
$key,
49+
$attribute->getId()->getValue(),
50+
$info['lft'],
51+
$info['rgt'],
52+
);
53+
} else {
54+
$sql = sprintf(
55+
'
56+
(
57+
SELECT
58+
product_id,
59+
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
60+
FROM value_translation vt
61+
JOIN product_value pv ON pv.value_id = vt.value_id
62+
WHERE attribute_id = \'%s\'
63+
AND language = \'%s\'
64+
)',
65+
$key,
66+
$attribute->getId()->getValue(),
67+
$info['code'],
68+
);
69+
}
5070

5171
$query->addSelect(sprintf('"%s"', $key));
5272
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/MultiSelectAttributeDataSetQueryBuilder.php

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,42 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3030
{
3131
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
3232

33-
$sql = sprintf(
34-
'(SELECT
35-
DISTINCT ON (product_id) product_id,
36-
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
37-
FROM value_translation vt
33+
if ($attribute->getScope()->isLocal()) {
34+
$sql = sprintf(
35+
'
36+
(
37+
SELECT
38+
DISTINCT ON (product_id) product_id,
39+
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
40+
FROM value_translation vt
3841
JOIN product_value pv ON pv.value_id = vt.value_id
3942
LEFT JOIN language_tree lt ON lt.code = vt.language
4043
WHERE attribute_id = \'%s\'
4144
AND lt.lft <= %s AND lt.rgt >= %s
4245
ORDER BY product_id, lft DESC NULLS LAST
4346
)',
44-
$key,
45-
$attribute->getId()->getValue(),
46-
$info['lft'],
47-
$info['rgt'],
48-
);
47+
$key,
48+
$attribute->getId()->getValue(),
49+
$info['lft'],
50+
$info['rgt'],
51+
);
52+
} else {
53+
$sql = sprintf(
54+
'
55+
(
56+
SELECT
57+
product_id,
58+
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
59+
FROM value_translation vt
60+
JOIN product_value pv ON pv.value_id = vt.value_id
61+
WHERE attribute_id = \'%s\'
62+
AND language = \'%s\'
63+
)',
64+
$key,
65+
$attribute->getId()->getValue(),
66+
$info['code'],
67+
);
68+
}
4969

5070
$query->addSelect(sprintf('"%s"', $key));
5171
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/NumericAttributeDataSetQueryBuilder.php

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,38 @@ public function supports(AbstractAttribute $attribute): bool
2929
public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $attribute, Language $language): void
3030
{
3131
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
32-
33-
$sql = sprintf(
34-
'(SELECT
35-
DISTINCT ON (product_id) product_id,
36-
value::NUMERIC AS "%s"
37-
FROM value_translation vt
32+
if ($attribute->getScope()->isLocal()) {
33+
$sql = sprintf(
34+
'
35+
(
36+
SELECT
37+
DISTINCT ON (product_id) product_id,
38+
value::NUMERIC AS "%s"
39+
FROM value_translation vt
3840
JOIN product_value pv ON pv.value_id = vt.value_id
3941
LEFT JOIN language_tree lt ON lt.code = vt.language
4042
WHERE attribute_id = \'%s\'
4143
AND lt.lft <= %s AND lt.rgt >= %s
4244
ORDER BY product_id, lft DESC NULLS LAST
4345
)',
44-
$key,
45-
$attribute->getId()->getValue(),
46-
$info['lft'],
47-
$info['rgt'],
48-
);
46+
$key,
47+
$attribute->getId()->getValue(),
48+
$info['lft'],
49+
$info['rgt'],
50+
);
51+
} else {
52+
$sql = sprintf(
53+
'(SELECT product_id, value::NUMERIC AS "%s"
54+
FROM value_translation vt
55+
JOIN product_value pv ON pv.value_id = vt.value_id
56+
WHERE attribute_id = \'%s\'
57+
AND language = \'%s\'
58+
)',
59+
$key,
60+
$attribute->getId()->getValue(),
61+
$info['code']
62+
);
63+
}
4964

5065
$query->addSelect(sprintf('"%s"', $key));
5166
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/PriceAttributeDataSetQueryBuilder.php

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,38 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3030
{
3131
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
3232

33-
$sql = sprintf(
34-
'(SELECT
35-
DISTINCT ON (product_id) product_id,
36-
value::NUMERIC AS "%s"
37-
FROM value_translation vt
33+
if ($attribute->getScope()->isLocal()) {
34+
$sql = sprintf(
35+
'
36+
(
37+
SELECT
38+
DISTINCT ON (product_id) product_id,
39+
value::NUMERIC AS "%s"
40+
FROM value_translation vt
3841
JOIN product_value pv ON pv.value_id = vt.value_id
3942
LEFT JOIN language_tree lt ON lt.code = vt.language
4043
WHERE attribute_id = \'%s\'
4144
AND lt.lft <= %s AND lt.rgt >= %s
4245
ORDER BY product_id, lft DESC NULLS LAST
4346
)',
44-
$key,
45-
$attribute->getId()->getValue(),
46-
$info['lft'],
47-
$info['rgt'],
48-
);
47+
$key,
48+
$attribute->getId()->getValue(),
49+
$info['lft'],
50+
$info['rgt'],
51+
);
52+
} else {
53+
$sql = sprintf(
54+
'(SELECT product_id, value::NUMERIC AS "%s"
55+
FROM value_translation vt
56+
JOIN product_value pv ON pv.value_id = vt.value_id
57+
WHERE attribute_id = \'%s\'
58+
AND language = \'%s\'
59+
)',
60+
$key,
61+
$attribute->getId()->getValue(),
62+
$info['code']
63+
);
64+
}
4965

5066
$query->addSelect(sprintf('"%s"', $key));
5167
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

module/product/src/Infrastructure/Grid/Builder/Query/ProductRelationAttributeDataSetQueryBuilder.php

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
2525
{
2626
$info = $this->query->getLanguageNodeInfo($this->resolver->resolve($attribute, $language));
2727

28-
$sql = sprintf(
29-
'(
28+
if ($attribute->getScope()->isLocal()) {
29+
$sql = sprintf(
30+
'(
3031
SELECT
3132
DISTINCT ON (product_id) product_id,
3233
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
@@ -37,11 +38,28 @@ public function addSelect(QueryBuilder $query, string $key, AbstractAttribute $a
3738
AND lt.lft <= %s AND lt.rgt >= %s
3839
ORDER BY product_id, lft DESC NULLS LAST
3940
)',
40-
$key,
41-
$attribute->getId()->getValue(),
42-
$info['lft'],
43-
$info['rgt'],
44-
);
41+
$key,
42+
$attribute->getId()->getValue(),
43+
$info['lft'],
44+
$info['rgt'],
45+
);
46+
} else {
47+
$sql = sprintf(
48+
'
49+
(
50+
SELECT
51+
product_id,
52+
to_jsonb(regexp_split_to_array(value,\',\')) AS "%s"
53+
FROM value_translation vt
54+
JOIN product_value pv ON pv.value_id = vt.value_id
55+
WHERE attribute_id = \'%s\'
56+
AND language = \'%s\'
57+
)',
58+
$key,
59+
$attribute->getId()->getValue(),
60+
$info['code'],
61+
);
62+
}
4563

4664
$query->addSelect(sprintf('"%s"', $key));
4765
$query->leftJoin('p', $sql, sprintf('"%s_JT"', $key), sprintf('"%s_JT".product_id = p.id', $key));

0 commit comments

Comments
 (0)