diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2025-07-28 01:20:01 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2025-07-28 01:20:01 -0400 |
| commit | 3b8dcd30f5aca7624a22cff85a2f767d8d1fb583 (patch) | |
| tree | db01e57776ef9a8bc104403cd038e303c6831500 /pkg/query/optimizer_test.go | |
| parent | 7b5cd075161bd4e1a05070d51cc64b38882ae74b (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.go | 72 |
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) + }) + } +} |
