Skip to content

Commit 5655877

Browse files
committed
feat(serializer): add custom serializer for analytics rules
1 parent 9f299ed commit 5655877

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package org.typesense.api;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.DeserializationFeature;
6+
import org.typesense.model.AnalyticsRule;
7+
import org.typesense.model.AnalyticsRuleCreate;
8+
import org.typesense.model.AnalyticsRuleCreateParams;
9+
import java.util.List;
10+
import java.util.ArrayList;
11+
12+
/**
13+
* Serializer for AnalyticsRule objects to avoid Jackson type discriminator issues
14+
*/
15+
public class AnalyticsRuleSerializer {
16+
17+
private final ObjectMapper objectMapper;
18+
19+
public AnalyticsRuleSerializer() {
20+
this.objectMapper = new ObjectMapper();
21+
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
22+
this.objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
23+
}
24+
25+
/**
26+
* Parse a single AnalyticsRule from JsonNode
27+
*/
28+
public AnalyticsRule parseFromJsonNode(JsonNode node) {
29+
AnalyticsRule rule = new AnalyticsRule();
30+
31+
if (node.has("name")) {
32+
rule.name(node.get("name").asText());
33+
}
34+
35+
if (node.has("type")) {
36+
String typeStr = node.get("type").asText();
37+
if ("counter".equals(typeStr)) {
38+
rule.type(AnalyticsRuleCreate.TypeEnum.COUNTER);
39+
} else if ("popular_queries".equals(typeStr)) {
40+
rule.type(AnalyticsRuleCreate.TypeEnum.POPULAR_QUERIES);
41+
} else if ("nohits_queries".equals(typeStr)) {
42+
rule.type(AnalyticsRuleCreate.TypeEnum.NOHITS_QUERIES);
43+
} else if ("log".equals(typeStr)) {
44+
rule.type(AnalyticsRuleCreate.TypeEnum.LOG);
45+
}
46+
}
47+
48+
if (node.has("collection")) {
49+
rule.collection(node.get("collection").asText());
50+
}
51+
52+
if (node.has("event_type")) {
53+
rule.eventType(node.get("event_type").asText());
54+
}
55+
56+
if (node.has("rule_tag")) {
57+
rule.ruleTag(node.get("rule_tag").asText());
58+
}
59+
60+
if (node.has("params")) {
61+
JsonNode paramsNode = node.get("params");
62+
AnalyticsRuleCreateParams params = new AnalyticsRuleCreateParams();
63+
64+
if (paramsNode.has("counter_field")) {
65+
params.counterField(paramsNode.get("counter_field").asText());
66+
}
67+
68+
if (paramsNode.has("weight")) {
69+
params.weight(paramsNode.get("weight").asInt());
70+
}
71+
72+
if (paramsNode.has("destination_collection")) {
73+
params.destinationCollection(paramsNode.get("destination_collection").asText());
74+
}
75+
76+
if (paramsNode.has("limit")) {
77+
params.limit(paramsNode.get("limit").asInt());
78+
}
79+
80+
if (paramsNode.has("capture_search_requests")) {
81+
params.captureSearchRequests(paramsNode.get("capture_search_requests").asBoolean());
82+
}
83+
84+
if (paramsNode.has("meta_fields")) {
85+
List<String> metaFields = new ArrayList<>();
86+
JsonNode metaFieldsNode = paramsNode.get("meta_fields");
87+
if (metaFieldsNode.isArray()) {
88+
for (JsonNode metaField : metaFieldsNode) {
89+
metaFields.add(metaField.asText());
90+
}
91+
}
92+
params.metaFields(metaFields);
93+
}
94+
95+
if (paramsNode.has("expand_query")) {
96+
params.expandQuery(paramsNode.get("expand_query").asBoolean());
97+
}
98+
99+
rule.params(params);
100+
}
101+
102+
return rule;
103+
}
104+
105+
/**
106+
* Parse AnalyticsRule from JSON string
107+
*/
108+
public AnalyticsRule parseFromJson(String jsonResponse) throws Exception {
109+
JsonNode rootNode = objectMapper.readTree(jsonResponse);
110+
return parseFromJsonNode(rootNode);
111+
}
112+
113+
/**
114+
* Parse a list of AnalyticsRule objects from JSON string
115+
*/
116+
public List<AnalyticsRule> parseListFromJson(String jsonResponse) throws Exception {
117+
JsonNode rootNode = objectMapper.readTree(jsonResponse);
118+
List<AnalyticsRule> rules = new ArrayList<>();
119+
120+
if (rootNode.isArray()) {
121+
for (JsonNode item : rootNode) {
122+
if (item.has("error")) {
123+
String error = item.get("error").asText();
124+
throw new RuntimeException("Analytics rule parsing failed: " + error);
125+
} else {
126+
AnalyticsRule rule = parseFromJsonNode(item);
127+
rules.add(rule);
128+
}
129+
}
130+
} else {
131+
// Single object response
132+
AnalyticsRule rule = parseFromJsonNode(rootNode);
133+
rules.add(rule);
134+
}
135+
136+
return rules;
137+
}
138+
}

0 commit comments

Comments
 (0)