aboutsummaryrefslogtreecommitdiffstats
path: root/predicate-search-core/src/test/java/com/yahoo/search/predicate/optimization/AndOrSimplifierTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'predicate-search-core/src/test/java/com/yahoo/search/predicate/optimization/AndOrSimplifierTest.java')
-rw-r--r--predicate-search-core/src/test/java/com/yahoo/search/predicate/optimization/AndOrSimplifierTest.java134
1 files changed, 134 insertions, 0 deletions
diff --git a/predicate-search-core/src/test/java/com/yahoo/search/predicate/optimization/AndOrSimplifierTest.java b/predicate-search-core/src/test/java/com/yahoo/search/predicate/optimization/AndOrSimplifierTest.java
new file mode 100644
index 00000000000..4ec6c496e73
--- /dev/null
+++ b/predicate-search-core/src/test/java/com/yahoo/search/predicate/optimization/AndOrSimplifierTest.java
@@ -0,0 +1,134 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.predicate.optimization;
+
+import com.yahoo.document.predicate.Predicate;
+import org.junit.Test;
+
+import static com.yahoo.document.predicate.Predicates.and;
+import static com.yahoo.document.predicate.Predicates.feature;
+import static com.yahoo.document.predicate.Predicates.not;
+import static com.yahoo.document.predicate.Predicates.or;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author <a href="mailto:magnarn@yahoo-inc.com">Magnar Nedland</a>
+ */
+public class AndOrSimplifierTest {
+
+ @Test
+ public void requireThatNestedConjunctionsAreCollapsed() {
+ assertSimplified(and(feature("a").inSet("b"),
+ feature("c").inSet("d")),
+ and(and(feature("a").inSet("b"),
+ feature("c").inSet("d"))));
+ }
+
+ @Test
+ public void requireThatNestedConjuctionsAreCollapsedInPlace() {
+ assertSimplified(and(feature("a").inSet("b"),
+ feature("c").inSet("d"),
+ feature("e").inSet("f")),
+ and(feature("a").inSet("b"),
+ and(feature("c").inSet("d")),
+ feature("e").inSet("f")));
+ }
+
+ @Test
+ public void requireThatDeeplyNestedConjunctionsAreCollapsed() {
+ assertSimplified(and(feature("a").inSet("b"),
+ feature("c").inSet("d"),
+ feature("e").inSet("f"),
+ feature("g").inSet("h"),
+ feature("i").inSet("j")),
+ and(feature("a").inSet("b"),
+ and(feature("c").inSet("d")),
+ feature("e").inSet("f"),
+ and(and(feature("g").inSet("h"),
+ feature("i").inSet("j")))));
+ }
+
+ @Test
+ public void requireThatNestedDisjunctionsAreCollapsed() {
+ assertSimplified(or(feature("a").inSet("b"),
+ feature("c").inSet("d")),
+ or(or(feature("a").inSet("b"),
+ feature("c").inSet("d"))));
+ }
+
+ @Test
+ public void requireThatNestedDisjuctionsAreCollapsedInPlace() {
+ assertSimplified(or(feature("a").inSet("b"),
+ feature("c").inSet("d"),
+ feature("e").inSet("f")),
+ or(feature("a").inSet("b"),
+ or(feature("c").inSet("d")),
+ feature("e").inSet("f")));
+ }
+
+ @Test
+ public void requireThatDeeplyNestedDisjunctionsAreCollapsed() {
+ assertSimplified(or(feature("a").inSet("b"),
+ feature("c").inSet("d"),
+ feature("e").inSet("f"),
+ feature("g").inSet("h"),
+ feature("i").inSet("j")),
+ or(feature("a").inSet("b"),
+ or(feature("c").inSet("d")),
+ feature("e").inSet("f"),
+ or(or(feature("g").inSet("h"),
+ feature("i").inSet("j")))));
+ }
+
+ @Test
+ public void requireThatConjunctionsAndDisjunctionsAreNotCollapsed() {
+ assertSimplified(and(or(feature("a").inSet("b"),
+ feature("c").inSet("d"))),
+ and(or(feature("a").inSet("b"),
+ feature("c").inSet("d"))));
+ }
+
+ @Test
+ public void requireThatNotOrIsTranslatedToAndNot() {
+ assertSimplified(
+ and(feature("a").notInSet("b"), feature("c").inSet("d")),
+ not(or(feature("a").inSet("b"), feature("c").notInSet("d"))));
+ }
+
+ @Test
+ public void requireThatNotAndIsTranslatedToOrNot() {
+ assertSimplified(
+ or(feature("a").notInSet("b"), feature("c").inSet("d")),
+ not(and(feature("a").inSet("b"), feature("c").notInSet("d"))));
+ }
+
+ @Test
+ public void requireThatTreeWithoutNotIsNotAffected() {
+ assertSimplified(
+ and(feature("a").inSet("b"), feature("c").notInSet("d")),
+ and(feature("a").inSet("b"), feature("c").notInSet("d")));
+ assertSimplified(
+ or(feature("a").inSet("b"), feature("c").notInSet("d")),
+ or(feature("a").inSet("b"), feature("c").notInSet("d")));
+ assertSimplified(feature("a").inSet("b"), feature("a").inSet("b"));
+ }
+
+ @Test
+ public void requireThatNotOfNotIsRemoved() {
+ assertSimplified(feature("a").inSet("b"), not(not(feature("a").inSet("b"))));
+ assertSimplified(feature("a").inSet("b"), not(feature("a").notInSet("b")));
+ assertSimplified(feature("a").notInSet("b"), not(not(feature("a").notInSet("b"))));
+ }
+
+ @Test
+ public void requireThatNotBeneathAndIsTranslated() {
+ assertSimplified(
+ and(feature("a").notInSet("b"), feature("c").inSet("d"), feature("b").inSet("c")),
+ and(not(or(feature("a").inSet("b"), feature("c").notInSet("d"))), feature("b").inSet("c")));
+ }
+
+ private static void assertSimplified(Predicate expected, Predicate input) {
+ AndOrSimplifier simplifier = new AndOrSimplifier();
+ Predicate actual = simplifier.process(input, new PredicateOptions(10));
+ assertEquals(expected, actual);
+ }
+}