summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/Query.java70
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/CompressService.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java31
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java15
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/UniqueGroupingSearcher.java39
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/result/FlatteningSearcher.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/intent/model/IntentModel.java13
-rw-r--r--container-search/src/main/java/com/yahoo/search/pagetemplates/PageTemplateSearcher.java8
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/Model.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/Ranking.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfile.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/profile/types/FieldDescription.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/profile/types/QueryProfileType.java8
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/properties/DefaultProperties.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/properties/SubProperties.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/ranking/SoftTimeout.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/rewrite/RewriterConstants.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/SortingDegrader.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java12
-rw-r--r--container-search/src/main/java/com/yahoo/search/querytransform/WeakAndReplacementSearcher.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java31
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java8
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/CacheControlSearcher.java6
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java2
-rwxr-xr-xcontainer-search/src/main/java/com/yahoo/search/searchers/RateLimitingSearcher.java10
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/FieldFiller.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/MinimalQueryInserter.java6
35 files changed, 177 insertions, 167 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/Query.java b/container-search/src/main/java/com/yahoo/search/Query.java
index cff43e07d70..73ed89687fe 100644
--- a/container-search/src/main/java/com/yahoo/search/Query.java
+++ b/container-search/src/main/java/com/yahoo/search/Query.java
@@ -48,7 +48,6 @@ import com.yahoo.yolean.Exceptions;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -180,23 +179,23 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
//---------------- Static property handling ------------------------------------
- public static final CompoundName OFFSET = new CompoundName("offset");
- public static final CompoundName HITS = new CompoundName("hits");
+ public static final CompoundName OFFSET = CompoundName.from("offset");
+ public static final CompoundName HITS = CompoundName.from("hits");
- public static final CompoundName QUERY_PROFILE = new CompoundName("queryProfile");
- public static final CompoundName SEARCH_CHAIN = new CompoundName("searchChain");
+ public static final CompoundName QUERY_PROFILE = CompoundName.from("queryProfile");
+ public static final CompoundName SEARCH_CHAIN = CompoundName.from("searchChain");
- public static final CompoundName NO_CACHE = new CompoundName("noCache");
- public static final CompoundName GROUPING_SESSION_CACHE = new CompoundName("groupingSessionCache");
- public static final CompoundName TIMEOUT = new CompoundName("timeout");
+ public static final CompoundName NO_CACHE = CompoundName.from("noCache");
+ public static final CompoundName GROUPING_SESSION_CACHE = CompoundName.from("groupingSessionCache");
+ public static final CompoundName TIMEOUT = CompoundName.from("timeout");
/** @deprecated use Trace.LEVEL */
@Deprecated // TODO: Remove on Vespa 9
- public static final CompoundName TRACE_LEVEL = new CompoundName("traceLevel");
+ public static final CompoundName TRACE_LEVEL = CompoundName.from("traceLevel");
/** @deprecated use Trace.EXPLAIN_LEVEL */
@Deprecated // TODO: Remove on Vespa 9
- public static final CompoundName EXPLAIN_LEVEL = new CompoundName("explainLevel");
+ public static final CompoundName EXPLAIN_LEVEL = CompoundName.from("explainLevel");
private static final QueryProfileType argumentType;
static {
@@ -228,17 +227,17 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
private static final Map<String, CompoundName> propertyAliases;
static {
Map<String, CompoundName> propertyAliasesBuilder = new HashMap<>();
- addAliases(Query.getArgumentType(), CompoundName.empty, propertyAliasesBuilder);
+ addAliases(Query.getArgumentType(), "", propertyAliasesBuilder);
propertyAliases = ImmutableMap.copyOf(propertyAliasesBuilder);
}
- private static void addAliases(QueryProfileType arguments, CompoundName prefix, Map<String, CompoundName> aliases) {
+ private static void addAliases(QueryProfileType arguments, String prefix, Map<String, CompoundName> aliases) {
for (FieldDescription field : arguments.fields().values()) {
for (String alias : field.getAliases())
- aliases.put(alias, prefix.append(field.getName()));
+ aliases.put(alias, CompoundName.from(append(prefix, field.getName())));
if (field.getType() instanceof QueryProfileFieldType) {
var type = ((QueryProfileFieldType) field.getType()).getQueryProfileType();
if (type != null)
- addAliases(type, prefix.append(type.getComponentIdAsCompoundName()), aliases);
+ addAliases(type, append(prefix, type.getComponentIdAsCompoundName().toString()), aliases);
}
}
}
@@ -261,18 +260,18 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
/** Returns an unmodifiable list of all the native properties under a Query */
public static final List<CompoundName> nativeProperties =
- List.copyOf(namesUnder(CompoundName.empty, Query.getArgumentType()));
+ List.copyOf(namesUnder("", Query.getArgumentType()));
- private static List<CompoundName> namesUnder(CompoundName prefix, QueryProfileType type) {
- if (type == null) return Collections.emptyList(); // Names not known statically
+ private static List<CompoundName> namesUnder(String prefix, QueryProfileType type) {
+ if (type == null) return List.of(); // Names not known statically
List<CompoundName> names = new ArrayList<>();
for (Map.Entry<String, FieldDescription> field : type.fields().entrySet()) {
+ String name = append(prefix, field.getKey());
if (field.getValue().getType() instanceof QueryProfileFieldType) {
- names.addAll(namesUnder(prefix.append(field.getKey()),
- ((QueryProfileFieldType) field.getValue().getType()).getQueryProfileType()));
+ names.addAll(namesUnder(name, ((QueryProfileFieldType) field.getValue().getType()).getQueryProfileType()));
}
else {
- names.add(prefix.append(field.getKey()));
+ names.add(CompoundName.from(name));
}
}
return names;
@@ -426,28 +425,36 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
* dependent objects for the appropriate subset of the given property values
*/
private void setFieldsFrom(Properties properties, Map<String, String> context) {
- setFrom(CompoundName.empty, properties, Query.getArgumentType(), context);
+ setFrom("", properties, Query.getArgumentType(), context);
+ }
+
+ private static String append(String a, String b) {
+ if (a.isEmpty()) return b;
+ if (b.isEmpty()) return a;
+ return a + "." + b;
}
/**
* For each field in the given query profile type, take the corresponding value from originalProperties
* (if any) set it to properties(), recursively.
*/
- private void setFrom(CompoundName prefix, Properties originalProperties, QueryProfileType arguments, Map<String, String> context) {
- prefix = prefix.append(getPrefix(arguments));
+ private void setFrom(String prefix, Properties originalProperties, QueryProfileType arguments, Map<String, String> context) {
+ prefix = append(prefix, getPrefix(arguments).toString());
for (FieldDescription field : arguments.fields().values()) {
if (field.getType() == FieldType.genericQueryProfileType) { // Generic map
- CompoundName fullName = prefix.append(field.getCompoundName());
- for (Map.Entry<String, Object> entry : originalProperties.listProperties(fullName, context).entrySet()) {
- properties().set(fullName.append(entry.getKey()), entry.getValue(), context);
+ String fullName = append(prefix, field.getCompoundName().toString());
+ for (Map.Entry<String, Object> entry : originalProperties.listProperties(CompoundName.from(fullName), context).entrySet()) {
+ properties().set(CompoundName.from(append(fullName, entry.getKey())), entry.getValue(), context);
}
}
else if (field.getType() instanceof QueryProfileFieldType) { // Nested arguments
setFrom(prefix, originalProperties, ((QueryProfileFieldType)field.getType()).getQueryProfileType(), context);
}
else {
- CompoundName fullName = prefix.append(field.getCompoundName());
+ CompoundName fullName = prefix.isEmpty()
+ ? field.getCompoundName()
+ : CompoundName.from(append(prefix, field.getCompoundName().toString()));
Object value = originalProperties.get(fullName, context);
if (value != null) {
properties().set(fullName, value, context);
@@ -458,14 +465,15 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
/** Calls properties.set on all entries in requestMap */
private void setPropertiesFromRequestMap(Map<String, String> requestMap, Properties properties, boolean ignoreSelect) {
- for (var entry : requestMap.entrySet()) {
+ var entrySet = requestMap.entrySet();
+ for (var entry : entrySet) {
if (ignoreSelect && entry.getKey().equals(Select.SELECT)) continue;
if (RankFeatures.isFeatureName(entry.getKey())) continue; // Set these last
- properties.set(entry.getKey(), entry.getValue(), requestMap);
+ properties.set(CompoundName.from(entry.getKey()), entry.getValue(), requestMap);
}
- for (var entry : requestMap.entrySet()) {
+ for (var entry : entrySet) {
if ( ! RankFeatures.isFeatureName(entry.getKey())) continue;
- properties.set(entry.getKey(), entry.getValue(), requestMap);
+ properties.set(CompoundName.from(entry.getKey()), entry.getValue(), requestMap);
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java
index 09db1be4732..4e4b77422c1 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/Dispatcher.java
@@ -52,7 +52,7 @@ public class Dispatcher extends AbstractComponent {
private static final int MAX_GROUP_SELECTION_ATTEMPTS = 3;
/** If set will control computation of how many hits will be fetched from each partition.*/
- public static final CompoundName topKProbability = CompoundName.fromComponents(DISPATCH, TOP_K_PROBABILITY);
+ public static final CompoundName topKProbability = CompoundName.from(DISPATCH + "." + TOP_K_PROBABILITY);
private final DispatchConfig dispatchConfig;
private final RpcResourcePool rpcResourcePool;
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/CompressService.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/CompressService.java
index 9e7fc9b5b29..c10375a3014 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/CompressService.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/CompressService.java
@@ -13,7 +13,7 @@ import com.yahoo.search.Query;
*/
public class CompressService implements CompressPayload {
/** The compression method which will be used with rpc dispatch. "lz4" (default) and "none" is supported. */
- public final static CompoundName dispatchCompression = new CompoundName("dispatch.compression");
+ public static final CompoundName dispatchCompression = CompoundName.from("dispatch.compression");
private final Compressor compressor = new Compressor(CompressionType.LZ4, 5, 0.95, 256);
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java
index 4466b03a713..154002c4f77 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcInvokerFactory.java
@@ -20,11 +20,20 @@ public class RpcInvokerFactory extends InvokerFactory {
private final RpcConnectionPool rpcResourcePool;
private final CompressPayload compressor;
+ private final RpcProtobufFillInvoker.DecodePolicy decodeType;
+
+ private static RpcProtobufFillInvoker.DecodePolicy convert(DispatchConfig.SummaryDecodePolicy.Enum decoding) {
+ return switch (decoding) {
+ case EAGER -> RpcProtobufFillInvoker.DecodePolicy.EAGER;
+ case ONDEMAND -> RpcProtobufFillInvoker.DecodePolicy.ONDEMAND;
+ };
+ }
public RpcInvokerFactory(RpcConnectionPool rpcResourcePool, SearchGroups cluster, DispatchConfig dispatchConfig) {
super(cluster, dispatchConfig);
this.rpcResourcePool = rpcResourcePool;
this.compressor = new CompressService();
+ decodeType = convert(dispatchConfig.summaryDecodePolicy());
}
@Override
@@ -37,6 +46,7 @@ public class RpcInvokerFactory extends InvokerFactory {
Query query = result.getQuery();
boolean summaryNeedsQuery = searcher.summaryNeedsQuery(query);
- return new RpcProtobufFillInvoker(rpcResourcePool, compressor, searcher.getDocumentDatabase(query), searcher.getServerId(), summaryNeedsQuery);
+ return new RpcProtobufFillInvoker(rpcResourcePool, compressor, searcher.getDocumentDatabase(query),
+ searcher.getServerId(), decodeType, summaryNeedsQuery);
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java
index 4e538fb54dc..2bdafecfaba 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcProtobufFillInvoker.java
@@ -21,6 +21,7 @@ import com.yahoo.search.result.ErrorMessage;
import com.yahoo.search.result.Hit;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.BinaryFormat;
+import com.yahoo.slime.BinaryView;
import java.util.Iterator;
import java.util.List;
@@ -42,11 +43,14 @@ public class RpcProtobufFillInvoker extends FillInvoker {
private static final Logger log = Logger.getLogger(RpcProtobufFillInvoker.class.getName());
+ enum DecodePolicy {EAGER, ONDEMAND}
+
private final DocumentDatabase documentDb;
private final RpcConnectionPool resourcePool;
private final boolean summaryNeedsQuery;
private final String serverId;
private final CompressPayload compressor;
+ private final DecodePolicy decodePolicy;
private BlockingQueue<Pair<Client.ResponseOrError<ProtobufResponse>, List<FastHit>>> responses;
@@ -56,12 +60,14 @@ public class RpcProtobufFillInvoker extends FillInvoker {
/** The number of responses we should receive (and process) before this is complete */
private int outstandingResponses;
- RpcProtobufFillInvoker(RpcConnectionPool resourcePool, CompressPayload compressor, DocumentDatabase documentDb, String serverId, boolean summaryNeedsQuery) {
+ RpcProtobufFillInvoker(RpcConnectionPool resourcePool, CompressPayload compressor, DocumentDatabase documentDb,
+ String serverId, DecodePolicy decodePolicy, boolean summaryNeedsQuery) {
this.documentDb = documentDb;
this.resourcePool = resourcePool;
this.serverId = serverId;
this.summaryNeedsQuery = summaryNeedsQuery;
this.compressor = compressor;
+ this.decodePolicy = decodePolicy;
}
@Override
@@ -211,7 +217,9 @@ public class RpcProtobufFillInvoker extends FillInvoker {
private int fill(Result result, List<FastHit> hits, String summaryClass, byte[] payload) {
try {
var protobuf = SearchProtocol.DocsumReply.parseFrom(payload);
- var root = BinaryFormat.decode(protobuf.getSlimeSummaries().toByteArray()).get();
+ var root = (decodePolicy == DecodePolicy.ONDEMAND)
+ ? BinaryView.inspect(protobuf.getSlimeSummaries().toByteArray())
+ : BinaryFormat.decode(protobuf.getSlimeSummaries().toByteArray()).get();
var errors = root.field("errors");
boolean hasErrors = errors.valid() && (errors.entries() > 0);
if (hasErrors) {
diff --git a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java
index 80a41ffdf22..b8be1dc210b 100644
--- a/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/federation/FederationSearcher.java
@@ -70,8 +70,8 @@ public class FederationSearcher extends ForkingSearcher {
private static final Logger log = Logger.getLogger(FederationSearcher.class.getName());
/** The name of the query property containing the source name added to the query to each source by this */
- public final static CompoundName SOURCENAME = new CompoundName("sourceName");
- public final static CompoundName PROVIDERNAME = new CompoundName("providerName");
+ public static final CompoundName SOURCENAME = CompoundName.from("sourceName");
+ public static final CompoundName PROVIDERNAME = CompoundName.from("providerName");
public static final String FEDERATION = "Federation";
public static final String LOG_COUNT_PREFIX = "count_";
@@ -686,33 +686,6 @@ public class FederationSearcher extends ForkingSearcher {
}
- private static class CompoundKey {
-
- private final String sourceName;
- private final String propertyName;
-
- CompoundKey(String sourceName, String propertyName) {
- this.sourceName = sourceName;
- this.propertyName = propertyName;
- }
-
- @Override
- public int hashCode() {
- return sourceName.hashCode() ^ propertyName.hashCode();
- }
-
- @Override
- public boolean equals(Object o) {
- CompoundKey rhs = (CompoundKey) o;
- return sourceName.equals(rhs.sourceName) && propertyName.equals(rhs.propertyName);
- }
-
- @Override
- public String toString() {
- return sourceName + '.' + propertyName;
- }
- }
-
private static class Window {
private final int hits;
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java b/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java
index 54194221958..180687d5274 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/GroupingQueryParser.java
@@ -38,13 +38,13 @@ import java.util.TimeZone;
public class GroupingQueryParser extends Searcher {
public static final String SELECT_PARAMETER_PARSING = "SelectParameterParsing";
- public static final CompoundName PARAM_CONTINUE = new CompoundName("continue");
- public static final CompoundName PARAM_REQUEST = new CompoundName(Select.SELECT);
- public static final CompoundName PARAM_TIMEZONE = new CompoundName("timezone");
- @Beta public static final CompoundName PARAM_DEFAULT_MAX_HITS = new CompoundName("grouping.defaultMaxHits");
- @Beta public static final CompoundName PARAM_DEFAULT_MAX_GROUPS = new CompoundName("grouping.defaultMaxGroups");
- @Beta public static final CompoundName PARAM_DEFAULT_PRECISION_FACTOR = new CompoundName("grouping.defaultPrecisionFactor");
- @Beta public static final CompoundName GROUPING_GLOBAL_MAX_GROUPS = new CompoundName("grouping.globalMaxGroups");
+ public static final CompoundName PARAM_CONTINUE = CompoundName.from("continue");
+ public static final CompoundName PARAM_REQUEST = CompoundName.from(Select.SELECT);
+ public static final CompoundName PARAM_TIMEZONE = CompoundName.from("timezone");
+ @Beta public static final CompoundName PARAM_DEFAULT_MAX_HITS = CompoundName.from("grouping.defaultMaxHits");
+ @Beta public static final CompoundName PARAM_DEFAULT_MAX_GROUPS = CompoundName.from("grouping.defaultMaxGroups");
+ @Beta public static final CompoundName PARAM_DEFAULT_PRECISION_FACTOR = CompoundName.from("grouping.defaultPrecisionFactor");
+ @Beta public static final CompoundName GROUPING_GLOBAL_MAX_GROUPS = CompoundName.from("grouping.globalMaxGroups");
private static final ThreadLocal<ZoneCache> zoneCache = new ThreadLocal<>();
@Override
@@ -121,7 +121,6 @@ public class GroupingQueryParser extends Searcher {
return val != null ? OptionalDouble.of(val) : OptionalDouble.empty();
}
- @SuppressWarnings("serial")
private static class ZoneCache extends LinkedHashMap<String, TimeZone> {
ZoneCache() {
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java b/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
index 35cf72d6124..878fbbb733d 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
@@ -37,7 +37,7 @@ import static com.yahoo.search.grouping.GroupingQueryParser.SELECT_PARAMETER_PAR
public class GroupingValidator extends Searcher {
public static final String GROUPING_VALIDATED = "GroupingValidated";
- public static final CompoundName PARAM_ENABLED = new CompoundName("validate_" + GroupingQueryParser.PARAM_REQUEST);
+ public static final CompoundName PARAM_ENABLED = CompoundName.from("validate_" + GroupingQueryParser.PARAM_REQUEST);
private final HashMap<String, AttributesConfig.Attribute> attributes = new HashMap<>();
private final String clusterName;
private final boolean enabled;
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/UniqueGroupingSearcher.java b/container-search/src/main/java/com/yahoo/search/grouping/UniqueGroupingSearcher.java
index a1446367f79..27d8a76511d 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/UniqueGroupingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/UniqueGroupingSearcher.java
@@ -42,7 +42,7 @@ import java.util.logging.Logger;
@Before(PhaseNames.TRANSFORMED_QUERY)
public class UniqueGroupingSearcher extends Searcher {
- public static final CompoundName PARAM_UNIQUE = new CompoundName("unique");
+ public static final CompoundName PARAM_UNIQUE = CompoundName.from("unique");
private static final Logger log = Logger.getLogger(UniqueGroupingSearcher.class.getName());
private static final HitOrderer NOP_ORDERER = new HitOrderer() {
@@ -144,17 +144,13 @@ public class UniqueGroupingSearcher extends Searcher {
for (Sorting.FieldOrder fieldOrder : sortingSpec.fieldOrders()) {
Sorting.Order sortOrder = fieldOrder.getSortOrder();
switch (sortOrder) {
- case ASCENDING:
- case UNDEFINED:
- // When we want ascending order, the hit with the smallest value should come first (and be surfaced).
- orderingClause.add(new MinAggregator(new AttributeValue(fieldOrder.getFieldName())));
- break;
- case DESCENDING:
- // When we sort in descending order, the hit with the largest value should come first (and be surfaced).
- orderingClause.add(new NegFunction(new MaxAggregator(new AttributeValue(fieldOrder.getFieldName()))));
- break;
- default:
- throw new UnsupportedOperationException("Can not handle sort order " + sortOrder + ".");
+ case ASCENDING, UNDEFINED ->
+ // When we want ascending order, the hit with the smallest value should come first (and be surfaced).
+ orderingClause.add(new MinAggregator(new AttributeValue(fieldOrder.getFieldName())));
+ case DESCENDING ->
+ // When we sort in descending order, the hit with the largest value should come first (and be surfaced).
+ orderingClause.add(new NegFunction(new MaxAggregator(new AttributeValue(fieldOrder.getFieldName()))));
+ default -> throw new UnsupportedOperationException("Can not handle sort order " + sortOrder + ".");
}
}
return orderingClause;
@@ -170,18 +166,13 @@ public class UniqueGroupingSearcher extends Searcher {
GroupingExpression groupingClause = null;
for (Sorting.FieldOrder fieldOrder : sortingSpec.fieldOrders()) {
Sorting.Order sortOrder = fieldOrder.getSortOrder();
- switch (sortOrder) {
- case ASCENDING:
- case UNDEFINED:
- groupingClause = new AttributeValue(fieldOrder.getFieldName());
- break;
- case DESCENDING:
- // To sort descending, just take the negative. This is the most common case
- groupingClause = new NegFunction(new AttributeValue(fieldOrder.getFieldName()));
- break;
- default:
- throw new UnsupportedOperationException("Can not handle sort order " + sortOrder + ".");
- }
+ groupingClause = switch (sortOrder) {
+ case ASCENDING, UNDEFINED -> new AttributeValue(fieldOrder.getFieldName());
+ case DESCENDING ->
+ // To sort descending, just take the negative. This is the most common case
+ new NegFunction(new AttributeValue(fieldOrder.getFieldName()));
+ default -> throw new UnsupportedOperationException("Can not handle sort order " + sortOrder + ".");
+ };
}
return groupingClause;
}
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/result/FlatteningSearcher.java b/container-search/src/main/java/com/yahoo/search/grouping/result/FlatteningSearcher.java
index e56b88c3d3e..027ba92f587 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/result/FlatteningSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/result/FlatteningSearcher.java
@@ -22,7 +22,7 @@ import java.util.Iterator;
@Before(GroupingExecutor.COMPONENT_NAME)
public class FlatteningSearcher extends Searcher {
- private final CompoundName flatten = CompoundName.fromComponents("grouping", "flatten");
+ private final CompoundName flatten = CompoundName.from("grouping.flatten");
@Override
public Result search(Query query, Execution execution) {
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java
index 2ba33f60ea1..c85dbed83c8 100644
--- a/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java
+++ b/container-search/src/main/java/com/yahoo/search/grouping/vespa/GroupingExecutor.java
@@ -379,7 +379,7 @@ public class GroupingExecutor extends Searcher {
}
private static CompoundName newCompoundName(String name) {
- return new CompoundName(GroupingExecutor.class.getName() + "." + name);
+ return CompoundName.from(GroupingExecutor.class.getName() + "." + name);
}
private static class RequestContext {
diff --git a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
index fac6c598e4b..3b4d15f788f 100644
--- a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
+++ b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
@@ -75,8 +75,8 @@ public class SearchHandler extends LoggingRequestHandler {
// max number of threads for the executor for this handler
private final int maxThreads;
- private static final CompoundName DETAILED_TIMING_LOGGING = new CompoundName("trace.timingDetails");
- private static final CompoundName FORCE_TIMESTAMPS = new CompoundName("trace.timestamps");
+ private static final CompoundName DETAILED_TIMING_LOGGING = CompoundName.from("trace.timingDetails");
+ private static final CompoundName FORCE_TIMESTAMPS = CompoundName.from("trace.timestamps");
/** Event name for number of connections to the search subsystem */
private static final String SEARCH_CONNECTIONS = "search_connections";
diff --git a/container-search/src/main/java/com/yahoo/search/intent/model/IntentModel.java b/container-search/src/main/java/com/yahoo/search/intent/model/IntentModel.java
index 9aafd2c4693..0c4b22fbbf2 100644
--- a/container-search/src/main/java/com/yahoo/search/intent/model/IntentModel.java
+++ b/container-search/src/main/java/com/yahoo/search/intent/model/IntentModel.java
@@ -5,7 +5,12 @@ import com.yahoo.search.Query;
import com.yahoo.processing.request.CompoundName;
import com.yahoo.text.interpretation.Interpretation;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* This is the root node of an intent model.
@@ -19,9 +24,9 @@ import java.util.*;
public class IntentModel extends ParentNode<InterpretationNode> {
/** The name of the property carrying the intent model string: intentModel */
- public static final CompoundName intentModelStringName=new CompoundName("intentModel");
+ public static final CompoundName intentModelStringName = CompoundName.from("intentModel");
/** The name of the property carrying the intent model object: IntentModel */
- public static final CompoundName intentModelObjectName=new CompoundName("IntentModel");
+ public static final CompoundName intentModelObjectName = CompoundName.from("IntentModel");
private static final InterpretationNodeComparator inodeComp = new InterpretationNodeComparator();
@@ -45,7 +50,7 @@ public class IntentModel extends ParentNode<InterpretationNode> {
/** Sort interpretations by descending score order */
public void sortChildren() {
- Collections.sort(children(), inodeComp);
+ children().sort(inodeComp);
}
/**
diff --git a/container-search/src/main/java/com/yahoo/search/pagetemplates/PageTemplateSearcher.java b/container-search/src/main/java/com/yahoo/search/pagetemplates/PageTemplateSearcher.java
index c23627accf4..5fef1821de2 100644
--- a/container-search/src/main/java/com/yahoo/search/pagetemplates/PageTemplateSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/pagetemplates/PageTemplateSearcher.java
@@ -72,13 +72,13 @@ import java.util.Map;
public class PageTemplateSearcher extends Searcher {
/** The name of the query property containing the resolved candidate page template list */
- public static final CompoundName pagePageTemplateListName=new CompoundName("page.PageTemplateList");
+ public static final CompoundName pagePageTemplateListName = CompoundName.from("page.PageTemplateList");
/** The name of the query property containing a list of candidate pages to consider */
- public static final CompoundName pageIdListName=new CompoundName("page.idList");
+ public static final CompoundName pageIdListName = CompoundName.from("page.idList");
/** The name of the query property containing the page id to use */
- public static final CompoundName pageIdName=new CompoundName("page.id");
+ public static final CompoundName pageIdName = CompoundName.from("page.id");
/** The name of the query property containing the resolver id to use */
- public static final CompoundName pageResolverName=new CompoundName("page.resolver");
+ public static final CompoundName pageResolverName = CompoundName.from("page.resolver");
private final ResolverRegistry resolverRegistry;
diff --git a/container-search/src/main/java/com/yahoo/search/query/Model.java b/container-search/src/main/java/com/yahoo/search/query/Model.java
index 190ad675015..09b2f394f20 100644
--- a/container-search/src/main/java/com/yahoo/search/query/Model.java
+++ b/container-search/src/main/java/com/yahoo/search/query/Model.java
@@ -71,13 +71,13 @@ public class Model implements Cloneable {
argumentType.addField(new FieldDescription(SEARCH_PATH, "string", "searchpath"));
argumentType.addField(new FieldDescription(RESTRICT, "string", "restrict"));
argumentType.freeze();
- argumentTypeName = new CompoundName(argumentType.getId().getName());
+ argumentTypeName = CompoundName.from(argumentType.getId().getName());
}
public static QueryProfileType getArgumentType() { return argumentType; }
/** The name of the query property used for generating hit count estimate queries. */
- public static final CompoundName ESTIMATE = new CompoundName("hitcountestimate"); // TODO: Cleanup
+ public static final CompoundName ESTIMATE = CompoundName.from("hitcountestimate"); // TODO: Cleanup
private String encoding = null;
private String queryString = "";
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 e8738a19412..5426268d173 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
@@ -27,7 +27,7 @@ import java.util.Objects;
public class Ranking implements Cloneable {
/** An alias for listing features */
- public static final CompoundName RANKFEATURES = new CompoundName("rankfeatures");
+ public static final CompoundName RANKFEATURES = CompoundName.from("rankfeatures");
/** The type representing the property arguments consumed by this */
private static final QueryProfileType argumentType;
@@ -70,7 +70,7 @@ public class Ranking implements Cloneable {
argumentType.addField(new FieldDescription(FEATURES, "query-profile", "rankfeature input")); // Repeated at the end of RankFeatures
argumentType.addField(new FieldDescription(PROPERTIES, "query-profile", "rankproperty"));
argumentType.freeze();
- argumentTypeName = new CompoundName(argumentType.getId().getName());
+ argumentTypeName = CompoundName.from(argumentType.getId().getName());
}
public static QueryProfileType getArgumentType() { return argumentType; }
diff --git a/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfile.java b/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfile.java
index ad9d3f4c1a5..ae531c67dd1 100644
--- a/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfile.java
+++ b/container-search/src/main/java/com/yahoo/search/query/profile/compiled/CompiledQueryProfile.java
@@ -169,7 +169,7 @@ public class CompiledQueryProfile extends AbstractComponent implements Cloneable
}
public final Object get(String name) {
- return get(name, Collections.emptyMap());
+ return get(name, Map.of());
}
public final Object get(String name, Map<String, String> context) {
return get(name, context, new QueryProfileProperties(this));
diff --git a/container-search/src/main/java/com/yahoo/search/query/profile/types/FieldDescription.java b/container-search/src/main/java/com/yahoo/search/query/profile/types/FieldDescription.java
index 8fdbf8b2281..719a5a2c281 100644
--- a/container-search/src/main/java/com/yahoo/search/query/profile/types/FieldDescription.java
+++ b/container-search/src/main/java/com/yahoo/search/query/profile/types/FieldDescription.java
@@ -64,7 +64,7 @@ public class FieldDescription implements Comparable<FieldDescription> {
}
public FieldDescription(String name, FieldType type, String aliases, boolean mandatory, boolean overridable) {
- this(new CompoundName(name), type, aliases, mandatory, overridable);
+ this(CompoundName.from(name), type, aliases, mandatory, overridable);
}
/**
diff --git a/container-search/src/main/java/com/yahoo/search/query/profile/types/QueryProfileType.java b/container-search/src/main/java/com/yahoo/search/query/profile/types/QueryProfileType.java
index 3da2ad53f9a..9cbfe5b7112 100644
--- a/container-search/src/main/java/com/yahoo/search/query/profile/types/QueryProfileType.java
+++ b/container-search/src/main/java/com/yahoo/search/query/profile/types/QueryProfileType.java
@@ -52,7 +52,7 @@ public class QueryProfileType extends FreezableSimpleComponent {
private QueryProfileType(ComponentId id, Map<String, FieldDescription> fields, List<QueryProfileType> inherited) {
super(id);
QueryProfile.validateName(id.getName());
- componentIdAsCompoundName = new CompoundName(getId().getName());
+ componentIdAsCompoundName = CompoundName.from(getId().getName());
this.fields = fields;
this.inherited = inherited;
}
@@ -318,10 +318,9 @@ public class QueryProfileType extends FreezableSimpleComponent {
QueryProfileType type = null;
FieldDescription fieldDescription = getField(name);
if (fieldDescription != null) {
- if ( ! (fieldDescription.getType() instanceof QueryProfileFieldType))
+ if ( ! (fieldDescription.getType() instanceof QueryProfileFieldType fieldType))
throw new IllegalArgumentException("Cannot use name '" + name + "' as a prefix because it is " +
"already a " + fieldDescription.getType());
- QueryProfileFieldType fieldType = (QueryProfileFieldType) fieldDescription.getType();
type = fieldType.getQueryProfileType();
}
@@ -399,8 +398,7 @@ public class QueryProfileType extends FreezableSimpleComponent {
@Override
public boolean equals(Object o) {
if (o == this) return true;
- if ( ! (o instanceof QueryProfileType)) return false;
- QueryProfileType other = (QueryProfileType)o;
+ if ( ! (o instanceof QueryProfileType other)) return false;
return other.getId().equals(this.getId());
}
diff --git a/container-search/src/main/java/com/yahoo/search/query/properties/DefaultProperties.java b/container-search/src/main/java/com/yahoo/search/query/properties/DefaultProperties.java
index 221368afeb6..6ccf4792efb 100644
--- a/container-search/src/main/java/com/yahoo/search/query/properties/DefaultProperties.java
+++ b/container-search/src/main/java/com/yahoo/search/query/properties/DefaultProperties.java
@@ -16,9 +16,9 @@ import java.util.Map;
*/
public final class DefaultProperties extends Properties {
- public static final CompoundName MAX_OFFSET = new CompoundName("maxOffset");
- public static final CompoundName MAX_HITS = new CompoundName("maxHits");
- public static final CompoundName MAX_QUERY_ITEMS = new CompoundName("maxQueryItems");
+ public static final CompoundName MAX_OFFSET = CompoundName.from("maxOffset");
+ public static final CompoundName MAX_HITS = CompoundName.from("maxHits");
+ public static final CompoundName MAX_QUERY_ITEMS = CompoundName.from("maxQueryItems");
public static final QueryProfileType argumentType = new QueryProfileType("DefaultProperties");
diff --git a/container-search/src/main/java/com/yahoo/search/query/properties/SubProperties.java b/container-search/src/main/java/com/yahoo/search/query/properties/SubProperties.java
index 42fb4e44040..4fc9dfa03cd 100644
--- a/container-search/src/main/java/com/yahoo/search/query/properties/SubProperties.java
+++ b/container-search/src/main/java/com/yahoo/search/query/properties/SubProperties.java
@@ -10,14 +10,16 @@ import java.util.Map;
* A wrapper around a chain of property objects that prefixes all gets/sets with a given path
*
* @author Arne Bergene Fossaa
+ * @deprecated Unused and will go away on vespa 9
*/
+@Deprecated (forRemoval = true)
public class SubProperties extends com.yahoo.search.query.Properties {
final private CompoundName pathPrefix;
final private Properties parent;
public SubProperties(String pathPrefix, Properties properties) {
- this(new CompoundName(pathPrefix),properties);
+ this(CompoundName.from(pathPrefix), properties);
}
public SubProperties(CompoundName pathPrefix, Properties properties) {
diff --git a/container-search/src/main/java/com/yahoo/search/query/ranking/SoftTimeout.java b/container-search/src/main/java/com/yahoo/search/query/ranking/SoftTimeout.java
index 30ee2f473b7..c49b14f0978 100644
--- a/container-search/src/main/java/com/yahoo/search/query/ranking/SoftTimeout.java
+++ b/container-search/src/main/java/com/yahoo/search/query/ranking/SoftTimeout.java
@@ -24,8 +24,7 @@ public class SoftTimeout implements Cloneable {
public static final String TAILCOST = "tailcost";
/** The full property name for turning softtimeout on or off */
- public static final CompoundName enableProperty =
- CompoundName.fromComponents(Ranking.RANKING, Ranking.SOFTTIMEOUT, ENABLE);
+ public static final CompoundName enableProperty = CompoundName.from(Ranking.RANKING + "." + Ranking.SOFTTIMEOUT + "." + ENABLE);
static {
argumentType = new QueryProfileType(Ranking.SOFTTIMEOUT);
diff --git a/container-search/src/main/java/com/yahoo/search/query/rewrite/RewriterConstants.java b/container-search/src/main/java/com/yahoo/search/query/rewrite/RewriterConstants.java
index b0fce45de46..eeb8b675ae1 100644
--- a/container-search/src/main/java/com/yahoo/search/query/rewrite/RewriterConstants.java
+++ b/container-search/src/main/java/com/yahoo/search/query/rewrite/RewriterConstants.java
@@ -42,7 +42,7 @@ public class RewriterConstants {
public static final String REWRITER_CHAIN = "QRWChain";
/** Name for rewrite metadata retrieval from query properties */
- public static final CompoundName REWRITE_META = new CompoundName("RewriteMeta");
+ public static final CompoundName REWRITE_META = CompoundName.from("RewriteMeta");
/** Name for rewritten field retrieval from query properties */
public static final String REWRITTEN = "Rewritten";
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java
index f43be20e0ac..91315fe1bb3 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/BooleanSearcher.java
@@ -28,9 +28,9 @@ import static com.yahoo.yolean.Exceptions.toMessageString;
@Provides(BooleanSearcher.PREDICATE)
public class BooleanSearcher extends Searcher {
- private static final CompoundName FIELD = new CompoundName("boolean.field");
- private static final CompoundName ATTRIBUTES = new CompoundName("boolean.attributes");
- private static final CompoundName RANGE_ATTRIBUTES = new CompoundName("boolean.rangeAttributes");
+ private static final CompoundName FIELD = CompoundName.from("boolean.field");
+ private static final CompoundName ATTRIBUTES = CompoundName.from("boolean.attributes");
+ private static final CompoundName RANGE_ATTRIBUTES = CompoundName.from("boolean.rangeAttributes");
public static final String PREDICATE = "predicate";
@Override
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/SortingDegrader.java b/container-search/src/main/java/com/yahoo/search/querytransform/SortingDegrader.java
index 75b06c29193..81881685a1d 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/SortingDegrader.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/SortingDegrader.java
@@ -41,9 +41,9 @@ public class SortingDegrader extends Searcher {
/** Set this to false in query.properties to turn off degrading. Default: on */
// (this is not called ranking.sorting.degrading because it should not be part of the query object model
- public static final CompoundName DEGRADING = new CompoundName("sorting.degrading");
+ public static final CompoundName DEGRADING = CompoundName.from("sorting.degrading");
- public static final CompoundName PAGINATION = new CompoundName("to_be_removed_pagination");
+ public static final CompoundName PAGINATION = CompoundName.from("to_be_removed_pagination");
@Override
public Result search(Query query, Execution execution) {
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java
index 89245eaf137..bfac668b6c4 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/WandSearcher.java
@@ -63,12 +63,12 @@ public class WandSearcher extends Searcher {
*/
private static class InputResolver {
- private static final CompoundName WAND_FIELD = new CompoundName("wand.field");
- private static final CompoundName WAND_TOKENS = new CompoundName("wand.tokens");
- private static final CompoundName WAND_HEAP_SIZE = new CompoundName("wand.heapSize");
- private static final CompoundName WAND_TYPE = new CompoundName("wand.type");
- private static final CompoundName WAND_SCORE_THRESHOLD = new CompoundName("wand.scoreThreshold");
- private static final CompoundName WAND_THRESHOLD_BOOST_FACTOR = new CompoundName("wand.thresholdBoostFactor");
+ private static final CompoundName WAND_FIELD = CompoundName.from("wand.field");
+ private static final CompoundName WAND_TOKENS = CompoundName.from("wand.tokens");
+ private static final CompoundName WAND_HEAP_SIZE = CompoundName.from("wand.heapSize");
+ private static final CompoundName WAND_TYPE = CompoundName.from("wand.type");
+ private static final CompoundName WAND_SCORE_THRESHOLD = CompoundName.from("wand.scoreThreshold");
+ private static final CompoundName WAND_THRESHOLD_BOOST_FACTOR = CompoundName.from("wand.thresholdBoostFactor");
private final String fieldName;
private final WandType wandType;
private final Map<Object, Integer> tokens;
diff --git a/container-search/src/main/java/com/yahoo/search/querytransform/WeakAndReplacementSearcher.java b/container-search/src/main/java/com/yahoo/search/querytransform/WeakAndReplacementSearcher.java
index 2d6e059342e..9aa7a9d998d 100644
--- a/container-search/src/main/java/com/yahoo/search/querytransform/WeakAndReplacementSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/querytransform/WeakAndReplacementSearcher.java
@@ -21,8 +21,8 @@ import com.yahoo.yolean.chain.After;
*/
@After(MinimalQueryInserter.EXTERNAL_YQL)
public class WeakAndReplacementSearcher extends Searcher {
- static final CompoundName WEAKAND_REPLACE = new CompoundName("weakAnd.replace");
- static final CompoundName WAND_HITS = new CompoundName("wand.hits");
+ static final CompoundName WEAKAND_REPLACE = CompoundName.from("weakAnd.replace");
+ static final CompoundName WAND_HITS = CompoundName.from("wand.hits");
@Override public Result search(Query query, Execution execution) {
if (!query.properties().getBoolean(WEAKAND_REPLACE)) {
diff --git a/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java b/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java
index 2c6ab9e9367..dd419d69315 100644
--- a/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java
+++ b/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java
@@ -4,11 +4,14 @@ package com.yahoo.search.ranking;
import com.yahoo.component.annotation.Inject;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
+import com.yahoo.search.query.Sorting;
import com.yahoo.search.ranking.RankProfilesEvaluator.GlobalPhaseData;
+import com.yahoo.search.result.ErrorMessage;
import com.yahoo.tensor.Tensor;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import java.util.function.Supplier;
import java.util.logging.Logger;
@@ -20,14 +23,25 @@ public class GlobalPhaseRanker {
@Inject
public GlobalPhaseRanker(RankProfilesEvaluatorFactory factory) {
this.factory = factory;
- logger.info("using factory: " + factory);
+ logger.fine(() -> "Using factory: " + factory);
}
- public void process(Query query, Result result, String schema) {
- String rankProfile = query.getRanking().getProfile();
- GlobalPhaseData data = factory.evaluatorForSchema(schema)
- .flatMap(evaluator -> evaluator.getGlobalPhaseData(rankProfile))
- .orElse(null);
+ public Optional<ErrorMessage> validateNoSorting(Query query, String schema) {
+ var data = globalPhaseDataFor(query, schema).orElse(null);
+ if (data == null) return Optional.empty();
+ var sorting = query.getRanking().getSorting();
+ if (sorting == null || sorting.fieldOrders() == null) return Optional.empty();
+ for (var fieldOrder : sorting.fieldOrders()) {
+ if (!fieldOrder.getSorter().getName().equals("[rank]")
+ || fieldOrder.getSortOrder() != Sorting.Order.DESCENDING) {
+ return Optional.of(ErrorMessage.createIllegalQuery("Sorting is not supported with global phase"));
+ }
+ }
+ return Optional.empty();
+ }
+
+ public void rerankHits(Query query, Result result, String schema) {
+ var data = globalPhaseDataFor(query, schema).orElse(null);
if (data == null) return;
var functionEvaluatorSource = data.functionEvaluatorSource();
var prepared = findFromQuery(query, data.needInputs());
@@ -45,6 +59,11 @@ public class GlobalPhaseRanker {
ResultReranker.rerankHits(result, new HitRescorer(supplier), rerankCount);
}
+ private Optional<GlobalPhaseData> globalPhaseDataFor(Query query, String schema) {
+ return factory.evaluatorForSchema(schema)
+ .flatMap(evaluator -> evaluator.getGlobalPhaseData(query.getRanking().getProfile()));
+ }
+
record NameAndValue(String name, Tensor value) { }
/* do this only once per query: */
diff --git a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
index 44620179c1d..b36c8788877 100644
--- a/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
+++ b/container-search/src/main/java/com/yahoo/search/rendering/JsonRenderer.java
@@ -76,10 +76,10 @@ import static com.fasterxml.jackson.databind.SerializationFeature.FLUSH_AFTER_WR
// NOTE: The JSON format is a public API. If new elements are added be sure to update the reference doc.
public class JsonRenderer extends AsynchronousSectionedRenderer<Result> {
- private static final CompoundName WRAP_DEEP_MAPS = new CompoundName("renderer.json.jsonMaps");
- private static final CompoundName WRAP_WSETS = new CompoundName("renderer.json.jsonWsets");
- private static final CompoundName DEBUG_RENDERING_KEY = new CompoundName("renderer.json.debug");
- private static final CompoundName JSON_CALLBACK = new CompoundName("jsoncallback");
+ private static final CompoundName WRAP_DEEP_MAPS = CompoundName.from("renderer.json.jsonMaps");
+ private static final CompoundName WRAP_WSETS = CompoundName.from("renderer.json.jsonWsets");
+ private static final CompoundName DEBUG_RENDERING_KEY = CompoundName.from("renderer.json.debug");
+ private static final CompoundName JSON_CALLBACK = CompoundName.from("jsoncallback");
// if this must be optimized, simply use com.fasterxml.jackson.core.SerializableString
private static final String BUCKET_LIMITS = "limits";
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/CacheControlSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/CacheControlSearcher.java
index a4f03b088f2..29e8afa41ac 100644
--- a/container-search/src/main/java/com/yahoo/search/searchers/CacheControlSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/searchers/CacheControlSearcher.java
@@ -32,9 +32,9 @@ import com.yahoo.search.searchchain.Execution;
*/
public class CacheControlSearcher extends Searcher {
- private static final CompoundName cachecontrolNocache=new CompoundName("cachecontrol.nocache");
- private static final CompoundName cachecontrolMaxage=new CompoundName("cachecontrol.maxage");
- private static final CompoundName cachecontrolStaleage=new CompoundName("cachecontrol.staleage");
+ private static final CompoundName cachecontrolNocache=CompoundName.from("cachecontrol.nocache");
+ private static final CompoundName cachecontrolMaxage=CompoundName.from("cachecontrol.maxage");
+ private static final CompoundName cachecontrolStaleage=CompoundName.from("cachecontrol.staleage");
public static final String CACHE_CONTROL_HEADER = "Cache-Control";
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java
index 90cb05be1f8..18588b2026d 100644
--- a/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java
@@ -49,7 +49,7 @@ public class ConnectionControlSearcher extends Searcher {
private final LongSupplier clock;
- private static final CompoundName KEEPALIVE_MAXLIFETIMESECONDS = new CompoundName("connectioncontrol.maxlifetime");
+ private static final CompoundName KEEPALIVE_MAXLIFETIMESECONDS = CompoundName.from("connectioncontrol.maxlifetime");
private static final String HTTP_CONNECTION_HEADER_NAME = "Connection";
private static final String HTTP_CONNECTION_CLOSE_ARGUMENT = "Close";
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/RateLimitingSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/RateLimitingSearcher.java
index cf81f62f64d..35a3c86f763 100755
--- a/container-search/src/main/java/com/yahoo/search/searchers/RateLimitingSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/searchers/RateLimitingSearcher.java
@@ -54,11 +54,11 @@ public class RateLimitingSearcher extends Searcher {
/** Constant containing the name this Provides - "rateLimiting", for ordering constraints */
public static final String RATE_LIMITING = "rateLimiting";
- public static final CompoundName idKey = new CompoundName("rate.id");
- public static final CompoundName costKey = new CompoundName("rate.cost");
- public static final CompoundName quotaKey = new CompoundName("rate.quota");
- public static final CompoundName idDimensionKey = new CompoundName("rate.idDimension");
- public static final CompoundName dryRunKey = new CompoundName("rate.dryRun");
+ public static final CompoundName idKey = CompoundName.from("rate.id");
+ public static final CompoundName costKey = CompoundName.from("rate.cost");
+ public static final CompoundName quotaKey = CompoundName.from("rate.quota");
+ public static final CompoundName idDimensionKey = CompoundName.from("rate.idDimension");
+ public static final CompoundName dryRunKey = CompoundName.from("rate.dryRun");
private static final String requestsOverQuotaMetricName = "requestsOverQuota";
diff --git a/container-search/src/main/java/com/yahoo/search/yql/FieldFiller.java b/container-search/src/main/java/com/yahoo/search/yql/FieldFiller.java
index 833c1251a7b..6961a189d22 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/FieldFiller.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/FieldFiller.java
@@ -27,7 +27,7 @@ public class FieldFiller extends Searcher {
private final Set<String> intersectionOfAttributes;
private final SchemaInfo schemaInfo;
- public static final CompoundName FIELD_FILLER_DISABLE = new CompoundName("FieldFiller.disable");
+ public static final CompoundName FIELD_FILLER_DISABLE = CompoundName.from("FieldFiller.disable");
public FieldFiller(SchemaInfo schemaInfo) {
this.schemaInfo = schemaInfo;
diff --git a/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java b/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java
index 8cc6a1b42b9..df9722d3214 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java
@@ -2,13 +2,11 @@
package com.yahoo.search.yql;
import java.util.Iterator;
-import java.util.Map.Entry;
import java.util.Set;
import com.yahoo.api.annotations.Beta;
import com.yahoo.component.chain.dependencies.After;
import com.yahoo.component.chain.dependencies.Before;
-import com.yahoo.prelude.fastsearch.FastHit;
import com.yahoo.processing.request.CompoundName;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
@@ -27,7 +25,7 @@ import com.yahoo.search.searchchain.Execution;
@Before("com.yahoo.search.yql.FieldFiller")
public class FieldFilter extends Searcher {
- public static final CompoundName FIELD_FILTER_DISABLE = new CompoundName("FieldFilter.disable");
+ public static final CompoundName FIELD_FILTER_DISABLE = CompoundName.from("FieldFilter.disable");
/** Fields that should be kept even if not explicitly requested */
private static final Set<String> syntheticFields = Set.of("matchfeatures", "rankfeatures", "summaryfeatures");
diff --git a/container-search/src/main/java/com/yahoo/search/yql/MinimalQueryInserter.java b/container-search/src/main/java/com/yahoo/search/yql/MinimalQueryInserter.java
index e844bac21e8..ee4f931d532 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/MinimalQueryInserter.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/MinimalQueryInserter.java
@@ -39,10 +39,10 @@ public class MinimalQueryInserter extends Searcher {
public static final String EXTERNAL_YQL = "ExternalYql";
- public static final CompoundName YQL = new CompoundName("yql");
+ public static final CompoundName YQL = CompoundName.from("yql");
- private static final CompoundName MAX_HITS = new CompoundName("maxHits");
- private static final CompoundName MAX_OFFSET = new CompoundName("maxOffset");
+ private static final CompoundName MAX_HITS = CompoundName.from("maxHits");
+ private static final CompoundName MAX_OFFSET = CompoundName.from("maxOffset");
private static final Logger log = Logger.getLogger(MinimalQueryInserter.class.getName());
@Inject