aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/query/optimizer.go
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2025-06-24 17:24:32 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2025-06-24 17:24:32 -0400
commite477518bd00b238808ea41b3f2fe829dbcac3b0c (patch)
tree413846bbf1bb732a9c5864b8293b4d86d133dfba /pkg/query/optimizer.go
parent21d72b2f67fb065d9071907c5c3307434aad3795 (diff)
Add tests and fix minor bugs for optimizier
Diffstat (limited to 'pkg/query/optimizer.go')
-rw-r--r--pkg/query/optimizer.go13
1 files changed, 10 insertions, 3 deletions
diff --git a/pkg/query/optimizer.go b/pkg/query/optimizer.go
index 8b99a64..4e8caa5 100644
--- a/pkg/query/optimizer.go
+++ b/pkg/query/optimizer.go
@@ -1,7 +1,9 @@
package query
import (
+ "fmt"
"iter"
+ "os"
"slices"
"strings"
"sync"
@@ -286,9 +288,10 @@ func (o Optimizer) StrictEquality() {
clear(stricts)
for i, s := range stmts {
val := strings.ToLower(s.Value.(StringValue).S)
- if s.Operator == OP_EQ {
+ switch s.Operator {
+ case OP_EQ:
stricts = append(stricts, val)
- } else if s.Operator == OP_AP {
+ case OP_AP:
if slices.ContainsFunc(stricts, func(strictStr string) bool {
return strings.Contains(strictStr, val) || strings.Contains(val, strictStr)
}) {
@@ -420,6 +423,7 @@ func (o *Optimizer) Tighten() {
}
}
if minIdx != -1 {
+ o.isSorted = false
start, stop := minIdx, maxIdx
if minS := stmts[minIdx]; minS.Operator == OP_GE || minS.Operator == OP_GT {
start++
@@ -440,8 +444,11 @@ func (o *Optimizer) Tighten() {
for j, s2 := range util.FilterIter(stmts[i+1:], func(s Statement) bool { return s.Operator == OP_AP }) {
val2 := strings.ToLower(s2.Value.(StringValue).S)
if strings.Contains(val2, val1) {
- removals[j] = true
+ fmt.Fprintf(os.Stderr, "%s > %s\nRemoving %s\n", val2, val1, val2)
+ // NOTE: slicing stmts offsets the all indices by 1, hence the correction
+ removals[j+1] = true
} else if strings.Contains(val1, val2) {
+ fmt.Fprintf(os.Stderr, "%s > %s\nRemoving %s\n", val1, val2, val1)
removals[i] = true
}
}