summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-11-02 23:52:27 +0100
committerJon Bratseth <bratseth@gmail.com>2021-11-02 23:52:27 +0100
commit8a4f6dd177c3d27009c06a46a57fddd0d8ec86b7 (patch)
tree9a7b9ff1a9872bb65cb2c01ea78aa887296d829d
parent355b1d01147f0cc8d57118fb1f9278f2a09aaf9b (diff)
Disclose entries as pure items
-rw-r--r--component/src/main/java/com/yahoo/component/AbstractComponent.java2
-rw-r--r--container-search/abi-spec.json9
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/Item.java8
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/PureWeightedInteger.java11
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/PureWeightedItem.java14
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/PureWeightedString.java11
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/WeightedSetItem.java22
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/textualrepresentation/TextualQueryRepresentation.java185
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/query/test/WandItemTestCase.java14
9 files changed, 149 insertions, 127 deletions
diff --git a/component/src/main/java/com/yahoo/component/AbstractComponent.java b/component/src/main/java/com/yahoo/component/AbstractComponent.java
index 3fbae31a743..2597817f9fc 100644
--- a/component/src/main/java/com/yahoo/component/AbstractComponent.java
+++ b/component/src/main/java/com/yahoo/component/AbstractComponent.java
@@ -103,7 +103,7 @@ public class AbstractComponent implements Component, Deconstructable {
public AbstractComponent clone() {
try {
AbstractComponent clone=(AbstractComponent)super.clone();
- clone.id=null;
+ clone.id = null;
return clone;
}
catch (CloneNotSupportedException e) {
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json
index 6694a37469b..9d3b4934aa3 100644
--- a/container-search/abi-spec.json
+++ b/container-search/abi-spec.json
@@ -1185,7 +1185,8 @@
"protected void appendBodyString(java.lang.StringBuilder)",
"public long getValue()",
"public boolean equals(java.lang.Object)",
- "public int hashCode()"
+ "public int hashCode()",
+ "public void disclose(com.yahoo.prelude.query.textualrepresentation.Discloser)"
],
"fields": []
},
@@ -1201,7 +1202,8 @@
"public void setIndexName(java.lang.String)",
"public java.lang.String getName()",
"public int encode(java.nio.ByteBuffer)",
- "protected void appendBodyString(java.lang.StringBuilder)"
+ "protected void appendBodyString(java.lang.StringBuilder)",
+ "public void disclose(com.yahoo.prelude.query.textualrepresentation.Discloser)"
],
"fields": []
},
@@ -1220,7 +1222,8 @@
"protected void appendBodyString(java.lang.StringBuilder)",
"public java.lang.String getString()",
"public boolean equals(java.lang.Object)",
- "public int hashCode()"
+ "public int hashCode()",
+ "public void disclose(com.yahoo.prelude.query.textualrepresentation.Discloser)"
],
"fields": []
},
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 47efed323a9..0ba107e6e8e 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
@@ -469,7 +469,7 @@ public abstract class Item implements Cloneable {
public void disclose(Discloser discloser) {
discloser.addProperty("connectivity", connectivity);
- discloser.addProperty("connectedItem", connectedItem); //reference
+ discloser.addProperty("connectedItem", connectedItem); // reference
discloser.addProperty("creator", creator);
discloser.addProperty("explicitSignificance", explicitSignificance);
@@ -478,12 +478,10 @@ public abstract class Item implements Cloneable {
discloser.addProperty("significance", significance);
discloser.addProperty("weight", weight);
- if (label != null) {
+ if (label != null)
discloser.addProperty("label", label);
- }
- if (hasUniqueID) {
+ if (hasUniqueID)
discloser.addProperty("uniqueID", uniqueID);
- }
}
public boolean isFromSpecialToken() {
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedInteger.java b/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedInteger.java
index bf8fb2c7d9e..6bd8a8dd23e 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedInteger.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedInteger.java
@@ -1,12 +1,13 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query;
+import com.yahoo.prelude.query.textualrepresentation.Discloser;
+
import java.nio.ByteBuffer;
import java.util.Objects;
/**
- * An int item which cannot provide its own index (field) name, but will always query the index
- * specified by the parent item it is added to.
+ * An integer item which only consists of a value and weight.
*
* @author baldersheim
*/
@@ -59,4 +60,10 @@ public class PureWeightedInteger extends PureWeightedItem {
return Objects.hash(super.hashCode(), value);
}
+ @Override
+ public void disclose(Discloser discloser) {
+ super.disclose(discloser);
+ discloser.setValue(value);
+ }
+
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedItem.java b/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedItem.java
index cf7cf87434c..d7dc2781b5a 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedItem.java
@@ -1,14 +1,17 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query;
+import com.yahoo.prelude.query.textualrepresentation.Discloser;
+
import java.nio.ByteBuffer;
/**
- * An item which cannot provide its own index (field) name, but will always query the index
- * specified by the parent item it is added to.
+ * A word item which only consists of a value and weight, and gets other properties
+ * such as the index to query from ther parent item.
+ *
* It's more efficient to use pure items where possible instead of
* {@link TermItem} children ({@link WordItem}, {@link IntItem})
- * who each carry their own index name.
+ * which may carry many auxiliary properties.
*
* @author baldersheim
*/
@@ -40,4 +43,9 @@ public abstract class PureWeightedItem extends Item {
buffer.append(':').append(getWeight());
}
+ @Override
+ public void disclose(Discloser discloser) {
+ discloser.addProperty("weight", getWeight());
+ }
+
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedString.java b/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedString.java
index 58171070678..da736d0adf6 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedString.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/PureWeightedString.java
@@ -1,12 +1,13 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query;
+import com.yahoo.prelude.query.textualrepresentation.Discloser;
+
import java.nio.ByteBuffer;
import java.util.Objects;
/**
- * A word item which cannot provide its own index (field) name, but will always query the index
- * specified by the parent item it is added to.
+ * A word item which only consists of a value and weight.
*
* @author baldersheim
*/
@@ -60,4 +61,10 @@ public class PureWeightedString extends PureWeightedItem {
return Objects.hash(super.hashCode(), value);
}
+ @Override
+ public void disclose(Discloser discloser) {
+ super.disclose(discloser);
+ discloser.setValue(value);
+ }
+
}
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/WeightedSetItem.java b/container-search/src/main/java/com/yahoo/prelude/query/WeightedSetItem.java
index d5ca15f10b9..e75a8417328 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/WeightedSetItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/WeightedSetItem.java
@@ -138,11 +138,8 @@ public class WeightedSetItem extends SimpleTaggableItem {
public void disclose(Discloser discloser) {
super.disclose(discloser);
discloser.addProperty("index", indexName);
- for (Map.Entry<Object, Integer> entry : set.entrySet()) {
- WordItem subitem = new WordItem(entry.getKey().toString(), indexName);
- subitem.setWeight(entry.getValue());
- discloser.addChild(subitem);
- }
+ for (Map.Entry<Object, Integer> entry : set.entrySet())
+ discloser.addChild(asItem(entry));
}
@Override
@@ -150,17 +147,20 @@ public class WeightedSetItem extends SimpleTaggableItem {
encodeThis(buffer);
int itemCount = 1;
for (Map.Entry<Object, Integer> entry : set.entrySet()) {
- Object key = entry.getKey();
- if (key instanceof Long) {
- new PureWeightedInteger((Long)key, entry.getValue()).encode(buffer);
- } else {
- new PureWeightedString(key.toString(), entry.getValue()).encode(buffer);
- }
+ asItem(entry).encode(buffer);
itemCount++;
}
return itemCount;
}
+ private PureWeightedItem asItem(Map.Entry<Object, Integer> entry) {
+ Object key = entry.getKey();
+ if (key instanceof Long)
+ return new PureWeightedInteger((Long)key, entry.getValue());
+ else
+ return new PureWeightedString(key.toString(), entry.getValue());
+ }
+
@Override
protected void encodeThis(ByteBuffer buffer) {
super.encodeThis(buffer);
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/textualrepresentation/TextualQueryRepresentation.java b/container-search/src/main/java/com/yahoo/prelude/query/textualrepresentation/TextualQueryRepresentation.java
index 4c0c7501ba1..9efdea4dfd8 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/textualrepresentation/TextualQueryRepresentation.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/textualrepresentation/TextualQueryRepresentation.java
@@ -20,11 +20,102 @@ import java.util.regex.Pattern;
*/
public class TextualQueryRepresentation {
- private Map<Item, Integer> itemReferences = new IdentityHashMap<>();
+ private final Map<Item, Integer> itemReferences = new IdentityHashMap<>();
private int nextItemReference = 0;
final private ItemDiscloser rootDiscloser;
+ @SuppressWarnings("rawtypes")
+ private String valueString(Object value) {
+ if (value == null)
+ return null;
+ else if (value instanceof String)
+ return '"' + quote((String)value) + '"';
+ else if (value instanceof Number || value instanceof Boolean || value instanceof Enum)
+ return value.toString();
+ else if (value instanceof Item)
+ return itemReference((Item)value);
+ else if (value.getClass().isArray())
+ return listString(arrayToList(value).iterator());
+ else if ( value instanceof List )
+ return listString(((List)value).iterator());
+ else if ( value instanceof Set )
+ return listString( ((Set)value).iterator());
+ else if ( value instanceof Map )
+ return mapString((Map)value);
+ else
+ return '"' + quote(value.toString()) + '"';
+ }
+
+ //handles both primitive and object arrays.
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private List arrayToList(Object array) {
+ int length = Array.getLength(array);
+ List list = new ArrayList();
+ for (int i = 0; i<length; ++i)
+ list.add(Array.get(array, i));
+ return list;
+ }
+
+ private String mapString(Map<?, ?> map) {
+ StringBuilder result = new StringBuilder();
+ final String mapBegin = "map(";
+ result.append(mapBegin);
+
+ boolean firstTime = true;
+ for (Map.Entry<?,?> entry: map.entrySet()) {
+ if (!firstTime)
+ result.append(' ');
+ firstTime = false;
+
+ result.append(valueString(entry.getKey())).append("=>").append(valueString(entry.getValue()));
+ }
+
+ result.append(')');
+ return result.toString();
+ }
+
+ private String listString(Iterator<?> iterator) {
+ StringBuilder result = new StringBuilder();
+ result.append('(');
+
+ boolean firstTime = true;
+ while (iterator.hasNext()) {
+ if (!firstTime)
+ result.append(' ');
+ firstTime = false;
+
+ result.append(valueString(iterator.next()));
+ }
+
+ result.append(')');
+ return result.toString();
+ }
+
+ private String itemReference(Item item) {
+ Integer reference = itemReferences.get(item);
+ return reference != null ? reference.toString() : "Unknown item: '" + System.identityHashCode(item) + "'";
+ }
+
+ private static String quote(String s) {
+ return s.replaceAll("\"", "\\\\\"" );
+ }
+
+ private ItemDiscloser expose(Item item) {
+ ItemDiscloser itemDiscloser = new ItemDiscloser(item);
+ item.disclose(itemDiscloser);
+ return itemDiscloser;
+ }
+
+ public TextualQueryRepresentation(Item root) {
+ rootDiscloser = expose(root);
+ }
+
+ @Override
+ public String toString() {
+ return rootDiscloser.toString();
+ }
+
/** Creates the textual representation for a single Item. */
private class ItemDiscloser implements Discloser {
@@ -124,96 +215,4 @@ public class TextualQueryRepresentation {
}
-
- @SuppressWarnings("rawtypes")
- private String valueString(Object value) {
- if (value == null)
- return null;
- else if (value instanceof String)
- return '"' + quote((String)value) + '"';
- else if (value instanceof Number || value instanceof Boolean || value instanceof Enum)
- return value.toString();
- else if (value instanceof Item)
- return itemReference((Item)value);
- else if (value.getClass().isArray())
- return listString(arrayToList(value).iterator());
- else if ( value instanceof List )
- return listString(((List)value).iterator());
- else if ( value instanceof Set )
- return listString( ((Set)value).iterator());
- else if ( value instanceof Map )
- return mapString((Map)value);
- else
- return '"' + quote(value.toString()) + '"';
- }
-
- //handles both primitive and object arrays.
- @SuppressWarnings({ "rawtypes", "unchecked" })
- private List arrayToList(Object array) {
- int length = Array.getLength(array);
- List list = new ArrayList();
- for (int i = 0; i<length; ++i)
- list.add(Array.get(array, i));
- return list;
- }
-
- private String mapString(Map<?, ?> map) {
- StringBuilder result = new StringBuilder();
- final String mapBegin = "map(";
- result.append(mapBegin);
-
- boolean firstTime = true;
- for (Map.Entry<?,?> entry: map.entrySet()) {
- if (!firstTime)
- result.append(' ');
- firstTime = false;
-
- result.append(valueString(entry.getKey())).append("=>").append(valueString(entry.getValue()));
- }
-
- result.append(')');
- return result.toString();
- }
-
- private String listString(Iterator<?> iterator) {
- StringBuilder result = new StringBuilder();
- result.append('(');
-
- boolean firstTime = true;
- while (iterator.hasNext()) {
- if (!firstTime)
- result.append(' ');
- firstTime = false;
-
- result.append(valueString(iterator.next()));
- }
-
- result.append(')');
- return result.toString();
- }
-
- private String itemReference(Item item) {
- Integer reference = itemReferences.get(item);
- return reference != null ? reference.toString() : "Unknown item: '" + System.identityHashCode(item) + "'";
- }
-
- private static String quote(String s) {
- return s.replaceAll("\"", "\\\\\"" );
- }
-
- private ItemDiscloser expose(Item item) {
- ItemDiscloser itemDiscloser = new ItemDiscloser(item);
- item.disclose(itemDiscloser);
- return itemDiscloser;
- }
-
- public TextualQueryRepresentation(Item root) {
- rootDiscloser = expose(root);
- }
-
- @Override
- public String toString() {
- return rootDiscloser.toString();
- }
-
}
diff --git a/container-search/src/test/java/com/yahoo/prelude/query/test/WandItemTestCase.java b/container-search/src/test/java/com/yahoo/prelude/query/test/WandItemTestCase.java
index 8a8c4fe3ea7..49621c3ef8a 100644
--- a/container-search/src/test/java/com/yahoo/prelude/query/test/WandItemTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/query/test/WandItemTestCase.java
@@ -1,14 +1,13 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.prelude.query.test;
-import com.yahoo.io.HexDump;
+import com.yahoo.prelude.query.Item;
+import com.yahoo.prelude.query.PureWeightedString;
+import com.yahoo.prelude.query.WandItem;
import com.yahoo.prelude.query.textualrepresentation.Discloser;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.yahoo.prelude.query.*;
import java.nio.ByteBuffer;
import java.util.HashMap;
@@ -19,7 +18,7 @@ import java.util.Map;
*/
public class WandItemTestCase {
- private static double DELTA = 0.0000001;
+ private static final double DELTA = 0.0000001;
private static WandItem createSimpleItem() {
WandItem item = new WandItem("myfield", 10);
@@ -57,7 +56,7 @@ public class WandItemTestCase {
actual.flip();
expect.flip();
- assertTrue(actual.equals(expect));
+ assertEquals(expect, actual);
}
@Test
@@ -68,7 +67,7 @@ public class WandItemTestCase {
@Test
public void requireThatDiscloseIsWorking() {
class TestDiscloser implements Discloser {
- public Map<String, Object> props = new HashMap<>();
+ public final Map<String, Object> props = new HashMap<>();
public void addProperty(String key, Object value) {
props.put(key, value);
}
@@ -82,4 +81,5 @@ public class WandItemTestCase {
assertEquals(2.0, discloser.props.get("thresholdBoostFactor"));
assertEquals("myfield", discloser.props.get("index"));
}
+
}