aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2018-10-16 08:39:41 +0000
committerArne Juul <arnej@yahoo-inc.com>2018-10-16 08:45:06 +0000
commita7f5771a74e31c305cd0bda3dc75b1b1fa5d97ff (patch)
tree0a3ec5bce1c03ee43f6e89426af73f4964f4374b /container-search
parent129c1f3755b3f50d35cca7ae0e2d843777880cd1 (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.java42
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);
}