diff options
Diffstat (limited to 'container-search/src/test/java/com/yahoo/prelude/query/ItemLabelTestCase.java')
-rw-r--r-- | container-search/src/test/java/com/yahoo/prelude/query/ItemLabelTestCase.java | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/container-search/src/test/java/com/yahoo/prelude/query/ItemLabelTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/ItemLabelTestCase.java new file mode 100644 index 00000000000..62ef9c28ce6 --- /dev/null +++ b/container-search/src/test/java/com/yahoo/prelude/query/ItemLabelTestCase.java @@ -0,0 +1,86 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.prelude.query; + +import java.lang.reflect.Modifier; + +import static org.junit.Assert.*; +import org.junit.Test; + +import com.yahoo.search.Query; +import com.yahoo.prelude.query.textualrepresentation.Discloser; + +public class ItemLabelTestCase { + + private static final class LabelCatcher implements Discloser { + public String label = null; + public void addProperty(String key, Object value) { + if (key.equals("label")) { + if (value == null) { + label = "null"; + } else { + label = (String) value; + } + } + } + public void setValue(Object value) {} + public void addChild(Item item) {} + } + + @Test + public final void testLabelVisibility() throws Exception { + assertTrue(Modifier.isPublic(Item.class.getMethod("setLabel", String.class).getModifiers())); + assertTrue(Modifier.isPublic(Item.class.getMethod("getLabel").getModifiers())); + } + + @Test + public final void testLabelAccess() { + Item item = new WordItem("word"); + assertFalse(item.hasUniqueID()); + assertNull(item.getLabel()); + item.setLabel("my_label"); + assertTrue(item.hasUniqueID()); + assertEquals("my_label", item.getLabel()); + } + + @Test + public final void testLabelDisclose() { + LabelCatcher catcher = new LabelCatcher(); + Item item = new WordItem("word"); + item.disclose(catcher); + assertNull(catcher.label); + item.setLabel("my_other_label"); + item.disclose(catcher); + assertEquals("my_other_label", item.getLabel()); + } + + @Test + public final void testLabelEncode() { + Item w1 = new WordItem("w1"); + Item w2 = new WordItem("w2"); + Item w3 = new WordItem("w3"); + AndItem and = new AndItem(); + Query query = new Query(); + + w1.setLabel("bar"); + w3.setLabel("foo"); + and.addItem(w1); + and.addItem(w2); + and.addItem(w3); + and.setLabel("missing"); + query.getModel().getQueryTree().setRoot(and); + query.prepare(); + assertEquals("3", query.getRanking().getProperties().get("vespa.label.foo.id").get(0)); + assertEquals("1", query.getRanking().getProperties().get("vespa.label.bar.id").get(0)); + + // Conceptually, any node can have a label. However, only + // taggable nodes are allowed to have a unique id. Taggable + // nodes act as leaf nodes, but labels should be possible for + // any combination of nodes in the query tree. Thus, generic + // labeling is appropriate, but only those items that are also + // taggable will propagate their labels to the bank-end. We + // can live with this weakness for now, as the nodes we + // typically need to label in the back-end are leaf-ish nodes. + assertNull(query.getRanking().getProperties().get("vespa.label.missing.id")); + } + +} |