|
1 | | -import { map, mapValues, clone, keys } from 'lodash-es'; |
| 1 | +import { map, keys } from 'lodash-es'; |
2 | 2 | import FastBitSet from 'fastbitset'; |
3 | 3 | import { |
4 | 4 | facets_ids, |
@@ -71,64 +71,50 @@ export class Facets { |
71 | 71 | return this._items_map[_id]; |
72 | 72 | } |
73 | 73 |
|
74 | | - /* |
75 | | - * |
76 | | - * ids is optional only when there is query |
77 | | - */ |
78 | | - search(input, data) { |
| 74 | + search(input, data = {}) { |
79 | 75 | const config = this.config; |
80 | | - data = data || Object.create(null); |
81 | | - |
82 | | - // consider removing clone |
83 | | - const temp_facet = clone(this.facets); |
| 76 | + const temp_facet = {}; |
84 | 77 |
|
85 | 78 | temp_facet.not_ids = facets_ids( |
86 | | - temp_facet['bits_data'], |
| 79 | + this.facets.bits_data, |
87 | 80 | input.not_filters |
88 | 81 | ); |
89 | 82 |
|
90 | | - let temp_data; |
91 | | - |
92 | 83 | const filters = input_to_facet_filters(input, config); |
93 | | - temp_data = matrix(this.facets, filters); |
| 84 | + let temp_data = matrix(this.facets, filters); |
94 | 85 |
|
95 | 86 | if (input.filters_query) { |
96 | | - const filters = parse_boolean_query(input.filters_query); |
97 | | - temp_data = filters_matrix(temp_data, filters); |
| 87 | + const filtersQuery = parse_boolean_query(input.filters_query); |
| 88 | + temp_data = filters_matrix(temp_data, filtersQuery); |
98 | 89 | } |
99 | 90 |
|
100 | | - temp_facet['bits_data_temp'] = temp_data['bits_data_temp']; |
101 | | - |
102 | | - mapValues(temp_facet['bits_data_temp'], function (values, key) { |
103 | | - mapValues( |
104 | | - temp_facet['bits_data_temp'][key], |
105 | | - function (facet_indexes, key2) { |
106 | | - if (data.query_ids) { |
107 | | - temp_facet['bits_data_temp'][key][key2] = |
108 | | - data.query_ids.new_intersection( |
109 | | - temp_facet['bits_data_temp'][key][key2] |
110 | | - ); |
111 | | - } |
112 | | - |
113 | | - if (data.test) { |
114 | | - temp_facet['data'][key][key2] = |
115 | | - temp_facet['bits_data_temp'][key][key2].array(); |
116 | | - } |
| 91 | + temp_facet.bits_data_temp = temp_data.bits_data_temp; |
| 92 | + const bitsDataTemp = temp_facet.bits_data_temp; |
| 93 | + |
| 94 | + if (data.query_ids) { |
| 95 | + for (const key in bitsDataTemp) { |
| 96 | + for (const key2 in bitsDataTemp[key]) { |
| 97 | + bitsDataTemp[key][key2] = data.query_ids.new_intersection( |
| 98 | + bitsDataTemp[key][key2] |
| 99 | + ); |
117 | 100 | } |
118 | | - ); |
119 | | - }); |
| 101 | + } |
| 102 | + } |
120 | 103 |
|
121 | | - /** |
122 | | - * calculating ids (for a list of items) |
123 | | - * facets ids is faster and filter ids because filter ids makes union each to each filters |
124 | | - * filter ids needs to be used if there is filters query |
125 | | - */ |
126 | | - if (input.filters_query) { |
127 | | - temp_facet.ids = filters_ids(temp_facet['bits_data_temp']); |
128 | | - } else { |
129 | | - temp_facet.ids = facets_ids(temp_facet['bits_data_temp'], input.filters); |
| 104 | + if (data.test) { |
| 105 | + temp_facet.data = {}; |
| 106 | + for (const key in bitsDataTemp) { |
| 107 | + temp_facet.data[key] = {}; |
| 108 | + for (const key2 in bitsDataTemp[key]) { |
| 109 | + temp_facet.data[key][key2] = bitsDataTemp[key][key2].array(); |
| 110 | + } |
| 111 | + } |
130 | 112 | } |
131 | 113 |
|
| 114 | + temp_facet.ids = input.filters_query |
| 115 | + ? filters_ids(bitsDataTemp) |
| 116 | + : facets_ids(bitsDataTemp, input.filters); |
| 117 | + |
132 | 118 | return temp_facet; |
133 | 119 | } |
134 | 120 | } |
0 commit comments