|
1 | 1 | <?php |
2 | 2 |
|
3 | 3 | use Ensi\LaravelElasticQuery\Aggregating\Bucket; |
| 4 | +use Ensi\LaravelElasticQuery\Aggregating\FiltersCollection; |
4 | 5 | use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinMaxScoreAggregation; |
5 | 6 | use Ensi\LaravelElasticQuery\Aggregating\Metrics\TopHitsAggregation; |
6 | 7 | use Ensi\LaravelElasticQuery\Aggregating\MinMax; |
7 | 8 | use Ensi\LaravelElasticQuery\Contracts\AggregationsBuilder; |
| 9 | +use Ensi\LaravelElasticQuery\Filtering\Criterias\RangeBound; |
| 10 | +use Ensi\LaravelElasticQuery\Filtering\Criterias\Term; |
8 | 11 | use Ensi\LaravelElasticQuery\Search\Sorting\Sort; |
9 | 12 | use Ensi\LaravelElasticQuery\Tests\Data\Models\ProductsIndex; |
10 | 13 | use Ensi\LaravelElasticQuery\Tests\IntegrationTestCase; |
|
139 | 142 | assertCount(2, $results->get('codes')); |
140 | 143 | assertGreaterThanOrEqual($scores->first(), $scores->last()); |
141 | 144 | }); |
| 145 | + |
| 146 | +test('aggregation query filters', function (?string $defaultBucket) { |
| 147 | + /** @var IntegrationTestCase $this */ |
| 148 | + |
| 149 | + $filters = new FiltersCollection(); |
| 150 | + $filters->add('filter_tags', new Term('tags', 'video')); |
| 151 | + $filters->add('filter_rating', new RangeBound('rating', '>=', 7)); |
| 152 | + |
| 153 | + $topHits = new TopHitsAggregation('top_hits'); |
| 154 | + |
| 155 | + $results = ProductsIndex::aggregate() |
| 156 | + ->filters('group_by_filters', $filters, $topHits, otherBucketKey: $defaultBucket) |
| 157 | + ->get() |
| 158 | + ->get('group_by_filters') |
| 159 | + ->keyBy(fn (Bucket $bucket) => $bucket->key); |
| 160 | + |
| 161 | + $additionResult = $defaultBucket !== null ? 1 : 0; |
| 162 | + assertCount($filters->count() + $additionResult, $results); |
| 163 | + |
| 164 | + assertEqualsCanonicalizing( |
| 165 | + [1, 328], |
| 166 | + extractBucketValues($results, 'filter_tags', $topHits->name(), 'product_id') |
| 167 | + ); |
| 168 | + |
| 169 | + assertEqualsCanonicalizing( |
| 170 | + [1, 150, 405], |
| 171 | + extractBucketValues($results, 'filter_rating', $topHits->name(), 'product_id') |
| 172 | + ); |
| 173 | + |
| 174 | + if ($defaultBucket != null) { |
| 175 | + assertEqualsCanonicalizing( |
| 176 | + [319, 471], |
| 177 | + extractBucketValues($results, $defaultBucket, $topHits->name(), 'product_id') |
| 178 | + ); |
| 179 | + } |
| 180 | +})->with([null, 'default_bucket']); |
0 commit comments