Skip to content
This repository was archived by the owner on Jun 25, 2025. It is now read-only.

Commit 25b18fe

Browse files
authored
Merge pull request #85 from apisearch-io/feature/multiquery
Added model for multiquery
2 parents 6b2d905 + 256c5ec commit 25b18fe

File tree

5 files changed

+179
-21
lines changed

5 files changed

+179
-21
lines changed

Query/Query.php

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,13 @@ class Query implements HttpTransportable
196196
*/
197197
private $metadata = [];
198198

199+
/**
200+
* @var Query[]
201+
*
202+
* Sub queries
203+
*/
204+
private $subqueries = [];
205+
199206
/**
200207
* Construct.
201208
*
@@ -315,6 +322,21 @@ public static function createByUUIDs(array $uuids): self
315322
return $query;
316323
}
317324

325+
/**
326+
* Create multiquery.
327+
*
328+
* @param Query[] $queries
329+
*
330+
* @return Query
331+
*/
332+
public static function createMultiquery(array $queries)
333+
{
334+
$query = Query::createMatchAll();
335+
$query->subqueries = $queries;
336+
337+
return $query;
338+
}
339+
318340
/**
319341
* Select fields.
320342
*
@@ -1303,33 +1325,59 @@ public function getUser(): ? User
13031325
}
13041326

13051327
/**
1306-
* Set metadata
1328+
* Set metadata.
13071329
*
13081330
* @param string $name
1309-
* @param mixed $value
1331+
* @param mixed $value
13101332
*
13111333
* @return Query
13121334
*/
13131335
public function setMetadataValue(
13141336
string $name,
13151337
$value
1316-
)
1317-
{
1338+
): self {
13181339
$this->metadata[$name] = $value;
13191340

13201341
return $this;
13211342
}
13221343

13231344
/**
1324-
* Get metadata
1345+
* Get metadata.
13251346
*
13261347
* @return array
13271348
*/
1328-
public function getMetadata() : array
1349+
public function getMetadata(): array
13291350
{
13301351
return $this->metadata;
13311352
}
13321353

1354+
/**
1355+
* Add subquery.
1356+
*
1357+
* @param string $name
1358+
* @param Query $query
1359+
*
1360+
* @return Query
1361+
*/
1362+
public function addSubQuery(
1363+
string $name,
1364+
Query $query
1365+
): self {
1366+
$this->subqueries[$name] = $query;
1367+
1368+
return $this;
1369+
}
1370+
1371+
/**
1372+
* Get subqueries.
1373+
*
1374+
* @return Query[]
1375+
*/
1376+
public function getSubqueries(): array
1377+
{
1378+
return $this->subqueries;
1379+
}
1380+
13331381
/**
13341382
* To array.
13351383
*
@@ -1389,6 +1437,11 @@ public function toArray(): array
13891437
? $this->user->toArray()
13901438
: null,
13911439
'metadata' => $this->metadata,
1440+
'subqueries' => array_filter(
1441+
array_map(function (Query $query) {
1442+
return $query->toArray();
1443+
}, $this->subqueries)
1444+
),
13921445
'items_promoted' => array_filter(
13931446
array_map(function (ItemUUID $itemUUID) {
13941447
return $itemUUID->toArray();
@@ -1461,6 +1514,10 @@ public static function createFromArray(array $array): self
14611514
$query->user = User::createFromArray($array['user']);
14621515
}
14631516

1517+
$query->subqueries = array_map(function (array $query) {
1518+
return Query::createFromArray($query);
1519+
}, $array['subqueries'] ?? []);
1520+
14641521
return $query;
14651522
}
14661523
}

Repository/TransformableRepository.php

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,37 @@ public function query(
134134
->repository
135135
->query($query, $parameters);
136136

137-
return Result::create(
138-
$result->getQuery(),
139-
$result->getTotalItems(),
140-
$result->getTotalHits(),
141-
$result->getAggregations(),
142-
$result->getSuggests(),
143-
$this
144-
->transformer
145-
->fromItems(
146-
$result->getItems()
147-
)
148-
);
137+
return $this->applyTransformersToResult($result);
138+
}
139+
140+
/**
141+
* Apply transformers on Result.
142+
*
143+
* @param Result $result
144+
*
145+
* @return Result
146+
*/
147+
private function applyTransformersToResult(Result $result): Result
148+
{
149+
return empty($result->getSubresults())
150+
? Result::create(
151+
$result->getQuery(),
152+
$result->getTotalItems(),
153+
$result->getTotalHits(),
154+
$result->getAggregations(),
155+
$result->getSuggests(),
156+
$this
157+
->transformer
158+
->fromItems(
159+
$result->getItems()
160+
)
161+
)
162+
: Result::createMultiResult(
163+
$result->getQuery(),
164+
array_map(function (Result $subresult) {
165+
return $this->applyTransformersToResult($subresult);
166+
}, $result->getSubresults())
167+
);
149168
}
150169

151170
/**

Result/Result.php

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ class Result implements HttpTransportable
7373
*/
7474
private $itemsGroupedByTypeCache;
7575

76+
/**
77+
* @var Result[]
78+
*
79+
* Subresults
80+
*/
81+
private $subresults = [];
82+
7683
/**
7784
* Result constructor.
7885
*
@@ -123,6 +130,24 @@ public static function create(
123130
return $result;
124131
}
125132

133+
/**
134+
* Create multiquery Result.
135+
*
136+
* @param Query $query
137+
* @param Result[] $subresults
138+
*
139+
* @return Result
140+
*/
141+
public static function createMultiResult(
142+
Query $query,
143+
array $subresults
144+
) {
145+
$result = new Result($query, 0, 0);
146+
$result->subresults = $subresults;
147+
148+
return $result;
149+
}
150+
126151
/**
127152
* Add item.
128153
*
@@ -324,6 +349,16 @@ public function getTotalHits(): int
324349
return $this->totalHits;
325350
}
326351

352+
/**
353+
* Get subresults.
354+
*
355+
* @return Result[]
356+
*/
357+
public function getSubresults(): array
358+
{
359+
return $this->subresults;
360+
}
361+
327362
/**
328363
* To array.
329364
*
@@ -342,6 +377,9 @@ public function toArray(): array
342377
? $this->aggregations->toArray()
343378
: null,
344379
'suggests' => $this->suggests,
380+
'subresults' => array_map(function (Result $result) {
381+
return $result->toArray();
382+
}, $this->subresults),
345383
], function ($element) {
346384
return
347385
!(
@@ -360,7 +398,7 @@ public function toArray(): array
360398
*/
361399
public static function createFromArray(array $array): self
362400
{
363-
return self::create(
401+
$result = self::create(
364402
Query::createFromArray($array['query'] ?? []),
365403
$array['total_items'] ?? 0,
366404
$array['total_hits'] ?? 0,
@@ -372,5 +410,13 @@ public static function createFromArray(array $array): self
372410
return Item::createFromArray($item);
373411
}, $array['items'] ?? [])
374412
);
413+
414+
$result->subresults = array_filter(
415+
array_map(function (array $subresultAsArray) {
416+
return Result::createFromArray($subresultAsArray);
417+
}, $array['subresults'] ?? [])
418+
);
419+
420+
return $result;
375421
}
376422
}

Tests/Query/QueryTest.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public function testValues()
151151
}
152152

153153
/**
154-
* Test metadata
154+
* Test metadata.
155155
*/
156156
public function testMetadata()
157157
{
@@ -160,8 +160,24 @@ public function testMetadata()
160160
$query->setMetadataValue('b', ['b1', 'b2']);
161161
$this->assertEquals([
162162
'a' => 'a1',
163-
'b' => ['b1', 'b2']
163+
'b' => ['b1', 'b2'],
164164
], $query->getMetadata());
165165
$this->assertEquals($query, HttpHelper::emulateHttpTransport($query));
166166
}
167+
168+
/**
169+
* Test subqueries.
170+
*/
171+
public function testSubqueries()
172+
{
173+
$query = Query::createMatchAll();
174+
$query->addSubQuery('sub1', Query::create('sub1'));
175+
$query->addSubQuery('sub2', Query::create('sub2'));
176+
$query->addSubQuery('sub3', Query::create('sub3'));
177+
$this->assertCount(3, $query->getSubqueries());
178+
$subqueries = HttpHelper::emulateHttpTransport($query)->getSubqueries();
179+
$this->assertEquals('sub1', $subqueries['sub1']->getQueryText());
180+
$this->assertEquals('sub2', $subqueries['sub2']->getQueryText());
181+
$this->assertEquals('sub3', $subqueries['sub3']->getQueryText());
182+
}
167183
}

Tests/Result/ResultTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Apisearch\Result\Aggregation;
2222
use Apisearch\Result\Aggregations;
2323
use Apisearch\Result\Result;
24+
use Apisearch\Tests\HttpHelper;
2425
use PHPUnit\Framework\TestCase;
2526

2627
/**
@@ -193,4 +194,23 @@ public function testCreateFromArrayAllValues()
193194
$this->assertCount(2, $result->getItems());
194195
$this->assertEquals('product', $result->getFirstItem()->getType());
195196
}
197+
198+
/**
199+
* Test multi result
200+
*/
201+
public function testMultiResult()
202+
{
203+
$query = Query::createMatchAll();
204+
$result = Result::createMultiResult($query, [
205+
'res1' => Result::create($query, 10, 3, null, [], []),
206+
'res2' => Result::create($query, 10, 4, null, [], []),
207+
'res3' => Result::create($query, 10, 5, null, [], []),
208+
]);
209+
210+
$this->assertCount(3, $result->getSubresults());
211+
$subqueries = HttpHelper::emulateHttpTransport($result)->getSubresults();
212+
$this->assertEquals(3, $subqueries['res1']->getTotalHits());
213+
$this->assertEquals(4, $subqueries['res2']->getTotalHits());
214+
$this->assertEquals(5, $subqueries['res3']->getTotalHits());
215+
}
196216
}

0 commit comments

Comments
 (0)