diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-05-23 23:06:18 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-05-23 23:07:01 +0200 |
commit | 8365add7b94a88eec13e38c473f1b688e1f2d28a (patch) | |
tree | 28703379f04ad162c414490d73b0b7cad99ca022 /container-search | |
parent | 75e72150aa9cbcf4cfd8a0028fab5615c9bd23d4 (diff) |
Add SameElementItem for struct search support.
Diffstat (limited to 'container-search')
3 files changed, 94 insertions, 1 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/Item.java b/container-search/src/main/java/com/yahoo/prelude/query/Item.java index e8e0a07941e..0ba4133901a 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/Item.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/Item.java @@ -52,7 +52,7 @@ public abstract class Item implements Cloneable { WEIGHTEDSET(15), WEAK_AND(16), EXACT(17), - LEGACY_RISE_QUERY_NOT_USED_ANYMORE_BUT_DO_NOT_REUSE_FOR_A_WHILE(18), + SAME_ELEMENT(18), PURE_WEIGHTED_STRING(19), PURE_WEIGHTED_INTEGER(20), DOTPRODUCT(21), diff --git a/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java b/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java new file mode 100644 index 00000000000..a52d4dd3db3 --- /dev/null +++ b/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java @@ -0,0 +1,58 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.prelude.query; + + +import com.yahoo.protect.Validator; + +import java.util.Iterator; + +/** + * This represents a query where all terms are required to match in the sma element id. + * The primary usecase is to allow efficient search in arrays and maps of struct. + * The common path is the field name containing the struct. + * @author baldersheim + */ +public class SameElementItem extends CompositeIndexedItem { + + public SameElementItem(String commonPath) { + setIndexName(commonPath); + } + + @Override + public String getIndexedString() { + StringBuilder buf = new StringBuilder(); + + for (Iterator<Item> i = getItemIterator(); i.hasNext();) { + IndexedItem indexedItem = (IndexedItem) i.next(); + + buf.append(indexedItem.getIndexedString()); + if (i.hasNext()) { + buf.append(' '); + } + } + return buf.toString(); } + + @Override + public int getNumWords() { + return getItemCount(); + } + + @Override + protected void adding(Item item) { + Validator.ensureInstanceOf("Child item", item, TermItem.class); + TermItem asTerm = (TermItem) item; + Validator.ensureNotNull("Struct fieldname", asTerm.getIndexName()); + Validator.ensureNotNull("Query term", asTerm.getIndexedString()); + Validator.ensureNonEmpty("Struct fieldname", asTerm.getIndexName()); + Validator.ensureNonEmpty("Query term", asTerm.getIndexedString()); + } + @Override + public ItemType getItemType() { + return ItemType.SAME_ELEMENT; + } + + @Override + public String getName() { + return getItemType().toString(); + } +} diff --git a/container-search/src/test/java/com/yahoo/prelude/query/test/SameElementItemTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/test/SameElementItemTestCase.java new file mode 100644 index 00000000000..83c525565ba --- /dev/null +++ b/container-search/src/test/java/com/yahoo/prelude/query/test/SameElementItemTestCase.java @@ -0,0 +1,35 @@ +package com.yahoo.prelude.query.test; + +import com.yahoo.prelude.query.AndItem; +import com.yahoo.prelude.query.SameElementItem; +import com.yahoo.prelude.query.WordItem; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SameElementItemTestCase { + @Test + public void testAddItem() { + SameElementItem s = new SameElementItem("structa"); + s.addItem(new WordItem("b", "f1")); + s.addItem(new WordItem("c", "f2")); + s.addItem(new WordItem("d", "f3")); + assertEquals("SAME_ELEMENT f1:b f2:c f3:d", s.toString()); + } + @Test(expected = IllegalArgumentException.class) + public void requireAllChildrenHaveStructMemberNameSet() { + SameElementItem s = new SameElementItem("structa"); + s.addItem(new WordItem("b", "f1")); + s.addItem(new WordItem("c")); + } + @Test(expected = IllegalArgumentException.class) + public void requireAllChildrenHaveNonEmptyTerm() { + SameElementItem s = new SameElementItem("structa"); + s.addItem(new WordItem("", "f2")); + } + @Test(expected = IllegalArgumentException.class) + public void requireAllChildrenAreTermItems() { + SameElementItem s = new SameElementItem("structa"); + s.addItem(new AndItem()); + } +} |