Skip to content

Commit 90713cc

Browse files
committed
Allow typesense to handle pagination
1 parent 5cda46a commit 90713cc

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

src/Typesense/Index.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public function update()
9393
return $this;
9494
}
9595

96-
public function searchUsingApi($query, array $options = []): Collection
96+
public function searchUsingApi($query, array $options = []): array
9797
{
9898
$options['q'] = $query ?? '';
9999

@@ -114,13 +114,16 @@ public function searchUsingApi($query, array $options = []): Collection
114114

115115
$searchResults = $this->getOrCreateIndex()->documents->search($options);
116116

117-
return collect($searchResults['hits'] ?? [])
118-
->map(function ($result, $i) {
119-
$result['document']['reference'] = $result['document']['id'];
120-
$result['document']['search_score'] = (int) ($result['text_match'] ?? 0);
121-
122-
return $result['document'];
123-
});
117+
return [
118+
'raw' => $searchResults,
119+
'results' => collect($searchResults['hits'] ?? [])
120+
->map(function ($result, $i) {
121+
$result['document']['reference'] = $result['document']['id'];
122+
$result['document']['search_score'] = (int) ($result['text_match'] ?? 0);
123+
124+
return $result['document'];
125+
}),
126+
];
124127
}
125128

126129
public function getOrCreateIndex()

src/Typesense/Query.php

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,56 @@
22

33
namespace StatamicRadPack\Typesense\Typesense;
44

5+
use Illuminate\Pagination\Paginator;
56
use Statamic\Search\QueryBuilder;
67

78
class Query extends QueryBuilder
89
{
10+
public $page;
11+
public $perPage;
12+
13+
public $query;
14+
915
public function getSearchResults($query)
1016
{
11-
return $this->index->searchUsingApi($query);
17+
$this->query = $query;
18+
19+
return $this;
20+
}
21+
22+
private function getApiResults()
23+
{
24+
return $this->index->searchUsingApi($this->query ?? '', ['per_page' => $this->perPage, 'page' => $this->page]);
25+
}
26+
27+
public function forPage($page, $perPage = null)
28+
{
29+
$this->page = $page;
30+
$this->perPage = $perPage;
31+
32+
return $this;
33+
}
34+
35+
public function getBaseItems()
36+
{
37+
$results = $this->getApiResults();
38+
39+
return $this->transformResults($results['results']);
40+
}
41+
42+
public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
43+
{
44+
$page = $page ?: Paginator::resolveCurrentPage($pageName);
45+
46+
$perPage = $perPage ?: $this->defaultPerPageSize();
47+
48+
$this->forPage($page, $perPage);
49+
50+
$results = $this->getApiResults();
51+
52+
return $this->paginator($this->transformResults($results['results']), $results['raw']['found'], $perPage, $page, [
53+
'path' => Paginator::resolveCurrentPath(),
54+
'pageName' => $pageName,
55+
]);
1256
}
1357
}

tests/Unit/IndexTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,10 @@ public function it_sorts_by_specified_order()
126126

127127
$results = Facades\Search::index('typesense_index')->searchUsingApi('*', ['sort_by' => 'title:asc']);
128128

129-
$this->assertSame(['Entry 1', 'Entry 2'], collect($results)->pluck('title')->all());
129+
$this->assertSame(['Entry 1', 'Entry 2'], collect($results['raw']['hits'])->pluck('title')->all());
130130

131131
$results = Facades\Search::index('typesense_index')->searchUsingApi('*', ['sort_by' => 'title:desc']);
132132

133-
$this->assertSame(['Entry 2', 'Entry 1'], collect($results)->pluck('title')->all());
133+
$this->assertSame(['Entry 2', 'Entry 1'], collect($results['raw']['hits'])->pluck('title')->all());
134134
}
135135
}

0 commit comments

Comments
 (0)