Improve filtering on simple queries by grouping simple queries in or-queries
Change-Id: I5c685b6584a5409ea8c8060f70bf8968e63d2b77
diff --git a/t/query/filter.t b/t/query/filter.t
index 7b97672..b299fed 100644
--- a/t/query/filter.t
+++ b/t/query/filter.t
@@ -52,6 +52,7 @@
# Check filter optimization
+# On filtering level
ok($term = $qb->bool_or(
$qb->term('aa'),
$qb->term('bb'),
@@ -63,9 +64,38 @@
ok($query = $qb->filter_by($term, $corpus), 'Filter by corpus');
is($query->to_string, "filter(aa|bb|(bb|cc),genre=novel)", 'Stringification');
ok($query_plan = $query->normalize->finalize->identify($index->dict)->optimize($index->segment), 'Create query plan');
+
+# Non-complex queries are filtered only once
is($query_plan->to_string, "filter(or(or(#10,#8),#6),#2)", 'Stringification');
+# Check filter optimization
+# On optimization level
+ok($term = $qb->bool_or(
+ $qb->term('cc'),
+ $qb->seq(
+ $qb->term('aa'),
+ $qb->term('aa'),
+ ),
+ $qb->term('bb'),
+ $qb->seq(
+ $qb->term('aa'),
+ $qb->term('bb'),
+ ),
+ $qb->term('aa'),
+), 'Create new term query');
+ok($query = $qb->filter_by($term, $corpus), 'Filter by corpus');
+
+# Order here is just alphabetical
+is($query->to_string, "filter((aa)|(aaaa)|(aabb)|(bb)|(cc),genre=novel)", 'Stringification');
+ok($query_plan = $query->normalize->finalize->identify($index->dict)->optimize($index->segment), 'Create query plan');
+
+# Non-complex queries are grouped, so filtering is done only once
+is($query_plan->to_string,
+ "or(or(filter(or(or(#10,#8),#6),#2),constr(pos=2:#6,filter(#8,#2))),constr(pos=2:#6,filter(#6,#2)))",
+ 'Stringification');
+
+
done_testing;