From 685194b9def01dbe15bef4d48b90c8462d427445 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 8 Sep 2022 11:57:22 +0200 Subject: Apply aliases to sortspec --- .../main/java/com/yahoo/search/query/Ranking.java | 2 +- .../main/java/com/yahoo/search/query/Sorting.java | 63 +++++++++++++--------- 2 files changed, 38 insertions(+), 27 deletions(-) (limited to 'container-search/src/main/java/com/yahoo/search/query') diff --git a/container-search/src/main/java/com/yahoo/search/query/Ranking.java b/container-search/src/main/java/com/yahoo/search/query/Ranking.java index e11786c2f2e..279ec3b0ff2 100644 --- a/container-search/src/main/java/com/yahoo/search/query/Ranking.java +++ b/container-search/src/main/java/com/yahoo/search/query/Ranking.java @@ -220,7 +220,7 @@ public class Ranking implements Cloneable { if (sortingString == null) setSorting((Sorting)null); else - setSorting(new Sorting(sortingString)); + setSorting(new Sorting(sortingString, parent)); } public static Ranking getFrom(Query q) { diff --git a/container-search/src/main/java/com/yahoo/search/query/Sorting.java b/container-search/src/main/java/com/yahoo/search/query/Sorting.java index f1da48c1e08..6b07b5ef1d5 100644 --- a/container-search/src/main/java/com/yahoo/search/query/Sorting.java +++ b/container-search/src/main/java/com/yahoo/search/query/Sorting.java @@ -3,7 +3,10 @@ package com.yahoo.search.query; import com.ibm.icu.text.Collator; import com.ibm.icu.util.ULocale; +import com.yahoo.prelude.IndexFacts; import com.yahoo.processing.IllegalInputException; +import com.yahoo.search.Query; +import com.yahoo.search.searchchain.Execution; import com.yahoo.text.Utf8; import java.nio.ByteBuffer; @@ -38,7 +41,15 @@ public class Sorting implements Cloneable { /** Creates a sort spec from a string */ public Sorting(String sortSpec) { - setSpec(sortSpec); + setSpec(sortSpec, null); + } + + /** Creates a sort spec from a string, for a given query. */ + public Sorting(String sortSpec, Query query) { + IndexFacts.Session session = null; + if (query != null && query.getModel().getExecution().context().getIndexFacts() != null) + session = query.getModel().getExecution().context().getIndexFacts().newSession(query); + setSpec(sortSpec, session); } /** @@ -51,7 +62,7 @@ public class Sorting implements Cloneable { return new Sorting(sortSpec); } - private void setSpec(String rawSortSpec) { + private void setSpec(String rawSortSpec, IndexFacts.Session indexFacts) { for (String sortString : rawSortSpec.split(" ")) { // A sortspec element must be at least two characters long, // a sorting order and an attribute vector name @@ -66,12 +77,12 @@ public class Sorting implements Cloneable { int startPar = sortString.indexOf('(',funcAttrStart); int endPar = sortString.lastIndexOf(')'); if ((startPar > 0) && (endPar > startPar)) { - String funcName = sortString.substring(funcAttrStart, startPar); - if (LOWERCASE.equalsIgnoreCase(funcName)) { - sorter = new LowerCaseSorter(sortString.substring(startPar+1, endPar)); - } else if (RAW.equalsIgnoreCase(funcName)) { - sorter = new RawSorter(sortString.substring(startPar+1, endPar)); - } else if (UCA.equalsIgnoreCase(funcName)) { + String functionName = sortString.substring(funcAttrStart, startPar); + if (LOWERCASE.equalsIgnoreCase(functionName)) { + sorter = new LowerCaseSorter(canonic(sortString.substring(startPar+1, endPar), indexFacts)); + } else if (RAW.equalsIgnoreCase(functionName)) { + sorter = new RawSorter(canonic(sortString.substring(startPar+1, endPar), indexFacts)); + } else if (UCA.equalsIgnoreCase(functionName)) { int commaPos = sortString.indexOf(',', startPar+1); if ((startPar+1 < commaPos) && (commaPos < endPar)) { int commaopt = sortString.indexOf(',', commaPos + 1); @@ -91,22 +102,24 @@ public class Sorting implements Cloneable { } else { throw new IllegalInputException("Unknown collation strength: '" + s + "'"); } - sorter = new UcaSorter(sortString.substring(startPar+1, commaPos), sortString.substring(commaPos+1, commaopt), strength); + sorter = new UcaSorter(canonic(sortString.substring(startPar+1, commaPos), indexFacts), + sortString.substring(commaPos+1, commaopt), strength); } else { - sorter = new UcaSorter(sortString.substring(startPar+1, commaPos), sortString.substring(commaPos+1, endPar), strength); + sorter = new UcaSorter(canonic(sortString.substring(startPar+1, commaPos), indexFacts), + sortString.substring(commaPos+1, endPar), strength); } } else { - sorter = new UcaSorter(sortString.substring(startPar+1, endPar)); + sorter = new UcaSorter(canonic(sortString.substring(startPar+1, endPar), indexFacts)); } } else { - if (funcName.isEmpty()) { + if (functionName.isEmpty()) { throw new IllegalInputException("No sort function specified"); } else { - throw new IllegalInputException("Unknown sort function '" + funcName + "'"); + throw new IllegalInputException("Unknown sort function '" + functionName + "'"); } } } else { - sorter = new AttributeSorter(sortString.substring(funcAttrStart)); + sorter = new AttributeSorter(canonic(sortString.substring(funcAttrStart), indexFacts)); } Order order = Order.UNDEFINED; if (funcAttrStart != 0) { @@ -117,6 +130,11 @@ public class Sorting implements Cloneable { } } + private String canonic(String attributeName, IndexFacts.Session indexFacts) { + if (indexFacts == null) return attributeName; + return indexFacts.getCanonicName(attributeName); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -194,11 +212,9 @@ public class Sorting implements Cloneable { private String fieldName; public AttributeSorter(String fieldName) { - if (legalAttributeName.matcher(fieldName).matches()) { - this.fieldName = fieldName; - } else { + if ( ! legalAttributeName.matcher(fieldName).matches()) throw new IllegalInputException("Illegal attribute name '" + fieldName + "' for sorting. Requires '" + legalAttributeName.pattern() + "'"); - } + this.fieldName = fieldName; } public String getName() { return fieldName; } @@ -414,14 +430,9 @@ public class Sorting implements Cloneable { } @Override - public boolean equals(Object other) { - if (!(other instanceof FieldOrder)) { - return false; - } - FieldOrder otherAttr = (FieldOrder) other; - - return otherAttr.sortOrder.equals(sortOrder) - && otherAttr.fieldSorter.equals(fieldSorter); + public boolean equals(Object o) { + if (!(o instanceof FieldOrder other)) return false; + return other.sortOrder.equals(sortOrder) && other.fieldSorter.equals(fieldSorter); } @Override -- cgit v1.2.3