@@ -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