diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2018-10-16 08:39:41 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahoo-inc.com> | 2018-10-16 08:45:06 +0000 |
commit | a7f5771a74e31c305cd0bda3dc75b1b1fa5d97ff (patch) | |
tree | 0a3ec5bce1c03ee43f6e89426af73f4964f4374b /container-search | |
parent | 129c1f3755b3f50d35cca7ae0e2d843777880cd1 (diff) |
implement sorting on fields inside structs
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/FieldComparator.java | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/result/FieldComparator.java b/container-search/src/main/java/com/yahoo/search/result/FieldComparator.java index 21650d531be..d60075dccd8 100644 --- a/container-search/src/main/java/com/yahoo/search/result/FieldComparator.java +++ b/container-search/src/main/java/com/yahoo/search/result/FieldComparator.java @@ -1,6 +1,8 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.search.result; +import com.yahoo.data.access.Inspector; +import com.yahoo.data.access.Inspectable; import com.yahoo.search.query.Sorting; import java.util.Comparator; @@ -72,10 +74,50 @@ public class FieldComparator extends ChainableComparator { return super.compare(first,second); } + private Object getSubField(Object field, String key) { + if (field instanceof Inspectable) { + Inspector top = ((Inspectable)field).inspect(); + int firstDot = key.indexOf('.'); + if (firstDot > 0) { + Inspector sub = top.field(key.substring(0, firstDot)); + if (sub.valid()) { + return getSubField(sub, key.substring(firstDot + 1)); + } + } + Inspector sub = top.field(key); + if (sub.valid()) { + switch (sub.type()) { + case EMPTY: + return null; + case BOOL: + return (sub.asBool() ? Boolean.TRUE : Boolean.FALSE); + case LONG: + return new Long(sub.asLong()); + case DOUBLE: + return new Double(sub.asDouble()); + case STRING: + return sub.asString(); + } + return sub.toString(); + } + } + // fallback value + return field; + } + public Object getField(Hit hit,String key) { if ("[relevance]".equals(key)) return hit.getRelevance(); if ("[rank]".equals(key)) return hit.getRelevance(); if ("[source]".equals(key)) return hit.getSource(); + // missing: "[docid]" + int firstDot = key.indexOf('.'); + if (firstDot > 0 && hit.getField(key) == null) { + String keyPrefix = key.substring(0, firstDot); + String keySuffix = key.substring(firstDot + 1); + Object a = hit.getField(keyPrefix); + Object b = getSubField(a, keySuffix); + return b; + } return hit.getField(key); } |