Skip to content

Commit 8013c24

Browse files
committed
fixed: Change facetFilters type from List<String> to a new FacetFilters type to handle List<List<String>> case
1 parent 233a823 commit 8013c24

File tree

6 files changed

+175
-3
lines changed

6 files changed

+175
-3
lines changed

algoliasearch-common/src/main/java/com/algolia/search/inputs/query_rules/ConsequenceParams.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,20 @@ public ConsequenceParams setMaxValuesPerFacet(Long maxValuesPerFacet) {
192192
return (ConsequenceParams) super.setMaxValuesPerFacet(maxValuesPerFacet);
193193
}
194194

195-
public List<String> getFacetFilters() {
195+
public FacetFilters getFacetFilters() {
196196
return facetFilters;
197197
}
198198

199+
@Deprecated
199200
public ConsequenceParams setFacetFilters(List<String> facetFilters) {
200201
return (ConsequenceParams) super.setFacetFilters(facetFilters);
201202
}
202203

204+
@JsonSetter
205+
public ConsequenceParams setFacetFilters(FacetFilters facetFilters) {
206+
return (ConsequenceParams) super.setFacetFilters(facetFilters);
207+
}
208+
203209
public Boolean getFacetingAfterDistinct() {
204210
return facetingAfterDistinct;
205211
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.algolia.search.objects;
2+
3+
import com.algolia.search.Defaults;
4+
import com.fasterxml.jackson.annotation.JsonIgnore;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.core.JsonGenerator;
7+
import com.fasterxml.jackson.core.JsonParser;
8+
import com.fasterxml.jackson.databind.*;
9+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
10+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
11+
import java.io.IOException;
12+
import java.io.Serializable;
13+
import java.util.List;
14+
15+
@JsonDeserialize(using = FacetFiltersJsonDeserializer.class)
16+
@JsonSerialize(using = FacetFiltersJsonSerializer.class)
17+
@JsonIgnoreProperties(ignoreUnknown = true)
18+
public abstract class FacetFilters implements Serializable {
19+
20+
public static FacetFilters ofList(List<String> filters) {
21+
return new FacetFiltersAsListOfString(filters);
22+
}
23+
24+
public static FacetFilters ofListOfList(List<List<String>> filters) {
25+
return new FacetFiltersAsListOfList(filters);
26+
}
27+
28+
@JsonIgnore
29+
public abstract Object getInsideValue();
30+
}
31+
32+
class FacetFiltersJsonDeserializer extends JsonDeserializer {
33+
34+
@Override
35+
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
36+
List list = p.readValueAs(List.class);
37+
if (list.isEmpty()) {
38+
return new FacetFiltersAsListOfString();
39+
}
40+
if (list.get(0) instanceof String) {
41+
return new FacetFiltersAsListOfString(list);
42+
}
43+
return new FacetFiltersAsListOfList(list);
44+
}
45+
}
46+
47+
class FacetFiltersJsonSerializer extends JsonSerializer<FacetFilters> {
48+
49+
@Override
50+
public void serialize(FacetFilters value, JsonGenerator gen, SerializerProvider serializers)
51+
throws IOException {
52+
53+
ObjectMapper objectMapper = Defaults.DEFAULT_OBJECT_MAPPER;
54+
55+
if (value instanceof FacetFiltersAsListOfString) {
56+
FacetFiltersAsListOfString filters = (FacetFiltersAsListOfString) value;
57+
objectMapper.writeValue(gen, filters.getFilters());
58+
59+
} else if (value instanceof FacetFiltersAsListOfList) {
60+
FacetFiltersAsListOfList filters = (FacetFiltersAsListOfList) value;
61+
objectMapper.writeValue(gen, filters.getFilters());
62+
63+
} else {
64+
throw new IOException(
65+
"cannot serialize facetFilters: unknown input type '" + value.getClass().getName() + "'");
66+
}
67+
}
68+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.algolia.search.objects;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import java.util.List;
6+
7+
@JsonDeserialize(as = FacetFiltersAsListOfList.class)
8+
public class FacetFiltersAsListOfList extends FacetFilters {
9+
10+
private List<List<String>> filters;
11+
12+
FacetFiltersAsListOfList(List<List<String>> filters) {
13+
this.filters = filters;
14+
}
15+
16+
@Override
17+
@JsonIgnore
18+
public Object getInsideValue() {
19+
return this.filters;
20+
}
21+
22+
List<List<String>> getFilters() {
23+
return this.filters;
24+
}
25+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.algolia.search.objects;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
@JsonDeserialize(as = FacetFiltersAsListOfString.class)
9+
public class FacetFiltersAsListOfString extends FacetFilters {
10+
11+
private List<String> filters;
12+
13+
FacetFiltersAsListOfString() {
14+
this.filters = new ArrayList<String>();
15+
}
16+
17+
FacetFiltersAsListOfString(List<String> filters) {
18+
this.filters = filters;
19+
}
20+
21+
@Override
22+
@JsonIgnore
23+
public Object getInsideValue() {
24+
return this.filters;
25+
}
26+
27+
List<String> getFilters() {
28+
return this.filters;
29+
}
30+
}

algoliasearch-common/src/main/java/com/algolia/search/objects/Query.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class Query implements Serializable {
3737
protected String filters;
3838
protected String facets;
3939
protected Long maxValuesPerFacet;
40-
protected List<String> facetFilters;
40+
protected FacetFilters facetFilters;
4141
protected Boolean facetingAfterDistinct;
4242
protected String sortFacetValuesBy;
4343

@@ -482,11 +482,18 @@ public Query setMaxValuesPerFacet(Integer maxValuesPerFacet) {
482482
return this.setMaxValuesPerFacet(maxValuesPerFacet.longValue());
483483
}
484484

485-
public List<String> getFacetFilters() {
485+
public FacetFilters getFacetFilters() {
486486
return facetFilters;
487487
}
488488

489+
@Deprecated
489490
public Query setFacetFilters(List<String> facetFilters) {
491+
this.facetFilters = new FacetFiltersAsListOfString(facetFilters);
492+
return this;
493+
}
494+
495+
@JsonSetter
496+
public Query setFacetFilters(FacetFilters facetFilters) {
490497
this.facetFilters = facetFilters;
491498
return this;
492499
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.algolia.search.objects;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.algolia.search.Defaults;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import java.io.IOException;
8+
import java.util.Arrays;
9+
import org.junit.Test;
10+
11+
public class FacetFiltersTest {
12+
13+
private ObjectMapper objectMapper = Defaults.DEFAULT_OBJECT_MAPPER;
14+
15+
private FacetFilters serializeDeserialize(FacetFilters facetFilters) throws IOException {
16+
String serialized = objectMapper.writeValueAsString(facetFilters);
17+
return objectMapper.readValue(
18+
serialized, objectMapper.getTypeFactory().constructType(FacetFilters.class));
19+
}
20+
21+
@Test
22+
public void facetFiltersAsListOfString() throws IOException {
23+
FacetFilters facetFilters = new FacetFiltersAsListOfString(Arrays.asList("filter1", "filter2"));
24+
FacetFilters result = serializeDeserialize(facetFilters);
25+
assertThat(result).isEqualToComparingFieldByField(facetFilters);
26+
}
27+
28+
@Test
29+
public void facetFiltersAsListOfList() throws IOException {
30+
FacetFilters facetFilters =
31+
new FacetFiltersAsListOfList(
32+
Arrays.asList(Arrays.asList("filter1", "filter2"), Arrays.asList("filter3")));
33+
FacetFilters result = serializeDeserialize(facetFilters);
34+
assertThat(result).isEqualToComparingFieldByField(facetFilters);
35+
}
36+
}

0 commit comments

Comments
 (0)