summaryrefslogtreecommitdiffstats
path: root/predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java
Publish
Diffstat (limited to 'predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java')
-rw-r--r--predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java141
1 files changed, 141 insertions, 0 deletions
diff --git a/predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java b/predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java
new file mode 100644
index 00000000000..25effda4cb9
--- /dev/null
+++ b/predicate-search/src/test/java/com/yahoo/search/predicate/PredicateIndexTest.java
@@ -0,0 +1,141 @@
+// 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;
+
+import com.yahoo.document.predicate.Predicate;
+import org.junit.Test;
+
+import java.io.IOException;
+
+import static com.yahoo.search.predicate.serialization.SerializationTestHelper.assertSerializationDeserializationMatches;
+import static java.util.stream.Collectors.toList;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author <a href="mailto:magnarn@yahoo-inc.com">Magnar Nedland</a>
+ * @author bjorncs
+ */
+public class PredicateIndexTest {
+
+ private static final int DOC_ID = 42;
+
+ @Test
+ public void requireThatPredicateIndexCanSearch() {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(1, Predicate.fromString("country in ['no', 'se'] and gender in ['male']"));
+ builder.indexDocument(0x3fffffe, Predicate.fromString("country in ['no'] and gender in ['female']"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+ PredicateQuery query = new PredicateQuery();
+ query.addFeature("country", "no");
+ query.addFeature("gender", "male");
+ assertEquals("[1]", searcher.search(query).collect(toList()).toString());
+ query.addFeature("gender", "female");
+ assertEquals("[1, 67108862]", searcher.search(query).collect(toList()).toString());
+ }
+
+ @Test
+ public void requireThatPredicateIndexCanSearchWithNotExpression() {
+ {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(1, Predicate.fromString("country in ['no'] and gender not in ['male']"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+ PredicateQuery query = new PredicateQuery();
+ query.addFeature("country", "no");
+ query.addFeature("gender", "female");
+ assertEquals("[1]", searcher.search(query).collect(toList()).toString());
+ }
+ {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(DOC_ID, Predicate.fromString("country in ['no'] and gender in ['male']"));
+ builder.indexDocument(DOC_ID + 1, Predicate.fromString("country not in ['no']"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+
+ PredicateQuery query = new PredicateQuery();
+ assertEquals("[43]", searcher.search(query).collect(toList()).toString());
+ query.addFeature("country", "no");
+ assertEquals(0, searcher.search(query).count());
+ }
+ {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(DOC_ID, Predicate.fromString("country not in ['no'] and gender not in ['male']"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+
+ PredicateQuery query = new PredicateQuery();
+ assertEquals(1, searcher.search(query).count());
+ query.addFeature("country", "no");
+ assertEquals(0, searcher.search(query).count());
+ query.addFeature("gender", "male");
+ assertEquals(0, searcher.search(query).count());
+
+ query = new PredicateQuery();
+ query.addFeature("gender", "male");
+ assertEquals(0, searcher.search(query).count());
+ }
+ }
+
+ @Test
+ public void requireThatSearchesCanUseSubqueries() {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(DOC_ID, Predicate.fromString("country in [no] and gender in [male]"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+
+ PredicateQuery query = new PredicateQuery();
+ query.addFeature("country", "no", 0x3);
+ assertEquals(0, searcher.search(query).count());
+ query.addFeature("gender", "male", 0x6);
+ assertEquals("[[42,0x2]]", searcher.search(query).collect(toList()).toString());
+ }
+
+ @Test
+ public void requireThatPredicateIndexCanSearchWithRange() {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(1, Predicate.fromString("gender in ['male'] and age in [20..40]"));
+ builder.indexDocument(2, Predicate.fromString("gender in ['female'] and age in [20..40]"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+ PredicateQuery query = new PredicateQuery();
+ query.addFeature("gender", "male");
+ query.addRangeFeature("age", 36);
+ assertEquals("[1]", searcher.search(query).collect(toList()).toString());
+ query.addFeature("gender", "female");
+ assertEquals("[1, 2]", searcher.search(query).collect(toList()).toString());
+ }
+
+ @Test
+ public void requireThatPredicateIndexCanSearchWithEmptyDocuments() {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(1, Predicate.fromString("true"));
+ builder.indexDocument(2, Predicate.fromString("false"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+ PredicateQuery query = new PredicateQuery();
+ assertEquals("[1]", searcher.search(query).collect(toList()).toString());
+ }
+
+ @Test
+ public void requireThatPredicatesHavingMultipleIdenticalConjunctionsAreSupported() {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(DOC_ID, Predicate.fromString(
+ "((a in ['b'] and c in ['d']) or x in ['y']) and ((a in ['b'] and c in ['d']) or z in ['w'])"));
+ PredicateIndex index = builder.build();
+ PredicateIndex.Searcher searcher = index.searcher();
+ PredicateQuery query = new PredicateQuery();
+ query.addFeature("a", "b");
+ query.addFeature("c", "d");
+ assertEquals("[42]", searcher.search(query).collect(toList()).toString());
+ }
+
+ @Test
+ public void require_that_serialization_and_deserialization_retain_data() throws IOException {
+ PredicateIndexBuilder builder = new PredicateIndexBuilder(10);
+ builder.indexDocument(1, Predicate.fromString("country in ['no', 'se'] and gender in ['male']"));
+ builder.indexDocument(0x3fffffe, Predicate.fromString("country in ['no'] and gender in ['female']"));
+ PredicateIndex index = builder.build();
+ assertSerializationDeserializationMatches(
+ index, PredicateIndex::writeToOutputStream, PredicateIndex::fromInputStream);
+ }
+}