diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-10-16 12:38:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-16 12:38:55 +0200 |
commit | f3f0aad682088dfa46c8c677ace04a8bbdea8865 (patch) | |
tree | 07ddb8b2353c35d664617f8523c3f81ead3849e3 | |
parent | 75f41674be28abd66c02758655487d79afa5349b (diff) | |
parent | e1f34ea289348f11bd0842bd23294166d09a38ab (diff) |
Merge pull request #7322 from vespa-engine/arnej/sort-missing-values-take-4
Arnej/sort missing values take 4
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/FieldComparator.java | 53 |
1 files changed, 48 insertions, 5 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..c835ab744b1 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; @@ -57,11 +59,6 @@ public class FieldComparator extends ChainableComparator { Object a = getField(first,fieldName); Object b = getField(second,fieldName); - // If either of the values are null, don't touch the ordering - // This is to avoid problems if the sorting is called before the - // result is filled. - if ((a == null) || (b == null)) return 0; - int x = compareValues(a, b, fieldOrder.getSorter()); if (x != 0) { if (fieldOrder.getSortOrder() == Sorting.Order.DESCENDING) @@ -72,15 +69,61 @@ 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); } @SuppressWarnings("rawtypes") private int compareValues(Object first, Object second, Sorting.AttributeSorter s) { + if (first == null) { + if (second == null) return 0; + return -1; + } else if (second == null) { + return 1; + } if (first.getClass().isInstance(second) && first instanceof Comparable) { // We now know: |