diff --git a/algoliasearch-apache/src/test/java/com/algolia/search/personalization/PersonalizationTest.java b/algoliasearch-apache/src/test/java/com/algolia/search/personalization/PersonalizationTest.java index 9eefa05f9..a3cab2a59 100644 --- a/algoliasearch-apache/src/test/java/com/algolia/search/personalization/PersonalizationTest.java +++ b/algoliasearch-apache/src/test/java/com/algolia/search/personalization/PersonalizationTest.java @@ -14,7 +14,7 @@ class PersonalizationTest private static final PersonalizationClient personalizationClient = DefaultPersonalizationClient.create( - TestHelpers.ALGOLIA_APPLICATION_ID_1, TestHelpers.ALGOLIA_ADMIN_KEY_1, "eu"); + TestHelpers.ALGOLIA_APPLICATION_ID_1, TestHelpers.ALGOLIA_ADMIN_KEY_1, "us"); PersonalizationTest() { super(personalizationClient); diff --git a/algoliasearch-core/src/main/java/com/algolia/search/models/indexing/FiltersJsonDeserializer.java b/algoliasearch-core/src/main/java/com/algolia/search/models/indexing/FiltersJsonDeserializer.java index 20c520b9f..53f61af10 100644 --- a/algoliasearch-core/src/main/java/com/algolia/search/models/indexing/FiltersJsonDeserializer.java +++ b/algoliasearch-core/src/main/java/com/algolia/search/models/indexing/FiltersJsonDeserializer.java @@ -9,8 +9,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; -class FiltersJsonDeserializer extends JsonDeserializer { +class FiltersJsonDeserializer extends JsonDeserializer>> { /** * Algolia's specific deserializer handling multiple form of (legacy) filters This reader is @@ -19,7 +20,8 @@ class FiltersJsonDeserializer extends JsonDeserializer { */ @Override @SuppressWarnings("unchecked") - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + public List> deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException { JsonToken currentToken = p.getCurrentToken(); @@ -28,10 +30,10 @@ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx switch (currentToken) { case START_ARRAY: List list = p.readValueAs(List.class); - if (list.get(0) instanceof String) { + if (list.stream().allMatch(String.class::isInstance)) { // are all elements strings? result = Collections.singletonList(list); } else { - result = list; + result = buildFilters(list); } break; case VALUE_STRING: @@ -46,4 +48,19 @@ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOEx return result; } + + @SuppressWarnings("unchecked") + private List> buildFilters(List list) { + return (List>) + list.stream() + .map( + element -> { + if (element instanceof String) { + return Collections.singletonList((String) element); + } else { + return element; // we suppose it's a List + } + }) + .collect(Collectors.toList()); + } } diff --git a/algoliasearch-core/src/test/java/com/algolia/search/JacksonParserTest.java b/algoliasearch-core/src/test/java/com/algolia/search/JacksonParserTest.java index b58cda423..11a2edd40 100644 --- a/algoliasearch-core/src/test/java/com/algolia/search/JacksonParserTest.java +++ b/algoliasearch-core/src/test/java/com/algolia/search/JacksonParserTest.java @@ -212,6 +212,16 @@ void testLegacyFiltersFormat(String input) throws IOException { Defaults.getObjectMapper().readValue(nestedArrayFilters, ConsequenceParams.class), input)); + // Testing mixed case with array and string + // [["color:green","color:yellow"],"color:blue"] + String stringAndArrayFilters = + String.format("{\"%s\":[[\"color:green\",\"color:yellow\"],\"color:blue\"]}", input); + List> mixedDeserialized = + extractFilters( + Defaults.getObjectMapper().readValue(stringAndArrayFilters, ConsequenceParams.class), + input); + assertOREDLatestResult(mixedDeserialized); + // Testing the latest format of filters i.e nested arrays String nestedAndedArrayFilters = String.format("{\"%s\":[[\"color:green\",\"color:yellow\"],[\"color:blue\"]]}", input); @@ -220,13 +230,7 @@ void testLegacyFiltersFormat(String input) throws IOException { extractFilters( Defaults.getObjectMapper().readValue(nestedAndedArrayFilters, ConsequenceParams.class), input); - - assertThat(deserialized).hasSize(2); - assertThat(deserialized.get(0)).hasSize(2); - assertThat(deserialized.get(0).get(0)).containsSubsequence("color:green"); - assertThat(deserialized.get(0).get(1)).containsSubsequence("color:yellow"); - assertThat(deserialized.get(1)).hasSize(1); - assertThat(deserialized.get(1).get(0)).containsSubsequence("color:blue"); + assertOREDLatestResult(deserialized); } List> extractFilters(ConsequenceParams consequenceParams, String input) { @@ -257,6 +261,15 @@ void assertOREDResult(List> result) { assertThat(result.get(0)).containsSequence("color:yellow"); } + void assertOREDLatestResult(List> result) { + assertThat(result).hasSize(2); + assertThat(result.get(0)).hasSize(2); + assertThat(result.get(0).get(0)).containsSubsequence("color:green"); + assertThat(result.get(0).get(1)).containsSubsequence("color:yellow"); + assertThat(result.get(1)).hasSize(1); + assertThat(result.get(1).get(0)).containsSubsequence("color:blue"); + } + @Test void testFiltersJSONDeserializerNonRegression() throws IOException {