diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /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.java | 141 |
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); + } +} |