Skip to content

Commit d6b0e83

Browse files
authored
Added: Query Rules V2
1 parent 8013c24 commit d6b0e83

File tree

14 files changed

+904
-33
lines changed

14 files changed

+904
-33
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.algolia.search.custom_serializers;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.databind.DeserializationContext;
5+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
6+
import java.io.IOException;
7+
import java.time.Instant;
8+
import java.time.ZoneOffset;
9+
import java.time.ZonedDateTime;
10+
11+
public class CustomZonedDateTimeEpochDeserializer extends StdDeserializer<ZonedDateTime> {
12+
13+
public CustomZonedDateTimeEpochDeserializer() {
14+
this(null);
15+
}
16+
17+
public CustomZonedDateTimeEpochDeserializer(Class<ZonedDateTime> t) {
18+
super(t);
19+
}
20+
21+
@Override
22+
public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
23+
Instant i = Instant.ofEpochSecond(p.getLongValue());
24+
return ZonedDateTime.ofInstant(i, ZoneOffset.UTC);
25+
}
26+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.algolia.search.custom_serializers;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.SerializerProvider;
5+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
6+
import java.io.IOException;
7+
import java.time.ZonedDateTime;
8+
9+
public class CustomZonedDateTimeEpochSerializer extends StdSerializer<ZonedDateTime> {
10+
11+
public CustomZonedDateTimeEpochSerializer() {
12+
this(null);
13+
}
14+
15+
public CustomZonedDateTimeEpochSerializer(Class<ZonedDateTime> t) {
16+
super(t);
17+
}
18+
19+
@Override
20+
public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider provider)
21+
throws IOException {
22+
gen.writeNumber(value.toEpochSecond());
23+
}
24+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.algolia.search.inputs.query_rules;
22

3+
import com.algolia.search.objects.Hide;
34
import com.fasterxml.jackson.annotation.JsonInclude;
45
import java.io.Serializable;
56
import java.util.List;
@@ -10,6 +11,7 @@ public class Consequence implements Serializable {
1011
private ConsequenceParams params;
1112
private List<ConsequencePromote> promote;
1213
private Map<String, Object> userData;
14+
private List<Hide> hide;
1315

1416
public Consequence() {}
1517

@@ -39,4 +41,12 @@ public Consequence setUserData(Map<String, Object> userData) {
3941
this.userData = userData;
4042
return this;
4143
}
44+
45+
public List<Hide> getHide() {
46+
return hide;
47+
}
48+
49+
public void setHide(List<Hide> hide) {
50+
this.hide = hide;
51+
}
4252
}

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

Lines changed: 71 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
package com.algolia.search.inputs.query_rules;
22

3+
import com.algolia.search.Defaults;
34
import com.algolia.search.objects.*;
45
import com.fasterxml.jackson.annotation.JsonAnySetter;
56
import com.fasterxml.jackson.annotation.JsonInclude;
67
import com.fasterxml.jackson.annotation.JsonSetter;
8+
import com.fasterxml.jackson.core.JsonParser;
9+
import com.fasterxml.jackson.core.ObjectCodec;
10+
import com.fasterxml.jackson.core.type.TypeReference;
11+
import com.fasterxml.jackson.databind.*;
12+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
13+
import java.io.IOException;
714
import java.util.List;
815

916
@SuppressWarnings({"WeakerAccess", "unused"})
1017
@JsonInclude(JsonInclude.Include.NON_NULL)
11-
public class ConsequenceParams extends Query {
18+
public class ConsequenceParams<T> extends Query {
1219
private ConsequenceQuery query;
13-
private List<String> automaticFacetFilters;
14-
private List<String> automaticOptionalFacetFilters;
20+
21+
@JsonDeserialize(using = AutomaticFacetFilterDeserializer.class)
22+
private List<T> automaticFacetFilters;
23+
24+
@JsonDeserialize(using = AutomaticFacetFilterDeserializer.class)
25+
private List<T> automaticOptionalFacetFilters;
1526

1627
public ConsequenceParams() {}
1728

@@ -24,23 +35,22 @@ public ConsequenceParams setQuery(ConsequenceQuery query) {
2435
return this;
2536
}
2637

27-
public List<String> getAutomaticFacetFilters() {
38+
public List<T> getAutomaticFacetFilters() {
2839
return automaticFacetFilters;
2940
}
3041

31-
public ConsequenceParams setAutomaticFacetFilters(List<String> automaticFacetFilters) {
42+
public ConsequenceParams setAutomaticFacetFilters(List<T> automaticFacetFilters) {
3243
this.automaticFacetFilters = automaticFacetFilters;
3344
return this;
3445
}
3546

36-
public List<String> getAutomaticOptionalFacetFilters() {
47+
public List<T> getAutomaticOptionalFacetFilters() {
3748
return automaticOptionalFacetFilters;
3849
}
3950

4051
// Fields from Query
4152

42-
public ConsequenceParams setAutomaticOptionalFacetFilters(
43-
List<String> automaticOptionalFacetFilters) {
53+
public ConsequenceParams setAutomaticOptionalFacetFilters(List<T> automaticOptionalFacetFilters) {
4454
this.automaticOptionalFacetFilters = automaticOptionalFacetFilters;
4555
return this;
4656
}
@@ -129,12 +139,13 @@ public Long getMaxFacetHits() {
129139
return maxFacetHits;
130140
}
131141

132-
public ConsequenceParams setMaxFacetHits(Integer maxFacetHits) {
142+
@JsonSetter
143+
public ConsequenceParams setMaxFacetHits(Long maxFacetHits) {
133144
return (ConsequenceParams) super.setMaxFacetHits(maxFacetHits);
134145
}
135146

136-
@JsonSetter
137-
public ConsequenceParams setMaxFacetHits(Long maxFacetHits) {
147+
@Deprecated
148+
public ConsequenceParams setMaxFacetHits(Integer maxFacetHits) {
138149
return (ConsequenceParams) super.setMaxFacetHits(maxFacetHits);
139150
}
140151

@@ -183,12 +194,13 @@ public Long getMaxValuesPerFacet() {
183194
return maxValuesPerFacet;
184195
}
185196

186-
public ConsequenceParams setMaxValuesPerFacet(Integer maxValuesPerFacet) {
197+
@JsonSetter
198+
public ConsequenceParams setMaxValuesPerFacet(Long maxValuesPerFacet) {
187199
return (ConsequenceParams) super.setMaxValuesPerFacet(maxValuesPerFacet);
188200
}
189201

190-
@JsonSetter
191-
public ConsequenceParams setMaxValuesPerFacet(Long maxValuesPerFacet) {
202+
@Deprecated
203+
public ConsequenceParams setMaxValuesPerFacet(Integer maxValuesPerFacet) {
192204
return (ConsequenceParams) super.setMaxValuesPerFacet(maxValuesPerFacet);
193205
}
194206

@@ -324,49 +336,51 @@ public Long getPage() {
324336
return page;
325337
}
326338

327-
public ConsequenceParams setPage(Integer page) {
339+
public ConsequenceParams setPage(Long page) {
328340
return (ConsequenceParams) super.setPage(page);
329341
}
330342

331-
public ConsequenceParams setPage(Long page) {
343+
public ConsequenceParams setPage(Integer page) {
332344
return (ConsequenceParams) super.setPage(page);
333345
}
334346

335347
public Long getHitsPerPage() {
336348
return hitsPerPage;
337349
}
338350

339-
public ConsequenceParams setHitsPerPage(Integer hitsPerPage) {
351+
@JsonSetter
352+
public ConsequenceParams setHitsPerPage(Long hitsPerPage) {
340353
return (ConsequenceParams) super.setHitsPerPage(hitsPerPage);
341354
}
342355

343-
@JsonSetter
344-
public ConsequenceParams setHitsPerPage(Long hitsPerPage) {
356+
@Deprecated
357+
public ConsequenceParams setHitsPerPage(Integer hitsPerPage) {
345358
return (ConsequenceParams) super.setHitsPerPage(hitsPerPage);
346359
}
347360

348361
public Long getOffset() {
349362
return offset;
350363
}
351364

352-
public ConsequenceParams setOffset(Integer offset) {
365+
public ConsequenceParams setOffset(Long offset) {
353366
return (ConsequenceParams) super.setOffset(offset);
354367
}
355368

356-
public ConsequenceParams setOffset(Long offset) {
369+
public ConsequenceParams setOffset(Integer offset) {
357370
return (ConsequenceParams) super.setOffset(offset);
358371
}
359372

360373
public Long getLength() {
361374
return length;
362375
}
363376

364-
public ConsequenceParams setLength(Integer length) {
377+
@JsonSetter
378+
public ConsequenceParams setLength(Long length) {
365379
return (ConsequenceParams) super.setLength(length);
366380
}
367381

368-
@JsonSetter
369-
public ConsequenceParams setLength(Long length) {
382+
@Deprecated
383+
public ConsequenceParams setLength(Integer length) {
370384
return (ConsequenceParams) super.setLength(length);
371385
}
372386

@@ -489,3 +503,36 @@ public ConsequenceParams addCustomParameter(String key, String value) {
489503
return (ConsequenceParams) super.addCustomParameter(key, value);
490504
}
491505
}
506+
507+
class AutomaticFacetFilterDeserializer extends JsonDeserializer {
508+
509+
/**
510+
* This object can be a List<String> or a List<AutomaticFacetFilter> so it needs a custom
511+
* deserializer
512+
*
513+
* @param jp
514+
* @param ctxt
515+
* @return
516+
* @throws IOException
517+
*/
518+
@Override
519+
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
520+
521+
ObjectCodec oc = jp.getCodec();
522+
JsonNode node = oc.readTree(jp);
523+
ObjectMapper objectMapper = Defaults.DEFAULT_OBJECT_MAPPER;
524+
525+
if ((!node.isNull() && node.size() > 0)) {
526+
if (node.get(0).has("disjunctive") || node.get(0).has("score")) {
527+
ObjectReader reader =
528+
objectMapper.readerFor(new TypeReference<List<AutomaticFacetFilter>>() {});
529+
return reader.readValue(node);
530+
} else {
531+
ObjectReader reader = objectMapper.readerFor(new TypeReference<List<String>>() {});
532+
return reader.readValue(node);
533+
}
534+
} else {
535+
return null;
536+
}
537+
}
538+
}
Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,42 @@
11
package com.algolia.search.inputs.query_rules;
22

3-
import com.fasterxml.jackson.annotation.JsonInclude;
3+
import com.algolia.search.Defaults;
4+
import com.algolia.search.objects.Edit;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.core.JsonParser;
7+
import com.fasterxml.jackson.core.ObjectCodec;
8+
import com.fasterxml.jackson.core.type.TypeReference;
9+
import com.fasterxml.jackson.databind.*;
10+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
11+
import java.io.IOException;
412
import java.io.Serializable;
13+
import java.util.List;
514

6-
@JsonInclude(JsonInclude.Include.NON_NULL)
15+
@JsonIgnoreProperties(ignoreUnknown = true)
16+
@JsonDeserialize(using = ConsequenceQueryDeserializer.class)
717
public abstract class ConsequenceQuery implements Serializable {}
18+
19+
class ConsequenceQueryDeserializer extends JsonDeserializer<ConsequenceQuery> {
20+
@Override
21+
public ConsequenceQuery deserialize(JsonParser jp, DeserializationContext ctxt)
22+
throws IOException {
23+
ObjectCodec oc = jp.getCodec();
24+
JsonNode node = oc.readTree(jp);
25+
ObjectMapper objectMapper = Defaults.DEFAULT_OBJECT_MAPPER;
26+
27+
if (node.has("edits")) {
28+
ObjectReader reader = objectMapper.readerFor(new TypeReference<List<Edit>>() {});
29+
List<Edit> list = reader.readValue(node.get("edits"));
30+
return new ConsequenceQueryObject().setEdits(list);
31+
} else if (node.has("remove")) {
32+
ObjectReader reader = objectMapper.readerFor(new TypeReference<List<String>>() {});
33+
34+
List<String> list = reader.readValue(node.get("remove"));
35+
36+
return new ConsequenceQueryObject().setRemove(list);
37+
} else {
38+
return new ConsequenceQueryString(
39+
node.asText()); // not sure it's not even possible to save a rule like that
40+
}
41+
}
42+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,37 @@
11
package com.algolia.search.inputs.query_rules;
22

3+
import com.algolia.search.objects.Edit;
4+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
35
import com.fasterxml.jackson.annotation.JsonInclude;
46
import java.util.List;
57

68
@JsonInclude(JsonInclude.Include.NON_NULL)
9+
@JsonIgnoreProperties(ignoreUnknown = true)
710
public class ConsequenceQueryObject extends ConsequenceQuery {
811

912
private List<String> remove;
13+
private List<Edit> edits;
1014

1115
public ConsequenceQueryObject() {}
1216

17+
@Deprecated
1318
public List<String> getRemove() {
1419
return remove;
1520
}
1621

22+
/** Old features use edits instead */
23+
@Deprecated
1724
public ConsequenceQueryObject setRemove(List<String> remove) {
1825
this.remove = remove;
1926
return this;
2027
}
28+
29+
public List<Edit> getEdits() {
30+
return edits;
31+
}
32+
33+
public ConsequenceQueryObject setEdits(List<Edit> edits) {
34+
this.edits = edits;
35+
return this;
36+
}
2137
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public class ConsequenceQueryString extends ConsequenceQuery {
77

88
private final String query;
99

10-
ConsequenceQueryString(String query) {
10+
public ConsequenceQueryString(String query) {
1111
this.query = query;
1212
}
1313

0 commit comments

Comments
 (0)