diff options
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude')
6 files changed, 135 insertions, 116 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 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(); - } - } |