Skip to content

Commit ac2f578

Browse files
authored
Merge pull request #35 from ensi-platform/task-111039_v7
#111039 add collapse search results
2 parents a55bfcc + 03642c3 commit ac2f578

File tree

7 files changed

+78
-1
lines changed

7 files changed

+78
-1
lines changed

src/Contracts/CollapsibleQuery.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Contracts;
4+
5+
interface CollapsibleQuery extends BoolQuery
6+
{
7+
public function collapse(string $field): static;
8+
}

src/Search/Collapsing/Collapse.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Search\Collapsing;
4+
5+
use Ensi\LaravelElasticQuery\Contracts\DSLAware;
6+
use Webmozart\Assert\Assert;
7+
8+
class Collapse implements DSLAware
9+
{
10+
public function __construct(private string $field)
11+
{
12+
Assert::stringNotEmpty(trim($field));
13+
}
14+
15+
public function field(): string
16+
{
17+
return $this->field;
18+
}
19+
20+
public function toDSL(): array
21+
{
22+
return ['field' => $this->field];
23+
}
24+
}

src/Search/SearchQuery.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,26 @@
55
use Closure;
66
use Ensi\LaravelElasticQuery\Concerns\DecoratesBoolQuery;
77
use Ensi\LaravelElasticQuery\Concerns\ExtendsSort;
8+
use Ensi\LaravelElasticQuery\Contracts\CollapsibleQuery;
89
use Ensi\LaravelElasticQuery\Contracts\SearchIndex;
910
use Ensi\LaravelElasticQuery\Contracts\SortableQuery;
1011
use Ensi\LaravelElasticQuery\Contracts\SortOrder;
1112
use Ensi\LaravelElasticQuery\Filtering\BoolQueryBuilder;
13+
use Ensi\LaravelElasticQuery\Search\Collapsing\Collapse;
1214
use Ensi\LaravelElasticQuery\Search\Sorting\SortBuilder;
1315
use Ensi\LaravelElasticQuery\Search\Sorting\SortCollection;
1416
use Illuminate\Support\Collection;
1517
use InvalidArgumentException;
1618
use Webmozart\Assert\Assert;
1719

18-
class SearchQuery implements SortableQuery
20+
class SearchQuery implements SortableQuery, CollapsibleQuery
1921
{
2022
use DecoratesBoolQuery;
2123
use ExtendsSort;
2224

2325
protected BoolQueryBuilder $boolQuery;
2426
protected SortCollection $sorts;
27+
protected ?Collapse $collapse = null;
2528
protected ?int $size = null;
2629
protected ?int $from = null;
2730
protected array $fields = [];
@@ -126,6 +129,10 @@ protected function execute(
126129
$dsl['sort'] = $sorts->toDSL();
127130
}
128131

132+
if (!is_null($this->collapse)) {
133+
$dsl['collapse'] = $this->collapse->toDSL();
134+
}
135+
129136
if ($cursor !== null && !$cursor->isBOF()) {
130137
$dsl['search_after'] = $cursor->toDSL();
131138
}
@@ -156,6 +163,13 @@ public function sortByNested(string $field, Closure $callback): static
156163
return $this;
157164
}
158165

166+
public function collapse(string $field): static
167+
{
168+
$this->collapse = new Collapse($field);
169+
170+
return $this;
171+
}
172+
159173
public function take(int $count): static
160174
{
161175
Assert::greaterThanEq($count, 0);

tests/Functional/Search/SearchQueryTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,14 @@ public function testSortByNested(): void
6868
}
6969

7070
//endregion
71+
72+
//region Collapsing
73+
public function testCollapse(): void
74+
{
75+
$results = $this->testing->collapse('vat')->get();
76+
77+
$this->assertCount(2, $results);
78+
}
79+
80+
//endregion
7181
}

tests/Seeds/ProductIndexSeeder.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class ProductIndexSeeder extends IndexSeeder
4848
'tags' => ['type' => 'keyword'],
4949
'rating' => ['type' => 'integer'],
5050
'package' => ['type' => 'keyword'],
51+
'vat' => ['type' => 'integer'],
5152

5253
'offers' => [
5354
'type' => 'nested',

tests/Seeds/fixtures/products_default.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"package": null,
99
"description": "TV station description",
1010
"tags": ["video"],
11+
"vat": 18,
1112
"offers": [
1213
{"seller_id": 10, "active": true, "price": 20000.0},
1314
{"seller_id": 15, "active": true, "price": 21000.0},
@@ -23,6 +24,7 @@
2324
"package": "bottle",
2425
"description": "TASSAY description water",
2526
"tags": ["drinks", "watter"],
27+
"vat": 20,
2628
"offers": [
2729
{"seller_id": 10, "active": false, "price": 168.0},
2830
{"seller_id": 15, "active": true, "price": 210.0},
@@ -37,6 +39,7 @@
3739
"rating": 0,
3840
"description": "L gloves descriptions",
3941
"tags": ["clothes", "gloves"],
42+
"vat": 20,
4043
"offers": [
4144
{"seller_id": 10, "active": false, "price": 980.0},
4245
{"seller_id": 15, "active": false, "price": 980.0},
@@ -52,6 +55,7 @@
5255
"package": null,
5356
"description": "Nice tv",
5457
"tags": ["video"],
58+
"vat": 18,
5559
"offers": [
5660
{"seller_id": 90, "active": true, "price": 41999.0},
5761
{"seller_id": 20, "active": true, "price": 28990.0}
@@ -66,6 +70,7 @@
6670
"package": "bottle",
6771
"description": "S.Pellegrino from Dolomites. Pure water.",
6872
"tags": ["drinks", "water"],
73+
"vat": 20,
6974
"offers": [
7075
{"seller_id": 10, "active": false, "price": 611.0},
7176
{"seller_id": 15, "active": false, "price": 620.0}
@@ -79,6 +84,7 @@
7984
"rating": 3,
8085
"description": "VITTOVAR description",
8186
"tags": ["clothes", "gloves"],
87+
"vat": 18,
8288
"offers": [
8389
]
8490
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Ensi\LaravelElasticQuery\Tests\Unit\Search\Sorting;
4+
5+
use Ensi\LaravelElasticQuery\Search\Collapsing\Collapse;
6+
use Ensi\LaravelElasticQuery\Tests\Unit\UnitTestCase;
7+
8+
class CollapseTest extends UnitTestCase
9+
{
10+
public function testFieldOnly(): void
11+
{
12+
$this->assertEquals(['field' => 'product_id'], (new Collapse('product_id'))->toDSL());
13+
}
14+
}

0 commit comments

Comments
 (0)