From da1b71fc899e1fa8b063939d13c742b08e8d56e2 Mon Sep 17 00:00:00 2001 From: Nikita Kiselev Date: Fri, 3 Oct 2025 22:32:31 +0300 Subject: [PATCH] wip: product filters --- .../framework/QueryBuilder/Builder.php | 35 ++-- .../framework/QueryBuilder/Table.php | 51 ++++++ .../Filters/ProductAttribute.php | 2 +- .../Filters/ProductCategories.php | 2 +- .../Filters/ProductForMainPage.php | 2 +- .../Filters/ProductManufacturer.php | 2 +- .../Filters/ProductModel.php | 2 +- .../Filters/ProductPrice.php | 42 +++-- .../Filters/ProductQuantity.php | 2 +- .../Filters/ProductStatus.php | 2 +- .../src/Handlers/ProductsHandler.php | 5 - .../ServiceProviders/AppServiceProvider.php | 16 +- .../tests/Unit/BuilderTest.php | 154 ++++++++++++++++++ .../tests/Unit/CriteriaBuilderTest.php | 18 +- .../tests/Unit/RuleSerializerTest.php | 2 +- .../oc_telegram_shop/tests/Unit/TableTest.php | 55 +++++++ .../product_for_main_page/featured/output.sql | 4 +- .../product_for_main_page/latests/output.sql | 4 +- .../most_viewed/output.sql | 4 +- .../product_price/between/output.sql | 32 ++-- .../product_price/between_equals/output.sql | 32 ++-- .../between_from_empty_string/output.sql | 32 ++-- .../between_from_null/output.sql | 32 ++-- .../between_num_as_string/output.sql | 32 ++-- .../product_price/equals/output.sql | 32 ++-- .../equals_num_as_string/output.sql | 32 ++-- .../product_price/greater/output.sql | 32 ++-- .../greater_or_equals/output.sql | 32 ++-- .../include_discounts/output.sql | 32 ++-- .../product_price/include_specials/output.sql | 32 ++-- .../product_price/less/output.sql | 32 ++-- .../product_price/less_or_equals/output.sql | 32 ++-- .../product_price/not_equals/output.sql | 32 ++-- spa/src/App.vue | 36 +++- spa/src/components/CartButton.vue | 2 +- spa/src/components/CategoriesInline.vue | 5 + spa/src/components/LoadingFullScreen.vue | 2 +- spa/src/components/SearchInput.vue | 5 +- spa/src/stores/SettingsStore.js | 2 +- spa/src/style.css | 14 +- spa/src/views/Cart.vue | 2 +- spa/src/views/CategoriesList.vue | 2 +- spa/src/views/Checkout.vue | 2 +- spa/src/views/Home.vue | 17 +- spa/src/views/OrderCreated.vue | 2 +- spa/src/views/Product.vue | 2 +- spa/src/views/Products.vue | 9 +- spa/src/views/Search.vue | 2 +- 48 files changed, 721 insertions(+), 235 deletions(-) create mode 100644 module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Table.php rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductAttribute.php (98%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductCategories.php (98%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductForMainPage.php (97%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductManufacturer.php (97%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductModel.php (97%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductPrice.php (82%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductQuantity.php (98%) rename module/oc_telegram_shop/upload/oc_telegram_shop/src/{FacetSearch => }/Filters/ProductStatus.php (96%) create mode 100644 module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/TableTest.php diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php index abd0130..e4cdb1e 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Builder.php @@ -10,6 +10,10 @@ use InvalidArgumentException; class Builder { + public const JOIN_TYPE_LEFT = 'LEFT'; + public const JOIN_TYPE_INNER = 'INNER'; + public const JOIN_TYPE_RIGHT = 'RIGHT'; + private $connection; private $grammar; @@ -46,7 +50,7 @@ class Builder $this->columns = []; $this->bindings['select'] = []; - if (!$columns) { + if (! $columns) { throw new InvalidArgumentException('Select columns not provided'); } @@ -231,7 +235,7 @@ class Builder { $direction = strtoupper($direction); - if (!in_array($direction, ['ASC', 'DESC'], true)) { + if (! in_array($direction, ['ASC', 'DESC'], true)) { throw new InvalidArgumentException('Order direction must be "ASC" or "DESC".'); } @@ -251,7 +255,7 @@ class Builder public function toRawSql(): string { return $this->substituteBindingsIntoRawSql( - $this->toSql(), + str_replace("\n", ' ', $this->toSql()), $this->getBindings() ); } @@ -280,8 +284,8 @@ class Builder ++$i; } elseif ($char === "'") { // Starting / leaving string literal... $query .= $char; - $isStringLiteral = !$isStringLiteral; - } elseif ($char === '?' && !$isStringLiteral) { // Substitutable binding... + $isStringLiteral = ! $isStringLiteral; + } elseif ($char === '?' && ! $isStringLiteral) { // Substitutable binding... $query .= array_shift($bindings) ?? '?'; } else { // Normal character... $query .= $char; @@ -348,7 +352,7 @@ class Builder public function addBinding($value, $type = 'where'): Builder { - if (!array_key_exists($type, $this->bindings)) { + if (! array_key_exists($type, $this->bindings)) { throw new InvalidArgumentException("Invalid binding type: {$type}."); } @@ -362,9 +366,15 @@ class Builder Utils::dd($this->toSql(), $this->getBindings()); } - public function join(string $table, Closure $joinClosure, $type = 'inner'): Builder + /** + * @param Table|string $table + * @param Closure $joinClosure + * @param $type + * @return $this + */ + public function join($table, Closure $joinClosure, $type = self::JOIN_TYPE_INNER): Builder { - $joinClause = new JoinClause($this, $type, $table); + $joinClause = new JoinClause($this, $type, (string) $table); $joinClosure($joinClause); @@ -374,9 +384,14 @@ class Builder return $this; } - public function leftJoin(string $table, Closure $joinClosure): Builder + /** + * @param Table|string $table + * @param Closure $joinClosure + * @return $this + */ + public function leftJoin($table, Closure $joinClosure): Builder { - return $this->join($table, $joinClosure, 'left'); + return $this->join($table, $joinClosure, self::JOIN_TYPE_LEFT); } public function getConnection(): ConnectionInterface diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Table.php b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Table.php new file mode 100644 index 0000000..8ae7196 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/framework/QueryBuilder/Table.php @@ -0,0 +1,51 @@ +table = $table; + $this->alias = $alias; + + if ($this->table instanceof Builder && ! $this->getAlias()) { + throw new InvalidArgumentException('Alias required for Sub Queries'); + } + } + + /** + * @return Builder|string + */ + public function getTable() + { + return $this->table; + } + + public function getAlias(): ?string + { + return $this->alias; + } + + public function __toString(): string + { + $table = $this->getTable(); + $alias = $this->getAlias(); + + if ($table instanceof Builder) { + $table = '(' . $table->toRawSql() . ')'; + } + + return $table . ($alias ? ' AS ' . $alias : ''); + } +} diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductAttribute.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductAttribute.php similarity index 98% rename from module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductAttribute.php rename to module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductAttribute.php index 18ec048..aeebde8 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductAttribute.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductAttribute.php @@ -1,6 +1,6 @@ join( - db_table('product_special') . " AS $joinAlias", - function (JoinClause $join) use ($joinAlias, $customerGroupId) { - $join - ->on('products.product_id', '=', "$joinAlias.product_id") - ->where("$joinAlias.customer_group_id", '=', $customerGroupId) - ->whereRaw(" - ($joinAlias.date_start = '0000-00-00' OR $joinAlias.date_start < NOW()) - AND ($joinAlias.date_end = '0000-00-00' OR $joinAlias.date_end > NOW()) - ") - ->orderBy("$joinAlias.priority", 'ASC') - ->orderBy('products.price', 'ASC') - ->limit(1); - }, - 'left' - ); + $sub = $builder->newQuery() + ->select([ + 'ps.product_id', + 'ps.price', + ]) + ->from(db_table('product_special'), 'ps') + ->where("ps.customer_group_id", '=', $customerGroupId) + ->whereRaw( + " + (ps.date_start = '0000-00-00' OR ps.date_start < NOW()) + AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()) + " + ) + ->orderBy('ps.priority', 'ASC') + ->orderBy('ps.price', 'ASC') + ->limit(1); + + $builder->join(new Table($sub, $joinAlias), function (JoinClause $join) use ($joinAlias) { + $join->on('products.product_id', '=', "$joinAlias.product_id"); + }, Builder::JOIN_TYPE_LEFT); $column = new RawExpression("COALESCE($joinAlias.price, products.price)"); } @@ -103,18 +108,21 @@ class ProductPrice extends BaseRule // если только правая граница — "меньше или равно" if ($min === null && $max !== null) { $builder->where($column, '<=', $max, $operand); + return; } // если только левая граница — "больше или равно" if ($min !== null && $max === null) { $builder->where($column, '>=', $min, $operand); + return; } // левая и правая граница равны if ($min !== null && $max !== null && $min === $max) { $builder->where($column, '=', $min, $operand); + return; } diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductQuantity.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductQuantity.php similarity index 98% rename from module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductQuantity.php rename to module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductQuantity.php index 3af725c..ff6b469 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductQuantity.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductQuantity.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\FacetSearch\Filters; +namespace App\Filters; use InvalidArgumentException; use Openguru\OpenCartFramework\CriteriaBuilder\Criterion; diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductStatus.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductStatus.php similarity index 96% rename from module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductStatus.php rename to module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductStatus.php index 5cd304d..c7104b5 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/FacetSearch/Filters/ProductStatus.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Filters/ProductStatus.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace App\FacetSearch\Filters; +namespace App\Filters; use Openguru\OpenCartFramework\CriteriaBuilder\Criterion; use Openguru\OpenCartFramework\CriteriaBuilder\Rules\BaseRule; diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/ProductsHandler.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/ProductsHandler.php index 1a5eb1f..47a46ca 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/ProductsHandler.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/Handlers/ProductsHandler.php @@ -46,11 +46,6 @@ class ProductsHandler public function show(Request $request): JsonResponse { $productId = (int) $request->get('id'); - $languageId = 1; - $imageWidth = 500; - $imageHeight = 500; - $imageFullWidth = 1000; - $imageFullHeight = 1000; try { $product = $this->productsService->getProductById($productId); diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php b/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php index 7a0eeb6..07695c8 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/src/ServiceProviders/AppServiceProvider.php @@ -3,14 +3,14 @@ namespace App\ServiceProviders; use App\Exceptions\CustomExceptionHandler; -use App\FacetSearch\Filters\ProductAttribute; -use App\FacetSearch\Filters\ProductCategories; -use App\FacetSearch\Filters\ProductForMainPage; -use App\FacetSearch\Filters\ProductManufacturer; -use App\FacetSearch\Filters\ProductModel; -use App\FacetSearch\Filters\ProductPrice; -use App\FacetSearch\Filters\ProductQuantity; -use App\FacetSearch\Filters\ProductStatus; +use App\Filters\ProductAttribute; +use App\Filters\ProductCategories; +use App\Filters\ProductForMainPage; +use App\Filters\ProductManufacturer; +use App\Filters\ProductModel; +use App\Filters\ProductPrice; +use App\Filters\ProductQuantity; +use App\Filters\ProductStatus; use App\Telegram\LinkCommand; use Openguru\OpenCartFramework\Container\ServiceProvider; use Openguru\OpenCartFramework\Contracts\ExceptionHandlerInterface; diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php index 6c11a2c..0aa4d8b 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/BuilderTest.php @@ -7,6 +7,7 @@ use Openguru\OpenCartFramework\QueryBuilder\Connections\MySqlConnection; use Openguru\OpenCartFramework\QueryBuilder\Grammars\MySqlGrammar; use Openguru\OpenCartFramework\QueryBuilder\JoinClause; use Openguru\OpenCartFramework\QueryBuilder\RawExpression; +use Openguru\OpenCartFramework\QueryBuilder\Table; use Tests\TestCase; class BuilderTest extends TestCase @@ -344,4 +345,157 @@ class BuilderTest extends TestCase ->toRawSql() ); } + + public function testHasJoinAlias(): void + { + $this->builder + ->select(['id']) + ->from('table1') + ->join('table2 AS tbl_alias', function (JoinClause $join) { + return $join->on('table1.id', '=', 'tbl_alias.id'); + }) + ->toRawSql(); + + $this->assertStringContainsString('AS tbl_alias', $this->builder->toRawSql()); + } + + public function testHasJoinAliasWithTableClass(): void + { + $this->builder + ->select(['id']) + ->from('table1') + ->join(new Table('table2', 'tbl_alias'), function (JoinClause $join) { + return $join->on('table1.id', '=', 'tbl_alias.id'); + }) + ->toRawSql(); + + $this->assertTrue($this->builder->hasJoinAlias('tbl_alias')); + } + + public function testHasJoinHasAliasWithTableClass(): void + { + $this->builder + ->select(['id']) + ->from('table1') + ->join(new Table('table2', 'tbl_alias'), function (JoinClause $join) { + return $join->on('table1.id', '=', 'tbl_alias.id'); + }) + ->toRawSql(); + + $this->assertTrue($this->builder->hasJoinAlias('tbl_alias')); + } + + public function testJoinWithAlias(): void + { + $this->assertEquals( + /** @lang text */ + 'SELECT * FROM t1 INNER JOIN t2 AS t2_alias ON t1.key = t2_alias.key AND t1.foo IS NOT NULL OR t2_alias.bar <> ?', + $this->builder + ->from('t1') + ->join('t2 AS t2_alias', function (JoinClause $join) { + $join->on('t1.key', '=', 't2_alias.key') + ->whereNotNull('t1.foo') + ->where('t2_alias.bar', '<>', 'value', 'or'); + }) + ->toSql() + ); + } + + public function testJoinTableClassWithAlias(): void + { + $this->assertEquals( + /** @lang text */ + 'SELECT * FROM t1 INNER JOIN t2 AS t2_alias ON t1.key = t2_alias.key AND t1.foo IS NOT NULL OR t2_alias.bar <> ?', + $this->builder + ->from('t1') + ->join(new Table('t2', 't2_alias'), function (JoinClause $join) { + $join->on('t1.key', '=', 't2_alias.key') + ->whereNotNull('t1.foo') + ->where('t2_alias.bar', '<>', 'value', 'or'); + }) + ->toSql() + ); + } + + public function testJoinTableClass(): void + { + $this->assertEquals( + /** @lang text */ 'SELECT * FROM t1 INNER JOIN t2 ON t1.key = t2.key AND t1.foo IS NOT NULL OR t2.bar <> ?', + $this->builder + ->from('t1') + ->join(new Table('t2'), function (JoinClause $join) { + $join->on('t1.key', '=', 't2.key') + ->whereNotNull('t1.foo') + ->where('t2.bar', '<>', 'value', 'or'); + }) + ->toSql() + ); + } + + public function testJoinSub(): void + { + $sub = $this->builder->newQuery() + ->select(['id', 'name']) + ->from('table_2') + ->limit(1); + + $query = $this->builder->newQuery() + ->select([ + 'table_1.id', + 'sub_alias.name', + ]) + ->from('table_1') + ->join(new Table($sub, 'sub_alias'), function (JoinClause $join) { + $join->on('table_1.id', '=', 'sub_alias.id'); + }); + + $expected = "SELECT table_1.id, sub_alias.name FROM table_1 INNER JOIN (SELECT id, name FROM table_2 LIMIT 1) AS sub_alias ON table_1.id = sub_alias.id"; + + $this->assertEquals($expected, $query->toRawSql()); + } + + public function testLeftJoinSub(): void + { + $sub = $this->builder->newQuery() + ->select(['id', 'name']) + ->from('table_2') + ->limit(1); + + $query = $this->builder->newQuery() + ->select([ + 'table_1.id', + 'sub_alias.name', + ]) + ->from('table_1') + ->leftJoin(new Table($sub, 'sub_alias'), function (JoinClause $join) { + $join->on('table_1.id', '=', 'sub_alias.id'); + }); + + $expected = "SELECT table_1.id, sub_alias.name FROM table_1 LEFT JOIN (SELECT id, name FROM table_2 LIMIT 1) AS sub_alias ON table_1.id = sub_alias.id"; + + $this->assertEquals($expected, $query->toRawSql()); + } + + public function testJoinSubWithBindings(): void + { + $sub = $this->builder->newQuery() + ->select(['id', 'name']) + ->from('table_2') + ->where('foo', '=', 'bar') + ->limit(1); + + $query = $this->builder->newQuery() + ->select([ + 'table_1.id', + 'sub_alias.name', + ]) + ->from('table_1') + ->join(new Table($sub, 'sub_alias'), function (JoinClause $join) { + $join->on('table_1.id', '=', 'sub_alias.id'); + }); + + $expected = "SELECT table_1.id, sub_alias.name FROM table_1 INNER JOIN (SELECT id, name FROM table_2 WHERE foo = 'bar' LIMIT 1) AS sub_alias ON table_1.id = sub_alias.id"; + + $this->assertEquals($expected, $query->toRawSql()); + } } \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php index feef062..2db04c3 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/CriteriaBuilderTest.php @@ -2,14 +2,14 @@ namespace Tests\Unit; -use App\FacetSearch\Filters\ProductAttribute; -use App\FacetSearch\Filters\ProductCategories; -use App\FacetSearch\Filters\ProductForMainPage; -use App\FacetSearch\Filters\ProductManufacturer; -use App\FacetSearch\Filters\ProductModel; -use App\FacetSearch\Filters\ProductPrice; -use App\FacetSearch\Filters\ProductQuantity; -use App\FacetSearch\Filters\ProductStatus; +use App\Filters\ProductAttribute; +use App\Filters\ProductCategories; +use App\Filters\ProductForMainPage; +use App\Filters\ProductManufacturer; +use App\Filters\ProductModel; +use App\Filters\ProductPrice; +use App\Filters\ProductQuantity; +use App\Filters\ProductStatus; use DirectoryIterator; use InvalidArgumentException; use JsonException; @@ -60,8 +60,6 @@ class CriteriaBuilderTest extends TestCase $mysqlConnection = new MySqlConnection($this->getPdoMock()); $application->boot(); - $e = config('mainpage_products'); - $application->bind(ConnectionInterface::class, function () use ($mysqlConnection) { return $mysqlConnection; }); diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/RuleSerializerTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/RuleSerializerTest.php index e58880b..0216940 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/RuleSerializerTest.php +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/RuleSerializerTest.php @@ -2,7 +2,7 @@ namespace Tests\Unit; -use App\FacetSearch\Filters\ProductModel; +use App\Filters\ProductModel; use Openguru\OpenCartFramework\CriteriaBuilder\Criterion; use Openguru\OpenCartFramework\CriteriaBuilder\RuleSerializer; use Tests\TestCase; diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/TableTest.php b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/TableTest.php new file mode 100644 index 0000000..1057739 --- /dev/null +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/Unit/TableTest.php @@ -0,0 +1,55 @@ +assertEquals('table1', $table->getTable()); + } + + public function testToStringSub(): void + { + $connection = new MySqlConnection($this->getPdoMock()); + $builder = new Builder($connection, new MySqlGrammar()); + + $subQuery = $builder->newQuery() + ->select(['id']) + ->from('table1'); + + $table = new Table($subQuery, 'tbl_alias'); + + $this->assertEquals('(SELECT id FROM table1) AS tbl_alias', (string) $table); + } + + public function testThrowsExceptionForSubWithoutAlias(): void + { + $this->expectException(InvalidArgumentException::class); + + $connection = new MySqlConnection($this->getPdoMock()); + $builder = new Builder($connection, new MySqlGrammar()); + + $subQuery = $builder->newQuery() + ->select(['id']) + ->from('table1'); + + new Table($subQuery); + } + + public function testGetAlias(): void + { + $table = new Table('table1', 'alias'); + + $this->assertEquals('alias', $table->getAlias()); + } +} diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/output.sql index d6ad719..4c78656 100644 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/featured/output.sql @@ -10,6 +10,4 @@ SELECT FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id - AND product_description.language_id = 1 -WHERE - products.product_id IN (1, 2, 3) \ No newline at end of file + AND product_description.language_id = 1 \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/output.sql index 1624c61..4c78656 100644 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/latests/output.sql @@ -10,6 +10,4 @@ SELECT FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id - AND product_description.language_id = 1 -ORDER BY - products.date_modified DESC \ No newline at end of file + AND product_description.language_id = 1 \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/output.sql index ce10e86..4c78656 100644 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_for_main_page/most_viewed/output.sql @@ -10,6 +10,4 @@ SELECT FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id - AND product_description.language_id = 1 -ORDER BY - products.viewed DESC \ No newline at end of file + AND product_description.language_id = 1 \ No newline at end of file diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql index e753f88..c578d4a 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_4bf5415bae7c037731801559d0410697 ON products.product_id = product_specials_4bf5415bae7c037731801559d0410697.product_id - AND product_specials_4bf5415bae7c037731801559d0410697.customer_group_id = 1 - AND ( - product_specials_4bf5415bae7c037731801559d0410697.date_start = '0000-00-00' - OR product_specials_4bf5415bae7c037731801559d0410697.date_start < NOW() - ) - AND ( - product_specials_4bf5415bae7c037731801559d0410697.date_end = '0000-00-00' - OR product_specials_4bf5415bae7c037731801559d0410697.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_4bf5415bae7c037731801559d0410697 ON products.product_id = product_specials_4bf5415bae7c037731801559d0410697.product_id WHERE COALESCE( product_specials_4bf5415bae7c037731801559d0410697.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql index 762e530..c026f02 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_equals/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_f1ca65a396fc2e41a23a3661b84d1519 ON products.product_id = product_specials_f1ca65a396fc2e41a23a3661b84d1519.product_id - AND product_specials_f1ca65a396fc2e41a23a3661b84d1519.customer_group_id = 1 - AND ( - product_specials_f1ca65a396fc2e41a23a3661b84d1519.date_start = '0000-00-00' - OR product_specials_f1ca65a396fc2e41a23a3661b84d1519.date_start < NOW() - ) - AND ( - product_specials_f1ca65a396fc2e41a23a3661b84d1519.date_end = '0000-00-00' - OR product_specials_f1ca65a396fc2e41a23a3661b84d1519.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_f1ca65a396fc2e41a23a3661b84d1519 ON products.product_id = product_specials_f1ca65a396fc2e41a23a3661b84d1519.product_id WHERE COALESCE( product_specials_f1ca65a396fc2e41a23a3661b84d1519.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql index 6e5aa63..ced3015 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_empty_string/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_f0c4ece67502916e844720b12abc54a9 ON products.product_id = product_specials_f0c4ece67502916e844720b12abc54a9.product_id - AND product_specials_f0c4ece67502916e844720b12abc54a9.customer_group_id = 1 - AND ( - product_specials_f0c4ece67502916e844720b12abc54a9.date_start = '0000-00-00' - OR product_specials_f0c4ece67502916e844720b12abc54a9.date_start < NOW() - ) - AND ( - product_specials_f0c4ece67502916e844720b12abc54a9.date_end = '0000-00-00' - OR product_specials_f0c4ece67502916e844720b12abc54a9.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_f0c4ece67502916e844720b12abc54a9 ON products.product_id = product_specials_f0c4ece67502916e844720b12abc54a9.product_id WHERE COALESCE( product_specials_f0c4ece67502916e844720b12abc54a9.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql index 37ce826..4ad27f8 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_from_null/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_5173bd7b8335ab5a9f4e37227d0c317f ON products.product_id = product_specials_5173bd7b8335ab5a9f4e37227d0c317f.product_id - AND product_specials_5173bd7b8335ab5a9f4e37227d0c317f.customer_group_id = 1 - AND ( - product_specials_5173bd7b8335ab5a9f4e37227d0c317f.date_start = '0000-00-00' - OR product_specials_5173bd7b8335ab5a9f4e37227d0c317f.date_start < NOW() - ) - AND ( - product_specials_5173bd7b8335ab5a9f4e37227d0c317f.date_end = '0000-00-00' - OR product_specials_5173bd7b8335ab5a9f4e37227d0c317f.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_5173bd7b8335ab5a9f4e37227d0c317f ON products.product_id = product_specials_5173bd7b8335ab5a9f4e37227d0c317f.product_id WHERE COALESCE( product_specials_5173bd7b8335ab5a9f4e37227d0c317f.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql index bf57b81..e4734cd 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/between_num_as_string/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_7b934dfdfc5b809270875934c10acc06 ON products.product_id = product_specials_7b934dfdfc5b809270875934c10acc06.product_id - AND product_specials_7b934dfdfc5b809270875934c10acc06.customer_group_id = 1 - AND ( - product_specials_7b934dfdfc5b809270875934c10acc06.date_start = '0000-00-00' - OR product_specials_7b934dfdfc5b809270875934c10acc06.date_start < NOW() - ) - AND ( - product_specials_7b934dfdfc5b809270875934c10acc06.date_end = '0000-00-00' - OR product_specials_7b934dfdfc5b809270875934c10acc06.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_7b934dfdfc5b809270875934c10acc06 ON products.product_id = product_specials_7b934dfdfc5b809270875934c10acc06.product_id WHERE COALESCE( product_specials_7b934dfdfc5b809270875934c10acc06.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql index d8b44f3..c70a7c1 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id - AND product_specials_51a33d8bcfeece60de797c18e3800075.customer_group_id = 1 - AND ( - product_specials_51a33d8bcfeece60de797c18e3800075.date_start = '0000-00-00' - OR product_specials_51a33d8bcfeece60de797c18e3800075.date_start < NOW() - ) - AND ( - product_specials_51a33d8bcfeece60de797c18e3800075.date_end = '0000-00-00' - OR product_specials_51a33d8bcfeece60de797c18e3800075.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id WHERE COALESCE( product_specials_51a33d8bcfeece60de797c18e3800075.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql index cbb55bb..d1a14bc 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/equals_num_as_string/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_7de8997be994ada47d62cdfe2b7369c9 ON products.product_id = product_specials_7de8997be994ada47d62cdfe2b7369c9.product_id - AND product_specials_7de8997be994ada47d62cdfe2b7369c9.customer_group_id = 1 - AND ( - product_specials_7de8997be994ada47d62cdfe2b7369c9.date_start = '0000-00-00' - OR product_specials_7de8997be994ada47d62cdfe2b7369c9.date_start < NOW() - ) - AND ( - product_specials_7de8997be994ada47d62cdfe2b7369c9.date_end = '0000-00-00' - OR product_specials_7de8997be994ada47d62cdfe2b7369c9.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_7de8997be994ada47d62cdfe2b7369c9 ON products.product_id = product_specials_7de8997be994ada47d62cdfe2b7369c9.product_id WHERE COALESCE( product_specials_7de8997be994ada47d62cdfe2b7369c9.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql index 2201a9b..1609c7b 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_78ccac1dc1d86997e6eac0613f2eb5f3 ON products.product_id = product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.product_id - AND product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.customer_group_id = 1 - AND ( - product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.date_start = '0000-00-00' - OR product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.date_start < NOW() - ) - AND ( - product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.date_end = '0000-00-00' - OR product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_78ccac1dc1d86997e6eac0613f2eb5f3 ON products.product_id = product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.product_id WHERE COALESCE( product_specials_78ccac1dc1d86997e6eac0613f2eb5f3.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql index 2ff0599..33786b7 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/greater_or_equals/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_5816f1e65a3d296a26635f070d0439bc ON products.product_id = product_specials_5816f1e65a3d296a26635f070d0439bc.product_id - AND product_specials_5816f1e65a3d296a26635f070d0439bc.customer_group_id = 1 - AND ( - product_specials_5816f1e65a3d296a26635f070d0439bc.date_start = '0000-00-00' - OR product_specials_5816f1e65a3d296a26635f070d0439bc.date_start < NOW() - ) - AND ( - product_specials_5816f1e65a3d296a26635f070d0439bc.date_end = '0000-00-00' - OR product_specials_5816f1e65a3d296a26635f070d0439bc.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_5816f1e65a3d296a26635f070d0439bc ON products.product_id = product_specials_5816f1e65a3d296a26635f070d0439bc.product_id WHERE COALESCE( product_specials_5816f1e65a3d296a26635f070d0439bc.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql index d8b44f3..c70a7c1 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_discounts/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id - AND product_specials_51a33d8bcfeece60de797c18e3800075.customer_group_id = 1 - AND ( - product_specials_51a33d8bcfeece60de797c18e3800075.date_start = '0000-00-00' - OR product_specials_51a33d8bcfeece60de797c18e3800075.date_start < NOW() - ) - AND ( - product_specials_51a33d8bcfeece60de797c18e3800075.date_end = '0000-00-00' - OR product_specials_51a33d8bcfeece60de797c18e3800075.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id WHERE COALESCE( product_specials_51a33d8bcfeece60de797c18e3800075.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql index d8b44f3..c70a7c1 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/include_specials/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id - AND product_specials_51a33d8bcfeece60de797c18e3800075.customer_group_id = 1 - AND ( - product_specials_51a33d8bcfeece60de797c18e3800075.date_start = '0000-00-00' - OR product_specials_51a33d8bcfeece60de797c18e3800075.date_start < NOW() - ) - AND ( - product_specials_51a33d8bcfeece60de797c18e3800075.date_end = '0000-00-00' - OR product_specials_51a33d8bcfeece60de797c18e3800075.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_51a33d8bcfeece60de797c18e3800075 ON products.product_id = product_specials_51a33d8bcfeece60de797c18e3800075.product_id WHERE COALESCE( product_specials_51a33d8bcfeece60de797c18e3800075.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql index 61224d0..9a7a814 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_cf0f856fa900f18f5c8c0a57357532f5 ON products.product_id = product_specials_cf0f856fa900f18f5c8c0a57357532f5.product_id - AND product_specials_cf0f856fa900f18f5c8c0a57357532f5.customer_group_id = 1 - AND ( - product_specials_cf0f856fa900f18f5c8c0a57357532f5.date_start = '0000-00-00' - OR product_specials_cf0f856fa900f18f5c8c0a57357532f5.date_start < NOW() - ) - AND ( - product_specials_cf0f856fa900f18f5c8c0a57357532f5.date_end = '0000-00-00' - OR product_specials_cf0f856fa900f18f5c8c0a57357532f5.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_cf0f856fa900f18f5c8c0a57357532f5 ON products.product_id = product_specials_cf0f856fa900f18f5c8c0a57357532f5.product_id WHERE COALESCE( product_specials_cf0f856fa900f18f5c8c0a57357532f5.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql index 3269ce2..4fb358c 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/less_or_equals/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_08e0a0248dc92591ae55fdd966728ba0 ON products.product_id = product_specials_08e0a0248dc92591ae55fdd966728ba0.product_id - AND product_specials_08e0a0248dc92591ae55fdd966728ba0.customer_group_id = 1 - AND ( - product_specials_08e0a0248dc92591ae55fdd966728ba0.date_start = '0000-00-00' - OR product_specials_08e0a0248dc92591ae55fdd966728ba0.date_start < NOW() - ) - AND ( - product_specials_08e0a0248dc92591ae55fdd966728ba0.date_end = '0000-00-00' - OR product_specials_08e0a0248dc92591ae55fdd966728ba0.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_08e0a0248dc92591ae55fdd966728ba0 ON products.product_id = product_specials_08e0a0248dc92591ae55fdd966728ba0.product_id WHERE COALESCE( product_specials_08e0a0248dc92591ae55fdd966728ba0.price, diff --git a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql index 2ae0cc8..6d58168 100755 --- a/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql +++ b/module/oc_telegram_shop/upload/oc_telegram_shop/tests/fixtures/criteria_builder/product_price/not_equals/output.sql @@ -11,16 +11,28 @@ FROM oc_product AS products INNER JOIN oc_product_description AS product_description ON products.product_id = product_description.product_id AND product_description.language_id = 1 - LEFT JOIN oc_product_special AS product_specials_47d71067324729b89b13414a6ea869e0 ON products.product_id = product_specials_47d71067324729b89b13414a6ea869e0.product_id - AND product_specials_47d71067324729b89b13414a6ea869e0.customer_group_id = 1 - AND ( - product_specials_47d71067324729b89b13414a6ea869e0.date_start = '0000-00-00' - OR product_specials_47d71067324729b89b13414a6ea869e0.date_start < NOW() - ) - AND ( - product_specials_47d71067324729b89b13414a6ea869e0.date_end = '0000-00-00' - OR product_specials_47d71067324729b89b13414a6ea869e0.date_end > NOW() - ) + LEFT JOIN ( + SELECT + ps.product_id, + ps.price + FROM + oc_product_special AS ps + WHERE + ps.customer_group_id = 1 + AND ( + ps.date_start = '0000-00-00' + OR ps.date_start < NOW() + ) + AND ( + ps.date_end = '0000-00-00' + OR ps.date_end > NOW() + ) + ORDER BY + ps.priority ASC, + ps.price ASC + LIMIT + 1 + ) AS product_specials_47d71067324729b89b13414a6ea869e0 ON products.product_id = product_specials_47d71067324729b89b13414a6ea869e0.product_id WHERE COALESCE( product_specials_47d71067324729b89b13414a6ea869e0.price, diff --git a/spa/src/App.vue b/spa/src/App.vue index e3f2f9c..eee9235 100644 --- a/spa/src/App.vue +++ b/spa/src/App.vue @@ -1,12 +1,16 @@ @@ -50,3 +54,21 @@ watch( {immediate: true} ); + + \ No newline at end of file diff --git a/spa/src/components/CartButton.vue b/spa/src/components/CartButton.vue index 05b709b..669089f 100644 --- a/spa/src/components/CartButton.vue +++ b/spa/src/components/CartButton.vue @@ -2,7 +2,7 @@
{{ cart.productsCount }} -