@@ -123,4 +123,108 @@ public void testComplexIdentifiers() {
123
123
assertThat (vectorExpr ).isEqualTo ("metadata.country 1 2 3:BG" );
124
124
}
125
125
126
+ @ Test
127
+ public void testEmptyList () {
128
+ // category IN []
129
+ String vectorExpr = this .converter
130
+ .convertExpression (new Filter .Expression (IN , new Filter .Key ("category" ), new Filter .Value (List .of ())));
131
+ assertThat (vectorExpr ).isEqualTo ("(metadata.category:)" );
132
+ }
133
+
134
+ @ Test
135
+ public void testSingleItemList () {
136
+ // status IN ["active"]
137
+ String vectorExpr = this .converter .convertExpression (
138
+ new Filter .Expression (IN , new Filter .Key ("status" ), new Filter .Value (List .of ("active" ))));
139
+ assertThat (vectorExpr ).isEqualTo ("(metadata.status:active)" );
140
+ }
141
+
142
+ @ Test
143
+ public void testNullValue () {
144
+ // description == null
145
+ String vectorExpr = this .converter
146
+ .convertExpression (new Filter .Expression (EQ , new Filter .Key ("description" ), new Filter .Value (null )));
147
+ assertThat (vectorExpr ).isEqualTo ("metadata.description:null" );
148
+ }
149
+
150
+ @ Test
151
+ public void testNestedJsonPath () {
152
+ // entity.profile.name == "EntityA"
153
+ String vectorExpr = this .converter .convertExpression (
154
+ new Filter .Expression (EQ , new Filter .Key ("entity.profile.name" ), new Filter .Value ("EntityA" )));
155
+ assertThat (vectorExpr ).isEqualTo ("metadata.entity.profile.name:EntityA" );
156
+ }
157
+
158
+ @ Test
159
+ public void testNumericStringValue () {
160
+ // id == "1"
161
+ String vectorExpr = this .converter
162
+ .convertExpression (new Filter .Expression (EQ , new Filter .Key ("id" ), new Filter .Value ("1" )));
163
+ assertThat (vectorExpr ).isEqualTo ("metadata.id:1" );
164
+ }
165
+
166
+ @ Test
167
+ public void testZeroValue () {
168
+ // count == 0
169
+ String vectorExpr = this .converter
170
+ .convertExpression (new Filter .Expression (EQ , new Filter .Key ("count" ), new Filter .Value (0 )));
171
+ assertThat (vectorExpr ).isEqualTo ("metadata.count:0" );
172
+ }
173
+
174
+ @ Test
175
+ public void testComplexNestedGroups () {
176
+ // ((fieldA >= 100 AND fieldB == "X1") OR (fieldA >= 50 AND fieldB == "Y2")) AND
177
+ // fieldC != "inactive"
178
+ String vectorExpr = this .converter .convertExpression (new Filter .Expression (AND ,
179
+ new Filter .Group (new Filter .Expression (OR ,
180
+ new Filter .Group (new Filter .Expression (AND ,
181
+ new Filter .Expression (GTE , new Filter .Key ("fieldA" ), new Filter .Value (100 )),
182
+ new Filter .Expression (EQ , new Filter .Key ("fieldB" ), new Filter .Value ("X1" )))),
183
+ new Filter .Group (new Filter .Expression (AND ,
184
+ new Filter .Expression (GTE , new Filter .Key ("fieldA" ), new Filter .Value (50 )),
185
+ new Filter .Expression (EQ , new Filter .Key ("fieldB" ), new Filter .Value ("Y2" )))))),
186
+ new Filter .Expression (NE , new Filter .Key ("fieldC" ), new Filter .Value ("inactive" ))));
187
+
188
+ assertThat (vectorExpr ).isEqualTo (
189
+ "((metadata.fieldA:>=100 AND metadata.fieldB:X1) OR (metadata.fieldA:>=50 AND metadata.fieldB:Y2)) AND metadata.fieldC: NOT inactive" );
190
+ }
191
+
192
+ @ Test
193
+ public void testMixedDataTypes () {
194
+ // active == true AND score >= 1.5 AND tags IN ["featured", "premium"] AND version
195
+ // == 1
196
+ String vectorExpr = this .converter .convertExpression (new Filter .Expression (AND , new Filter .Expression (AND ,
197
+ new Filter .Expression (AND , new Filter .Expression (EQ , new Filter .Key ("active" ), new Filter .Value (true )),
198
+ new Filter .Expression (GTE , new Filter .Key ("score" ), new Filter .Value (1.5 ))),
199
+ new Filter .Expression (IN , new Filter .Key ("tags" ), new Filter .Value (List .of ("featured" , "premium" )))),
200
+ new Filter .Expression (EQ , new Filter .Key ("version" ), new Filter .Value (1 ))));
201
+
202
+ assertThat (vectorExpr ).isEqualTo (
203
+ "metadata.active:true AND metadata.score:>=1.5 AND (metadata.tags:featured OR premium) AND metadata.version:1" );
204
+ }
205
+
206
+ @ Test
207
+ public void testNinWithMixedTypes () {
208
+ // status NIN ["A", "B", "C"]
209
+ String vectorExpr = this .converter .convertExpression (
210
+ new Filter .Expression (NIN , new Filter .Key ("status" ), new Filter .Value (List .of ("A" , "B" , "C" ))));
211
+ assertThat (vectorExpr ).isEqualTo ("NOT (metadata.status:A OR B OR C)" );
212
+ }
213
+
214
+ @ Test
215
+ public void testEmptyStringValue () {
216
+ // description != ""
217
+ String vectorExpr = this .converter
218
+ .convertExpression (new Filter .Expression (NE , new Filter .Key ("description" ), new Filter .Value ("" )));
219
+ assertThat (vectorExpr ).isEqualTo ("metadata.description: NOT " );
220
+ }
221
+
222
+ @ Test
223
+ public void testArrayIndexAccess () {
224
+ // tags[0] == "important"
225
+ String vectorExpr = this .converter
226
+ .convertExpression (new Filter .Expression (EQ , new Filter .Key ("tags[0]" ), new Filter .Value ("important" )));
227
+ assertThat (vectorExpr ).isEqualTo ("metadata.tags[0]:important" );
228
+ }
229
+
126
230
}
0 commit comments