aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/test/java/com/yahoo/prelude/query/ItemLabelTestCase.java
diff options
context:
space:
mode:
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.java86
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"));
+ }
+
+}