From 8a4f6dd177c3d27009c06a46a57fddd0d8ec86b7 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Tue, 2 Nov 2021 23:52:27 +0100 Subject: Disclose entries as pure items --- .../com/yahoo/component/AbstractComponent.java | 2 +- container-search/abi-spec.json | 9 +- .../main/java/com/yahoo/prelude/query/Item.java | 8 +- .../yahoo/prelude/query/PureWeightedInteger.java | 11 +- .../com/yahoo/prelude/query/PureWeightedItem.java | 14 +- .../yahoo/prelude/query/PureWeightedString.java | 11 +- .../com/yahoo/prelude/query/WeightedSetItem.java | 22 +-- .../TextualQueryRepresentation.java | 185 ++++++++++----------- .../yahoo/prelude/query/test/WandItemTestCase.java | 14 +- 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 entry : set.entrySet()) { - WordItem subitem = new WordItem(entry.getKey().toString(), indexName); - subitem.setWeight(entry.getValue()); - discloser.addChild(subitem); - } + for (Map.Entry 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 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 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 itemReferences = new IdentityHashMap<>(); + private final Map 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 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 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 props = new HashMap<>(); + public final Map 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")); } + } -- cgit v1.2.3