|
2 | 2 |
|
3 | 3 | use Ensi\LaravelElasticQuery\Aggregating\AggregationCollection; |
4 | 4 | use Ensi\LaravelElasticQuery\Aggregating\Bucket; |
5 | | -use Ensi\LaravelElasticQuery\Aggregating\BucketCollection; |
| 5 | +use Ensi\LaravelElasticQuery\Aggregating\Bucket\ReverseNestedAggregation; |
6 | 6 | use Ensi\LaravelElasticQuery\Aggregating\FiltersCollection; |
| 7 | +use Ensi\LaravelElasticQuery\Aggregating\Metrics\CardinalityAggregation; |
7 | 8 | use Ensi\LaravelElasticQuery\Aggregating\Metrics\MinMaxScoreAggregation; |
8 | 9 | use Ensi\LaravelElasticQuery\Aggregating\Metrics\ScriptAggregation; |
9 | 10 | use Ensi\LaravelElasticQuery\Aggregating\Metrics\TopHitsAggregation; |
|
264 | 265 | ); |
265 | 266 | }); |
266 | 267 |
|
267 | | -test('reverse nested aggregation query', function () { |
| 268 | +test('reverse nested aggregation with specific data', function () { |
268 | 269 | /** @var IntegrationTestCase $this */ |
269 | 270 |
|
270 | 271 | $results = ProductsIndex::aggregate() |
| 272 | + ->where('active', true) |
271 | 273 | ->nested('offers', function ($builder) { |
272 | | - $builder->terms('offer_prices', 'offers.price', 5) |
273 | | - ->reverseNested('root_stats', function ($reverseBuilder) { |
274 | | - $reverseBuilder->cardinality('unique_products', 'product_id') |
275 | | - ->count('total_products', 'product_id'); |
276 | | - }); |
| 274 | + $reverseAggs = new AggregationCollection(); |
| 275 | + $reverseAggs->add(new CardinalityAggregation( |
| 276 | + 'product_id', |
| 277 | + 'product_id' |
| 278 | + )); |
| 279 | + $reverseNested = new ReverseNestedAggregation('product_info', $reverseAggs); |
| 280 | + |
| 281 | + $compositeAggs = new AggregationCollection(); |
| 282 | + $compositeAggs->add($reverseNested); |
| 283 | + |
| 284 | + $builder->terms('sellers', 'seller_id', 10, composite: $compositeAggs); |
277 | 285 | }) |
278 | 286 | ->get(); |
279 | 287 |
|
280 | | - $prices = $results->get('offer_prices'); |
| 288 | + $sellers = $results->get('sellers'); |
281 | 289 |
|
282 | | - expect($prices)->toBeInstanceOf(BucketCollection::class); |
| 290 | + $seller10Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 10); |
| 291 | + expect($seller10Bucket)->not->toBeNull(); |
| 292 | + expect($seller10Bucket->getCompositeValue('product_id'))->toBe(3); |
283 | 293 |
|
284 | | - foreach ($prices as $bucket) { |
285 | | - expect($bucket->getCompositeValue('unique_products'))->toBeGreaterThan(0); |
286 | | - expect($bucket->getCompositeValue('total_products'))->toBeGreaterThan(0); |
287 | | - } |
| 294 | + $seller15Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 15); |
| 295 | + expect($seller15Bucket)->not->toBeNull(); |
| 296 | + expect($seller15Bucket->getCompositeValue('product_id'))->toBe(3); |
| 297 | + |
| 298 | + $seller20Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 20); |
| 299 | + expect($seller20Bucket)->not->toBeNull(); |
| 300 | + expect($seller20Bucket->getCompositeValue('product_id'))->toBe(3); |
| 301 | + |
| 302 | + $seller90Bucket = $sellers->first(fn (Bucket $bucket) => $bucket->key == 90); |
| 303 | + expect($seller90Bucket)->not->toBeNull(); |
| 304 | + expect($seller90Bucket->getCompositeValue('product_id'))->toBe(1); |
288 | 305 | }); |
0 commit comments