aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/query/optimizer_test.go
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2025-07-28 01:20:01 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2025-07-28 01:20:01 -0400
commit3b8dcd30f5aca7624a22cff85a2f767d8d1fb583 (patch)
treedb01e57776ef9a8bc104403cd038e303c6831500 /pkg/query/optimizer_test.go
parent7b5cd075161bd4e1a05070d51cc64b38882ae74b (diff)
Add regex operator
Implemented regex operator using go flavored regular expressions. Added optimization to combine regex's in `OR` clauses.
Diffstat (limited to 'pkg/query/optimizer_test.go')
-rw-r--r--pkg/query/optimizer_test.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/pkg/query/optimizer_test.go b/pkg/query/optimizer_test.go
index 1826c81..bb9c0ba 100644
--- a/pkg/query/optimizer_test.go
+++ b/pkg/query/optimizer_test.go
@@ -647,3 +647,75 @@ func TestOptimizer_Tighten(t *testing.T) {
})
}
}
+
+func TestOptimizer_MergeRegex(t *testing.T) {
+ tests := []struct {
+ name string
+ c *query.Clause
+ want query.Clause
+ }{
+ {
+ "only positve",
+ &query.Clause{
+ Operator: query.COP_OR,
+ Statements: []query.Statement{
+ {Category: CAT_TITLE, Operator: OP_RE, Value: query.StringValue{"a"}},
+ {Category: CAT_TITLE, Operator: OP_RE, Value: query.StringValue{"b"}},
+ },
+ },
+ query.Clause{
+ Operator: query.COP_OR,
+ Statements: []query.Statement{
+ {Category: CAT_TITLE, Operator: OP_RE, Value: query.StringValue{"(a|b)"}},
+ },
+ },
+ },
+ {
+ "multiple categories",
+ &query.Clause{
+ Operator: query.COP_OR,
+ Statements: []query.Statement{
+ {Category: CAT_TITLE, Operator: OP_RE, Value: query.StringValue{"a"}},
+ {Category: CAT_TITLE, Operator: OP_RE, Value: query.StringValue{"b"}},
+ {Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"c"}},
+ {Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"d"}},
+ },
+ },
+ query.Clause{
+ Operator: query.COP_OR,
+ Statements: []query.Statement{
+ {Category: CAT_TITLE, Operator: OP_RE, Value: query.StringValue{"(a|b)"}},
+ {Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"(c|d)"}},
+ },
+ },
+ },
+ {
+ "mixed negations",
+ &query.Clause{
+ Operator: query.COP_OR,
+ Statements: []query.Statement{
+ {Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"a"}},
+ {Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"b"}},
+ {Negated: true, Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"c"}},
+ {Negated: true, Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"d"}},
+ },
+ },
+ query.Clause{
+ Operator: query.COP_OR,
+ Statements: []query.Statement{
+ {Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"(a|b)"}},
+ {Negated: true, Category: CAT_TAGS, Operator: OP_RE, Value: query.StringValue{"(c|d)"}},
+ },
+ },
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ o := query.NewOptimizer(tt.c, WORKERS)
+ o.MergeRegex()
+ o.Tidy()
+
+ clauseEqTest(t, tt.c, &tt.want)
+ })
+ }
+}