Skip to content

Commit 32b7a46

Browse files
authored
Optimize paging for _ids and facet-only queries (#154)
1 parent 67f8a80 commit 32b7a46

File tree

3 files changed

+52
-24
lines changed

3 files changed

+52
-24
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "itemsjs",
3-
"version": "2.4.3",
3+
"version": "2.4.4",
44
"description": "Created to perform fast search on small json dataset (up to 1000 elements).",
55
"type": "module",
66
"scripts": {

src/lib.js

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -89,42 +89,70 @@ export function search(items, input, configuration, fulltext, facets) {
8989
);
9090
}
9191

92-
// new filters to items
93-
// -------------------------------------
94-
let filtered_indexes = filtered_indexes_bitmap.array();
92+
// Early exit: per_page = 0 and no need to materialize items (facet-only query)
93+
if (
94+
per_page === 0 &&
95+
!is_all_filtered_items &&
96+
!input.sort &&
97+
!_ids
98+
) {
99+
const filtered_indexes = filtered_indexes_bitmap.array();
95100

96-
let filtered_items = filtered_indexes.map((_id) => {
97-
return facets.get_item(_id);
98-
});
101+
const total_time = new Date().getTime() - total_time_start;
102+
103+
return {
104+
pagination: {
105+
per_page: per_page,
106+
page: page,
107+
total: filtered_indexes.length,
108+
},
109+
timings: {
110+
total: total_time,
111+
facets: facets_time,
112+
search: search_time,
113+
sorting: 0,
114+
},
115+
data: {
116+
items: [],
117+
allFilteredItems: null,
118+
aggregations: getBuckets(
119+
facet_result,
120+
input,
121+
configuration.aggregations,
122+
),
123+
},
124+
};
125+
}
99126

100127
/**
101128
* sorting items
102129
*/
103130
let paginationApplied = false;
104131
const sorting_start_time = new Date().getTime();
105132
let sorting_time = 0;
133+
134+
// collect ids once; reuse in branches below
135+
let filtered_indexes = filtered_indexes_bitmap.array();
136+
let filtered_items;
137+
106138
if (input.sort) {
139+
filtered_items = filtered_indexes.map((_id) => facets.get_item(_id));
107140
filtered_items = sorted_items(
108141
filtered_items,
109142
input.sort,
110143
configuration.sortings,
111144
);
145+
} else if (_ids) {
146+
// when user passes explicit ids/_ids we only materialize items for the current page
147+
filtered_indexes = _ids.filter((v) => filtered_indexes_bitmap.has(v));
148+
const filtered_items_indexes = filtered_indexes.slice(
149+
(page - 1) * per_page,
150+
page * per_page,
151+
);
152+
filtered_items = filtered_items_indexes.map((_id) => facets.get_item(_id));
153+
paginationApplied = true;
112154
} else {
113-
if (_ids) {
114-
filtered_indexes = _ids.filter((v) => {
115-
return filtered_indexes_bitmap.has(v);
116-
});
117-
118-
const filtered_items_indexes = filtered_indexes.slice(
119-
(page - 1) * per_page,
120-
page * per_page,
121-
);
122-
filtered_items = filtered_items_indexes.map((_id) => {
123-
return facets.get_item(_id);
124-
});
125-
126-
paginationApplied = true;
127-
}
155+
filtered_items = filtered_indexes.map((_id) => facets.get_item(_id));
128156
}
129157
// pagination
130158
if (!paginationApplied) {

0 commit comments

Comments
 (0)