From 3b8dcd30f5aca7624a22cff85a2f767d8d1fb583 Mon Sep 17 00:00:00 2001 From: JP Appel Date: Mon, 28 Jul 2025 01:20:01 -0400 Subject: Add regex operator Implemented regex operator using go flavored regular expressions. Added optimization to combine regex's in `OR` clauses. --- pkg/query/optimizer_test.go | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'pkg/query/optimizer_test.go') 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) + }) + } +} -- cgit v1.2.3