Skip to content

Commit c62d999

Browse files
luthfifahleviMuhammad Luthfi Fahlevi
and
Muhammad Luthfi Fahlevi
authored
fix: resolve nil condition for es query (#83)
fix: fix up nil condition for ES query Co-authored-by: Muhammad Luthfi Fahlevi <[email protected]>
1 parent be09caf commit c62d999

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

pkg/queryexpr/es_expr.go

+30
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ func (e ESExpr) binaryNodeToEsQuery(n *ast.BinaryNode) (interface{}, error) { //
107107

108108
case "==":
109109
if leftStr, ok := left.(string); ok {
110+
if right == nil {
111+
return e.mustNotExistQuery(leftStr), nil
112+
}
110113
return e.termQuery(leftStr, right), nil
111114
}
112115
result, err := getQueryExprResult(n.String())
@@ -117,6 +120,9 @@ func (e ESExpr) binaryNodeToEsQuery(n *ast.BinaryNode) (interface{}, error) { //
117120

118121
case "!=":
119122
if leftStr, ok := left.(string); ok {
123+
if right == nil {
124+
return e.mustExistQuery(leftStr), nil
125+
}
120126
return e.mustNotQuery(leftStr, right), nil
121127
}
122128
result, err := getQueryExprResult(n.String())
@@ -257,6 +263,30 @@ func (ESExpr) mustNotQuery(field string, value interface{}) map[string]interface
257263
}
258264
}
259265

266+
func (ESExpr) mustExistQuery(field string) map[string]interface{} {
267+
return map[string]interface{}{
268+
"bool": map[string]interface{}{
269+
"must": map[string]interface{}{
270+
"exists": map[string]interface{}{
271+
"field": field,
272+
},
273+
},
274+
},
275+
}
276+
}
277+
278+
func (ESExpr) mustNotExistQuery(field string) map[string]interface{} {
279+
return map[string]interface{}{
280+
"bool": map[string]interface{}{
281+
"must_not": map[string]interface{}{
282+
"exists": map[string]interface{}{
283+
"field": field,
284+
},
285+
},
286+
},
287+
}
288+
}
289+
260290
func (ESExpr) rangeQuery(field, operator string, value interface{}) map[string]interface{} {
261291
return map[string]interface{}{
262292
"range": map[string]interface{}{

pkg/queryexpr/es_expr_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ func TestESExpr_ToQuery(t *testing.T) {
5050
want: `{"query":{"range":{"updated_at":{"gt":"2024-04-05 23:59:59"}}}}`,
5151
wantErr: false,
5252
},
53+
{
54+
name: "equals to nil",
55+
expr: queryexpr.ESExpr(`refreshed_at == nil`),
56+
want: `{"query":{"bool":{"must_not":{"exists":{"field":"refreshed_at"}}}}}`,
57+
wantErr: false,
58+
},
59+
{
60+
name: "not equals to nil",
61+
expr: queryexpr.ESExpr(`refreshed_at != nil`),
62+
want: `{"query":{"bool":{"must":{"exists":{"field":"refreshed_at"}}}}}`,
63+
wantErr: false,
64+
},
65+
{
66+
name: "equals to nil and not equal to nil",
67+
expr: queryexpr.ESExpr(`refreshed_at == nil && updated_at != nil`),
68+
want: `{"query":{"bool":{"must":[{"bool":{"must_not":{"exists":{"field":"refreshed_at"}}}},{"bool":{"must":{"exists":{"field":"updated_at"}}}}]}}}`,
69+
wantErr: false,
70+
},
5371
{
5472
name: "in condition",
5573
expr: queryexpr.ESExpr(`service in ["test1","test2","test3"]`),

0 commit comments

Comments
 (0)