feat(resolvespec): add 'contains' operator for array overlap

* Implemented 'contains' operator using BuildArrayOverlapCondition for real array containment.
* Updated documentation to clarify differences between text-cast ILIKE and array overlap.
This commit is contained in:
2026-08-10 15:01:23 +02:00
parent 16cc7d350e
commit c60565e4e0
6 changed files with 208 additions and 90 deletions
+30
View File
@@ -57,6 +57,36 @@ func TestBuildFilterCondition(t *testing.T) {
expectedCondition: "CAST(email AS TEXT) LIKE ?",
expectedArgsCount: 1,
},
{
name: "CONTAINS operator with single value",
filter: common.FilterOption{
Column: "tags",
Operator: "contains",
Value: "urgent",
},
expectedCondition: "tags && ARRAY[?]",
expectedArgsCount: 1,
},
{
name: "CONTAINS operator with multiple values",
filter: common.FilterOption{
Column: "tags",
Operator: "contains",
Value: []string{"urgent", "billing"},
},
expectedCondition: "tags && ARRAY[?,?]",
expectedArgsCount: 2,
},
{
name: "CONTAINS operator with empty value",
filter: common.FilterOption{
Column: "tags",
Operator: "contains",
Value: nil,
},
expectedCondition: "",
expectedArgsCount: 0,
},
}
for _, tt := range tests {
+10
View File
@@ -1895,6 +1895,11 @@ func (h *Handler) buildFilterCondition(filter common.FilterOption) (conditionStr
if condition == "" {
return "", nil
}
case "contains":
condition, args = common.BuildArrayOverlapCondition(filter.Column, filter.Value)
if condition == "" {
return "", nil
}
default:
return "", nil
}
@@ -1939,6 +1944,11 @@ func (h *Handler) applyFilter(query common.SelectQuery, filter common.FilterOpti
if condition == "" {
return query
}
case "contains":
condition, args = common.BuildArrayOverlapCondition(filter.Column, filter.Value)
if condition == "" {
return query
}
default:
return query
}