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