@@ -91,7 +91,7 @@ public void requestCompleted(JSONObject content, AlgoliaException error) {
91
91
* @param refinements Map representing the current refinements
92
92
* @return The disjunctive refinements
93
93
*/
94
- static private @ NonNull <T extends Collection <String >> Map <String , T > computeDisjunctiveRefinements (@ NonNull Collection <String > disjunctiveFacets , @ NonNull Map <String , T > refinements )
94
+ static private @ NonNull <T extends Collection <String >> Map <String , T > filterDisjunctiveRefinements (@ NonNull Collection <String > disjunctiveFacets , @ NonNull Map <String , T > refinements )
95
95
{
96
96
Map <String , T > disjunctiveRefinements = new HashMap <>();
97
97
for (Map .Entry <String , T > elt : refinements .entrySet ()) {
@@ -112,91 +112,63 @@ public void requestCompleted(JSONObject content, AlgoliaException error) {
112
112
*/
113
113
static private @ NonNull <T extends Collection <String >> List <Query > computeDisjunctiveFacetingQueries (@ NonNull Query query , @ NonNull Collection <String > disjunctiveFacets , @ NonNull Map <String , T > refinements ) {
114
114
// Retain only refinements corresponding to the disjunctive facets.
115
- Map <String , ? extends Collection <String >> disjunctiveRefinements = computeDisjunctiveRefinements (disjunctiveFacets , refinements );
115
+ Map <String , ? extends Collection <String >> disjunctiveRefinements = filterDisjunctiveRefinements (disjunctiveFacets , refinements );
116
116
117
117
// build queries
118
- // TODO: Refactor using JSON array notation: safer and clearer.
119
118
List <Query > queries = new ArrayList <>();
120
- // hits + regular facets query
121
- StringBuilder filters = new StringBuilder ();
122
- boolean first_global = true ;
119
+
120
+ // first query: hits + regular facets
121
+ JSONArray facetFilters = new JSONArray () ;
123
122
for (Map .Entry <String , T > elt : refinements .entrySet ()) {
124
- StringBuilder or = new StringBuilder ();
125
- or .append ("(" );
126
- boolean first = true ;
123
+ JSONArray orFilters = new JSONArray ();
124
+
127
125
for (String val : elt .getValue ()) {
126
+ // When already refined facet, or with existing refinements
128
127
if (disjunctiveRefinements .containsKey (elt .getKey ())) {
129
- // disjunctive refinements are ORed
130
- if (!first ) {
131
- or .append (',' );
132
- }
133
- first = false ;
134
- or .append (String .format ("%s:%s" , elt .getKey (), val ));
128
+ orFilters .put (formatFilter (elt , val ));
135
129
} else {
136
- if (!first_global ) {
137
- filters .append (',' );
138
- }
139
- first_global = false ;
140
- filters .append (String .format ("%s:%s" , elt .getKey (), val ));
130
+ facetFilters .put (formatFilter (elt , val ));
141
131
}
142
132
}
143
133
// Add or
144
134
if (disjunctiveRefinements .containsKey (elt .getKey ())) {
145
- or .append (')' );
146
- if (!first_global ) {
147
- filters .append (',' );
148
- }
149
- first_global = false ;
150
- filters .append (or .toString ());
135
+ facetFilters .put (orFilters );
151
136
}
152
137
}
153
138
154
- queries .add (new Query (query ).set ( " facetFilters" , filters . toString () ));
139
+ queries .add (new Query (query ).setFacetFilters ( facetFilters ));
155
140
// one query per disjunctive facet (use all refinements but the current one + hitsPerPage=1 + single facet
156
141
for (String disjunctiveFacet : disjunctiveFacets ) {
157
- filters = new StringBuilder ();
158
- first_global = true ;
142
+ facetFilters = new JSONArray ();
159
143
for (Map .Entry <String , T > elt : refinements .entrySet ()) {
160
144
if (disjunctiveFacet .equals (elt .getKey ())) {
161
145
continue ;
162
146
}
163
- StringBuilder or = new StringBuilder ();
164
- or .append ("(" );
165
- boolean first = true ;
147
+ JSONArray orFilters = new JSONArray ();
166
148
for (String val : elt .getValue ()) {
167
149
if (disjunctiveRefinements .containsKey (elt .getKey ())) {
168
- // disjunctive refinements are ORed
169
- if (!first ) {
170
- or .append (',' );
171
- }
172
- first = false ;
173
- or .append (String .format ("%s:%s" , elt .getKey (), val ));
150
+ orFilters .put (formatFilter (elt , val ));
174
151
} else {
175
- if (!first_global ) {
176
- filters .append (',' );
177
- }
178
- first_global = false ;
179
- filters .append (String .format ("%s:%s" , elt .getKey (), val ));
152
+ facetFilters .put (formatFilter (elt , val ));
180
153
}
181
154
}
182
155
// Add or
183
156
if (disjunctiveRefinements .containsKey (elt .getKey ())) {
184
- or .append (')' );
185
- if (!first_global ) {
186
- filters .append (',' );
187
- }
188
- first_global = false ;
189
- filters .append (or .toString ());
157
+ facetFilters .put (orFilters );
190
158
}
191
159
}
192
160
String [] facets = new String []{disjunctiveFacet };
193
161
queries .add (new Query (query ).setHitsPerPage (0 ).setAnalytics (false )
194
162
.setAttributesToRetrieve ().setAttributesToHighlight ().setAttributesToSnippet ()
195
- .setFacets (facets ).set ( " facetFilters" , filters . toString () ));
163
+ .setFacets (facets ).setFacetFilters ( facetFilters ));
196
164
}
197
165
return queries ;
198
166
}
199
167
168
+ private static <T extends Collection <String >> String formatFilter (Map .Entry <String , T > refinement , String value ) {
169
+ return String .format ("%s:%s" , refinement .getKey (), value );
170
+ }
171
+
200
172
/**
201
173
* Aggregate results from multiple queries into disjunctive faceting results.
202
174
*
@@ -208,7 +180,7 @@ public void requestCompleted(JSONObject content, AlgoliaException error) {
208
180
*/
209
181
static private <T extends Collection <String >> JSONObject aggregateDisjunctiveFacetingResults (@ NonNull JSONObject answers , @ NonNull Collection <String > disjunctiveFacets , @ NonNull Map <String , T > refinements ) throws AlgoliaException
210
182
{
211
- Map <String , T > disjunctiveRefinements = computeDisjunctiveRefinements (disjunctiveFacets , refinements );
183
+ Map <String , T > disjunctiveRefinements = filterDisjunctiveRefinements (disjunctiveFacets , refinements );
212
184
213
185
// aggregate answers
214
186
// first answer stores the hits + regular facets
0 commit comments