diff options
Diffstat (limited to 'container-search/src/main/java/com')
-rw-r--r-- | container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java | 19 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java | 7 |
2 files changed, 17 insertions, 9 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java b/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java index bc6463a24eb..3b3bc468fe3 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/SameElementItem.java @@ -16,27 +16,28 @@ import java.util.Iterator; @Beta public class SameElementItem extends CompositeItem { - private final String commonPath; + private final String fieldName; public SameElementItem(String commonPath) { - this.commonPath = commonPath; + Validator.ensureNonEmpty("Field name", commonPath); + this.fieldName = commonPath; } @Override protected void encodeThis(ByteBuffer buffer) { super.encodeThis(buffer); - putString(commonPath, buffer); + putString(fieldName, buffer); } @Override protected void appendHeadingString(StringBuilder buffer) { } @Override protected void appendBodyString(StringBuilder buffer) { - buffer.append(commonPath).append(':'); + buffer.append(fieldName).append(':'); buffer.append('{'); for (Iterator<Item> i = getItemIterator(); i.hasNext();) { TermItem term = (TermItem) i.next(); - buffer.append(term.getIndexName()).append(':').append(term.getIndexedString()); + buffer.append(extractSubFieldName(term)).append(':').append(term.getIndexedString()); if (i.hasNext()) { buffer.append(' '); } @@ -50,6 +51,9 @@ public class SameElementItem extends CompositeItem { TermItem asTerm = (TermItem) item; Validator.ensureNonEmpty("Struct fieldname", asTerm.getIndexName()); Validator.ensureNonEmpty("Query term", asTerm.getIndexedString()); + Validator.ensure("Struct fieldname does not start with '" + getFieldName() + "'", + !asTerm.getIndexName().startsWith(fieldName)); + item.setIndexName(fieldName + '.' + asTerm.getIndexName()); } @Override public ItemType getItemType() { @@ -60,5 +64,8 @@ public class SameElementItem extends CompositeItem { public String getName() { return getItemType().toString(); } - public String getCommonPath() { return commonPath; } + public String getFieldName() { return fieldName; } + public String extractSubFieldName(TermItem full) { + return full.getIndexName().substring(getFieldName().length()+1); + } } diff --git a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java index 1d89a5d7a68..12aec81a5f8 100644 --- a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java +++ b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java @@ -597,7 +597,7 @@ public class VespaSerializer { SameElementItem sameElement = (SameElementItem) item; if (includeField) { - destination.append(normalizeIndexName(sameElement.getCommonPath())).append(" contains "); + destination.append(normalizeIndexName(sameElement.getFieldName())).append(" contains "); } destination.append(SAME_ELEMENT).append('('); @@ -607,8 +607,9 @@ public class VespaSerializer { } Item current = sameElement.getItem(i); if (current instanceof WordItem) { - new WordSerializer().serialize(destination, current); - + WordItem modified = (WordItem)current.clone(); + modified.setIndexName(sameElement.extractSubFieldName(modified)); + new WordSerializer().serialize(destination, modified); } else { throw new IllegalArgumentException( "Serializing of " + current.getClass().getSimpleName() |