summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java2
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java17
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java3
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/JvmHeapSizeValidator.java1
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java13
-rwxr-xr-xconfig-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java2
-rw-r--r--config-model/src/test/derived/advanced/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/annotationsinheritance/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/annotationsreference/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/annotationssimple/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/arrays/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/attributeprefetch/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/attributes/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/complex/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/emptydefault/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/exactmatch/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/hnsw_index/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/id/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/indexswitches/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/inheritance/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/language/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/lowercase/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/multiplesummaries/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/music/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/newrank/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/orderilscripts/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/position_array/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/position_attribute/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/position_extra/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/prefixexactattribute/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/ranktypes/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/schemainheritance/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/structanyorder/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/tokenization/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/types/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/uri_array/ilscripts.cfg2
-rw-r--r--config-model/src/test/derived/uri_wset/ilscripts.cfg2
-rw-r--r--configdefinitions/src/vespa/ilscripts.def2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java11
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java14
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java1
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java3
-rw-r--r--container-core/src/main/resources/configdefinitions/container.qr.def8
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java22
-rw-r--r--dependency-versions/pom.xml2
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java15
-rw-r--r--model-integration/src/main/java/ai/vespa/embedding/ColBertEmbedder.java27
-rw-r--r--model-integration/src/test/java/ai/vespa/embedding/ColBertEmbedderTest.java44
-rw-r--r--searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp4
-rw-r--r--searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp2
-rw-r--r--searchlib/src/tests/queryeval/flow/queryeval_flow_test.cpp256
-rw-r--r--searchlib/src/vespa/searchlib/query/streaming/query.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/blueprint.h30
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/flow.h231
-rw-r--r--searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp40
-rw-r--r--streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp9
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/condition/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/support/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/function/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/io/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/jupiter/api/parallel/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/platform/commons/annotation/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/platform/commons/function/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/platform/commons/logging/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/platform/commons/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/platform/commons/support/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/junit/platform/commons/util/package-info.java2
-rw-r--r--tenant-cd-api/src/main/java/org/opentest4j/package-info.java2
73 files changed, 605 insertions, 252 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
index 6e1127f9cf9..f6a9de672a3 100644
--- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
@@ -109,7 +109,7 @@ public interface ModelContext {
@ModelFeatureFlag(owners = {"arnej"}) default String logFileCompressionAlgorithm(String defVal) { return defVal; }
@ModelFeatureFlag(owners = {"baldersheim"}, comment = "Select summary decode type") default String summaryDecodePolicy() { return "eager"; }
@ModelFeatureFlag(owners = {"vekterli"}) default int contentLayerMetadataFeatureLevel() { return 0; }
- @ModelFeatureFlag(owners = {"bjorncs"}) default boolean dynamicHeapSize() { return false; }
+ @ModelFeatureFlag(owners = {"bjorncs"}, removeAfter = "8.289") default boolean dynamicHeapSize() { return true; }
@ModelFeatureFlag(owners = {"hmusum"}) default String unknownConfigDefinition() { return "warn"; }
@ModelFeatureFlag(owners = {"hmusum"}) default int searchHandlerThreadpool() { return 2; }
@ModelFeatureFlag(owners = {"vekterli"}) default long mergingMaxMemoryUsagePerNode() { return -1; }
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
index 647745eba5d..f19341098f4 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
@@ -27,7 +27,6 @@ import com.yahoo.config.model.application.provider.MockFileRegistry;
import com.yahoo.config.model.provision.HostsXmlProvisioner;
import com.yahoo.config.model.provision.SingleNodeProvisioner;
import com.yahoo.config.model.test.MockApplicationPackage;
-import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.DockerImage;
import com.yahoo.config.provision.Zone;
import com.yahoo.io.IOUtils;
@@ -93,7 +92,6 @@ public class DeployState implements ConfigDefinitionStore {
private final Reindexing reindexing;
private final ExecutorService executor;
private final OnnxModelCost onnxModelCost;
- private final Set<ClusterSpec.Id> restartingClusters;
public static DeployState createTestState() {
return new Builder().build();
@@ -129,8 +127,7 @@ public class DeployState implements ConfigDefinitionStore {
Optional<DockerImage> wantedDockerImageRepo,
Reindexing reindexing,
Optional<ValidationOverrides> validationOverrides,
- OnnxModelCost onnxModelCost,
- Set<ClusterSpec.Id> restartingClusters) {
+ OnnxModelCost onnxModelCost) {
this.logger = deployLogger;
this.fileRegistry = fileRegistry;
this.executor = executor;
@@ -159,7 +156,6 @@ public class DeployState implements ConfigDefinitionStore {
this.wantedDockerImageRepo = wantedDockerImageRepo;
this.reindexing = reindexing;
this.onnxModelCost = onnxModelCost;
- this.restartingClusters = Set.copyOf(restartingClusters);
}
public static HostProvisioner getDefaultModelHostProvisioner(ApplicationPackage applicationPackage) {
@@ -315,8 +311,6 @@ public class DeployState implements ConfigDefinitionStore {
public OnnxModelCost onnxModelCost() { return onnxModelCost; }
- public Set<ClusterSpec.Id> restartingClusters() { return restartingClusters; }
-
public boolean isHostedTenantApplication(ApplicationType type) {
boolean isTesterApplication = getProperties().applicationId().instance().isTester();
return isHosted() && type == ApplicationType.DEFAULT && !isTesterApplication;
@@ -346,7 +340,6 @@ public class DeployState implements ConfigDefinitionStore {
private Reindexing reindexing = null;
private Optional<ValidationOverrides> validationOverrides = Optional.empty();
private OnnxModelCost onnxModelCost = OnnxModelCost.disabled();
- private Set<ClusterSpec.Id> restartingClusters = Set.of();
public Builder() {}
@@ -466,11 +459,6 @@ public class DeployState implements ConfigDefinitionStore {
public Builder onnxModelCost(OnnxModelCost instance) { this.onnxModelCost = instance; return this; }
- public Builder restartingClusters(Set<ClusterSpec.Id> restartingClusters) {
- this.restartingClusters = Set.copyOf(restartingClusters);
- return this;
- }
-
public DeployState build() {
return build(new ValidationParameters());
}
@@ -504,8 +492,7 @@ public class DeployState implements ConfigDefinitionStore {
wantedDockerImageRepo,
reindexing,
validationOverrides,
- onnxModelCost,
- restartingClusters);
+ onnxModelCost);
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java
index 1b9d4004b5d..65572d07cc2 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java
@@ -198,8 +198,7 @@ public class VespaModelFactory implements ModelFactory {
.now(clock.instant())
.wantedNodeVespaVersion(modelContext.wantedNodeVespaVersion())
.wantedDockerImageRepo(modelContext.wantedDockerImageRepo())
- .onnxModelCost(modelContext.onnxModelCost())
- .restartingClusters(modelContext.restartingClusters());
+ .onnxModelCost(modelContext.onnxModelCost());
modelContext.previousModel().ifPresent(builder::previousModel);
modelContext.reindexing().ifPresent(builder::reindexing);
return builder.build(validationParameters);
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/JvmHeapSizeValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/JvmHeapSizeValidator.java
index 482c4477cdc..9cf5fe84c21 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/JvmHeapSizeValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/JvmHeapSizeValidator.java
@@ -18,7 +18,6 @@ public class JvmHeapSizeValidator implements Validator {
@Override
public void validate(Context context) {
- if (!context.deployState().featureFlags().dynamicHeapSize()) return;
if (!context.deployState().isHostedTenantApplication(context.model().getAdmin().getApplicationType())) return;
context.model().getContainerClusters().forEach((clusterId, appCluster) -> {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
index 3fc194a505e..ed7646b3066 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
@@ -50,7 +50,6 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
-import java.util.logging.Level;
import java.util.stream.Collectors;
import static com.yahoo.vespa.model.container.docproc.DocprocChains.DOCUMENT_TYPE_MANAGER_CLASS;
@@ -102,7 +101,6 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
private int zookeeperSessionTimeoutSeconds = 30;
private final int transport_events_before_wakeup;
private final int transport_connections_per_target;
- private final boolean dynamicHeapSize;
/** The heap size % of total memory available to the JVM process. */
private final int heapSizePercentageOfAvailableMemory;
@@ -116,7 +114,6 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
public ApplicationContainerCluster(TreeConfigProducer<?> parent, String configSubId, String clusterId, DeployState deployState) {
super(parent, configSubId, clusterId, deployState, true, 10);
this.tlsClientAuthority = deployState.tlsClientAuthority();
- dynamicHeapSize = deployState.featureFlags().dynamicHeapSize();
previousHosts = Collections.unmodifiableSet(deployState.getPreviousModel().stream()
.map(Model::allocatedHosts)
.map(AllocatedHosts::getHosts)
@@ -154,10 +151,8 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
registerApplicationBundles(deployState);
registerUserConfiguredFiles(deployState);
createEndpoints(deployState);
- if (onnxModelCostCalculator.restartOnDeploy() || deployState.restartingClusters().contains(id())) {
- deployState.getDeployLogger().log(Level.INFO, "Deferring config change until restart for cluster '" + id() + "'");
+ if (onnxModelCostCalculator.restartOnDeploy())
setDeferChangesUntilRestart(true);
- }
}
private void registerApplicationBundles(DeployState deployState) {
@@ -218,10 +213,8 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
if (getContainers().isEmpty()) return Optional.of(JvmMemoryPercentage.of(availableMemoryPercentage)); // Node memory is not known
// Node memory is known so convert available memory percentage to node memory percentage
- double totalMemory = dynamicHeapSize
- ? getContainers().stream().mapToDouble(c -> c.getHostResource().realResources().memoryGb()).min().orElseThrow()
- : getContainers().get(0).getHostResource().realResources().memoryGb();
- double jvmHeapDeductionGb = dynamicHeapSize ? onnxModelCostCalculator.aggregatedModelCostInBytes() / (1024D * 1024 * 1024) : 0;
+ double totalMemory = getContainers().stream().mapToDouble(c -> c.getHostResource().realResources().memoryGb()).min().orElseThrow();
+ double jvmHeapDeductionGb = onnxModelCostCalculator.aggregatedModelCostInBytes() / (1024D * 1024 * 1024);
double availableMemory = Math.max(0, totalMemory - Host.memoryOverheadGb - jvmHeapDeductionGb);
int memoryPercentage = (int) (availableMemory / totalMemory * availableMemoryPercentage);
logger.log(FINE, () -> "cluster id '%s': memoryPercentage=%d, availableMemory=%f, totalMemory=%f, availableMemoryPercentage=%d, jvmHeapDeductionGb=%f"
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
index 799e0bd62e8..aeb6c030a49 100755
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
@@ -166,7 +166,7 @@ public abstract class ContainerCluster<CONTAINER extends Container>
private String hostClusterId = null;
private String jvmGCOptions = null;
- private boolean deferChangesUntilRestart = false;
+ private volatile boolean deferChangesUntilRestart = false;
private boolean clientsLegacyMode;
private List<Client> clients = List.of();
diff --git a/config-model/src/test/derived/advanced/ilscripts.cfg b/config-model/src/test/derived/advanced/ilscripts.cfg
index b78cb892501..c3cfb3774cd 100644
--- a/config-model/src/test/derived/advanced/ilscripts.cfg
+++ b/config-model/src/test/derived/advanced/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "advanced"
ilscript[].docfield[] "debug_src"
diff --git a/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg b/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg
index e7fefe0035a..bd8a0278d55 100644
--- a/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg
+++ b/config-model/src/test/derived/annotationsimplicitstruct/ilscripts.cfg
@@ -1,3 +1,3 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "annotationsimplicitstruct"
diff --git a/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg b/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg
index 22c4259ddac..7622f455903 100644
--- a/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg
+++ b/config-model/src/test/derived/annotationsinheritance/ilscripts.cfg
@@ -1,3 +1,3 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "annotationsinheritance"
diff --git a/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg b/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg
index bca5a004d1a..e9aa34ad573 100644
--- a/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg
+++ b/config-model/src/test/derived/annotationsinheritance2/ilscripts.cfg
@@ -1,3 +1,3 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "annotationsinheritance2"
diff --git a/config-model/src/test/derived/annotationsreference/ilscripts.cfg b/config-model/src/test/derived/annotationsreference/ilscripts.cfg
index db575631ba3..8c338f00ae1 100644
--- a/config-model/src/test/derived/annotationsreference/ilscripts.cfg
+++ b/config-model/src/test/derived/annotationsreference/ilscripts.cfg
@@ -1,3 +1,3 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "annotationsreference"
diff --git a/config-model/src/test/derived/annotationssimple/ilscripts.cfg b/config-model/src/test/derived/annotationssimple/ilscripts.cfg
index 744ba043c63..36842dd955f 100644
--- a/config-model/src/test/derived/annotationssimple/ilscripts.cfg
+++ b/config-model/src/test/derived/annotationssimple/ilscripts.cfg
@@ -1,3 +1,3 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "annotationssimple"
diff --git a/config-model/src/test/derived/arrays/ilscripts.cfg b/config-model/src/test/derived/arrays/ilscripts.cfg
index 0490835db33..cef6de758d0 100644
--- a/config-model/src/test/derived/arrays/ilscripts.cfg
+++ b/config-model/src/test/derived/arrays/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "arrays"
ilscript[].docfield[] "tags"
diff --git a/config-model/src/test/derived/attributeprefetch/ilscripts.cfg b/config-model/src/test/derived/attributeprefetch/ilscripts.cfg
index 771a54359b9..23f2fa610f1 100644
--- a/config-model/src/test/derived/attributeprefetch/ilscripts.cfg
+++ b/config-model/src/test/derived/attributeprefetch/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "prefetch"
ilscript[].docfield[] "singlebyte"
diff --git a/config-model/src/test/derived/attributes/ilscripts.cfg b/config-model/src/test/derived/attributes/ilscripts.cfg
index 42fda653618..3cd40dd94e2 100644
--- a/config-model/src/test/derived/attributes/ilscripts.cfg
+++ b/config-model/src/test/derived/attributes/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "attributes"
ilscript[].docfield[] "a1"
diff --git a/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg b/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg
index 04251c1a270..36f5b3d1505 100644
--- a/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg
+++ b/config-model/src/test/derived/bolding_dynamic_summary/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "test"
ilscript[].docfield[] "str_1"
diff --git a/config-model/src/test/derived/complex/ilscripts.cfg b/config-model/src/test/derived/complex/ilscripts.cfg
index 6074333bd24..f5f884bb7f4 100644
--- a/config-model/src/test/derived/complex/ilscripts.cfg
+++ b/config-model/src/test/derived/complex/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "complex"
ilscript[].docfield[] "title"
diff --git a/config-model/src/test/derived/emptydefault/ilscripts.cfg b/config-model/src/test/derived/emptydefault/ilscripts.cfg
index b17920fcaab..fba6d2a3c25 100644
--- a/config-model/src/test/derived/emptydefault/ilscripts.cfg
+++ b/config-model/src/test/derived/emptydefault/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "emptydefault"
ilscript[].docfield[] "one"
diff --git a/config-model/src/test/derived/exactmatch/ilscripts.cfg b/config-model/src/test/derived/exactmatch/ilscripts.cfg
index c24b656c4e7..8cec774181a 100644
--- a/config-model/src/test/derived/exactmatch/ilscripts.cfg
+++ b/config-model/src/test/derived/exactmatch/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "exactmatch"
ilscript[].docfield[] "tag"
diff --git a/config-model/src/test/derived/hnsw_index/ilscripts.cfg b/config-model/src/test/derived/hnsw_index/ilscripts.cfg
index 0c8266336b1..ad4f856dfc9 100644
--- a/config-model/src/test/derived/hnsw_index/ilscripts.cfg
+++ b/config-model/src/test/derived/hnsw_index/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "test"
ilscript[].docfield[] "t1"
diff --git a/config-model/src/test/derived/id/ilscripts.cfg b/config-model/src/test/derived/id/ilscripts.cfg
index 7543c76a12a..9c952fe4acc 100644
--- a/config-model/src/test/derived/id/ilscripts.cfg
+++ b/config-model/src/test/derived/id/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "id"
ilscript[].docfield[] "uri"
diff --git a/config-model/src/test/derived/indexswitches/ilscripts.cfg b/config-model/src/test/derived/indexswitches/ilscripts.cfg
index 5cda0a9fdc7..6c95fa24767 100644
--- a/config-model/src/test/derived/indexswitches/ilscripts.cfg
+++ b/config-model/src/test/derived/indexswitches/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "indexswitches"
ilscript[].docfield[] "title"
diff --git a/config-model/src/test/derived/inheritance/ilscripts.cfg b/config-model/src/test/derived/inheritance/ilscripts.cfg
index 91410489de8..f9ada266814 100644
--- a/config-model/src/test/derived/inheritance/ilscripts.cfg
+++ b/config-model/src/test/derived/inheritance/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "child"
ilscript[].docfield[] "onlygrandparent"
diff --git a/config-model/src/test/derived/language/ilscripts.cfg b/config-model/src/test/derived/language/ilscripts.cfg
index 4858788095c..acc715a0a01 100644
--- a/config-model/src/test/derived/language/ilscripts.cfg
+++ b/config-model/src/test/derived/language/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "language"
ilscript[].docfield[] "language"
diff --git a/config-model/src/test/derived/lowercase/ilscripts.cfg b/config-model/src/test/derived/lowercase/ilscripts.cfg
index fe36dc5daef..b0463f86755 100644
--- a/config-model/src/test/derived/lowercase/ilscripts.cfg
+++ b/config-model/src/test/derived/lowercase/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "lowercase"
ilscript[].docfield[] "single_field_source"
diff --git a/config-model/src/test/derived/multiplesummaries/ilscripts.cfg b/config-model/src/test/derived/multiplesummaries/ilscripts.cfg
index 2f4ecdb1712..87b5880c0db 100644
--- a/config-model/src/test/derived/multiplesummaries/ilscripts.cfg
+++ b/config-model/src/test/derived/multiplesummaries/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "multiplesummaries"
ilscript[].docfield[] "a"
diff --git a/config-model/src/test/derived/music/ilscripts.cfg b/config-model/src/test/derived/music/ilscripts.cfg
index ba292c4013a..7ce7ea18396 100644
--- a/config-model/src/test/derived/music/ilscripts.cfg
+++ b/config-model/src/test/derived/music/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "music"
ilscript[].docfield[] "bgndata"
diff --git a/config-model/src/test/derived/newrank/ilscripts.cfg b/config-model/src/test/derived/newrank/ilscripts.cfg
index ec46d9acc68..e16de1ec47e 100644
--- a/config-model/src/test/derived/newrank/ilscripts.cfg
+++ b/config-model/src/test/derived/newrank/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "newrank"
ilscript[].docfield[] "bgndata"
diff --git a/config-model/src/test/derived/orderilscripts/ilscripts.cfg b/config-model/src/test/derived/orderilscripts/ilscripts.cfg
index c41939b34d1..32b9f4d7b05 100644
--- a/config-model/src/test/derived/orderilscripts/ilscripts.cfg
+++ b/config-model/src/test/derived/orderilscripts/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "orderilscripts"
ilscript[].docfield[] "foo"
diff --git a/config-model/src/test/derived/position_array/ilscripts.cfg b/config-model/src/test/derived/position_array/ilscripts.cfg
index f96542147b4..662b8f9380b 100644
--- a/config-model/src/test/derived/position_array/ilscripts.cfg
+++ b/config-model/src/test/derived/position_array/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "position_array"
ilscript[].docfield[] "pos"
diff --git a/config-model/src/test/derived/position_attribute/ilscripts.cfg b/config-model/src/test/derived/position_attribute/ilscripts.cfg
index c2c66db4f77..1060e9b842d 100644
--- a/config-model/src/test/derived/position_attribute/ilscripts.cfg
+++ b/config-model/src/test/derived/position_attribute/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "position_attribute"
ilscript[].docfield[] "pos"
diff --git a/config-model/src/test/derived/position_extra/ilscripts.cfg b/config-model/src/test/derived/position_extra/ilscripts.cfg
index 110b5e40644..95681924fac 100644
--- a/config-model/src/test/derived/position_extra/ilscripts.cfg
+++ b/config-model/src/test/derived/position_extra/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "position_extra"
ilscript[].docfield[] "pos_str"
diff --git a/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg b/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg
index a2ada9792a0..5af86ee0152 100644
--- a/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg
+++ b/config-model/src/test/derived/prefixexactattribute/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "prefixexactattribute"
ilscript[].docfield[] "indexfield0"
diff --git a/config-model/src/test/derived/ranktypes/ilscripts.cfg b/config-model/src/test/derived/ranktypes/ilscripts.cfg
index 9f82e75986c..f8015a84f29 100644
--- a/config-model/src/test/derived/ranktypes/ilscripts.cfg
+++ b/config-model/src/test/derived/ranktypes/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "ranktypes"
ilscript[].docfield[] "title"
diff --git a/config-model/src/test/derived/schemainheritance/ilscripts.cfg b/config-model/src/test/derived/schemainheritance/ilscripts.cfg
index 0a8e10859a0..e20fac6a5c0 100644
--- a/config-model/src/test/derived/schemainheritance/ilscripts.cfg
+++ b/config-model/src/test/derived/schemainheritance/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "child"
ilscript[].docfield[] "pf1"
diff --git a/config-model/src/test/derived/structanyorder/ilscripts.cfg b/config-model/src/test/derived/structanyorder/ilscripts.cfg
index d89bb92df53..9db111fc20e 100644
--- a/config-model/src/test/derived/structanyorder/ilscripts.cfg
+++ b/config-model/src/test/derived/structanyorder/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "annotationsimplicitstruct"
ilscript[].docfield[] "structfield"
diff --git a/config-model/src/test/derived/tokenization/ilscripts.cfg b/config-model/src/test/derived/tokenization/ilscripts.cfg
index 4414ad0f7cb..6d62a8a941d 100644
--- a/config-model/src/test/derived/tokenization/ilscripts.cfg
+++ b/config-model/src/test/derived/tokenization/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "tokenization"
ilscript[].docfield[] "text"
diff --git a/config-model/src/test/derived/types/ilscripts.cfg b/config-model/src/test/derived/types/ilscripts.cfg
index b3da5f8e727..31628ac5573 100644
--- a/config-model/src/test/derived/types/ilscripts.cfg
+++ b/config-model/src/test/derived/types/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "types"
ilscript[].docfield[] "abyte"
diff --git a/config-model/src/test/derived/uri_array/ilscripts.cfg b/config-model/src/test/derived/uri_array/ilscripts.cfg
index 90664bba50d..a2985d48743 100644
--- a/config-model/src/test/derived/uri_array/ilscripts.cfg
+++ b/config-model/src/test/derived/uri_array/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "uri_array"
ilscript[].docfield[] "my_uri"
diff --git a/config-model/src/test/derived/uri_wset/ilscripts.cfg b/config-model/src/test/derived/uri_wset/ilscripts.cfg
index 1ada759a711..be1332d44b8 100644
--- a/config-model/src/test/derived/uri_wset/ilscripts.cfg
+++ b/config-model/src/test/derived/uri_wset/ilscripts.cfg
@@ -1,4 +1,4 @@
-maxtermoccurrences 100
+maxtermoccurrences 1000
fieldmatchmaxlength 1000000
ilscript[].doctype "uri_wset"
ilscript[].docfield[] "my_uri"
diff --git a/configdefinitions/src/vespa/ilscripts.def b/configdefinitions/src/vespa/ilscripts.def
index 16671806603..2e86ae1a02a 100644
--- a/configdefinitions/src/vespa/ilscripts.def
+++ b/configdefinitions/src/vespa/ilscripts.def
@@ -2,7 +2,7 @@
namespace=vespa.configdefinition
## The maximum number of occurrences of a given term to index per field
-maxtermoccurrences int default=100
+maxtermoccurrences int default=1000
fieldmatchmaxlength int default=1000000
ilscript[].doctype string
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
index df01d1edac3..22b2b581b44 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
@@ -22,7 +22,6 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.AthenzDomain;
import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.ClusterSpec;
-import com.yahoo.config.provision.ClusterSpec.Id;
import com.yahoo.config.provision.DataplaneToken;
import com.yahoo.config.provision.DockerImage;
import com.yahoo.config.provision.HostName;
@@ -40,7 +39,6 @@ import java.io.File;
import java.net.URI;
import java.security.cert.X509Certificate;
import java.time.Duration;
-import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -69,7 +67,6 @@ public class ModelContextImpl implements ModelContext {
private final ModelContext.Properties properties;
private final Optional<File> appDir;
private final OnnxModelCost onnxModelCost;
- private final Set<ClusterSpec.Id> restartingClusters;
private final Optional<DockerImage> wantedDockerImageRepository;
@@ -97,7 +94,6 @@ public class ModelContextImpl implements ModelContext {
ModelContext.Properties properties,
Optional<File> appDir,
OnnxModelCost onnxModelCost,
- Collection<Id> restartingClusters,
Optional<DockerImage> wantedDockerImageRepository,
Version modelVespaVersion,
Version wantedNodeVespaVersion) {
@@ -116,7 +112,6 @@ public class ModelContextImpl implements ModelContext {
this.modelVespaVersion = modelVespaVersion;
this.wantedNodeVespaVersion = wantedNodeVespaVersion;
this.onnxModelCost = onnxModelCost;
- this.restartingClusters = Set.copyOf(restartingClusters);
}
@Override
@@ -153,9 +148,6 @@ public class ModelContextImpl implements ModelContext {
public Optional<? extends Reindexing> reindexing() { return reindexing; }
@Override
- public Set<ClusterSpec.Id> restartingClusters() { return restartingClusters; }
-
- @Override
public ModelContext.Properties properties() { return properties; }
@Override
@@ -212,7 +204,6 @@ public class ModelContextImpl implements ModelContext {
private boolean sortBlueprintsByCost;
private final boolean alwaysMarkPhraseExpensive;
private final int contentLayerMetadataFeatureLevel;
- private final boolean dynamicHeapSize;
private final String unknownConfigDefinition;
private final int searchHandlerThreadpool;
private final long mergingMaxMemoryUsagePerNode;
@@ -256,7 +247,6 @@ public class ModelContextImpl implements ModelContext {
this.heapPercentage = flagValue(source, appId, version, PermanentFlags.HEAP_SIZE_PERCENTAGE);
this.summaryDecodePolicy = flagValue(source, appId, version, Flags.SUMMARY_DECODE_POLICY);
this.contentLayerMetadataFeatureLevel = flagValue(source, appId, version, Flags.CONTENT_LAYER_METADATA_FEATURE_LEVEL);
- this.dynamicHeapSize = flagValue(source, appId, version, Flags.DYNAMIC_HEAP_SIZE);
this.unknownConfigDefinition = flagValue(source, appId, version, Flags.UNKNOWN_CONFIG_DEFINITION);
this.searchHandlerThreadpool = flagValue(source, appId, version, Flags.SEARCH_HANDLER_THREADPOOL);
this.mergingMaxMemoryUsagePerNode = flagValue(source, appId, version, Flags.MERGING_MAX_MEMORY_USAGE_PER_NODE);
@@ -311,7 +301,6 @@ public class ModelContextImpl implements ModelContext {
}
@Override public boolean alwaysMarkPhraseExpensive() { return alwaysMarkPhraseExpensive; }
@Override public int contentLayerMetadataFeatureLevel() { return contentLayerMetadataFeatureLevel; }
- @Override public boolean dynamicHeapSize() { return dynamicHeapSize; }
@Override public String unknownConfigDefinition() { return unknownConfigDefinition; }
@Override public int searchHandlerThreadpool() { return searchHandlerThreadpool; }
@Override public long mergingMaxMemoryUsagePerNode() { return mergingMaxMemoryUsagePerNode; }
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
index 02e49e3990c..64ccd910120 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
@@ -118,13 +118,12 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
modelContextProperties,
Optional.empty(),
onnxModelCost,
- zkClient.readActivationTriggers().restartingClusters(),
wantedDockerImageRepository,
modelFactory.version(),
wantedNodeVespaVersion);
MetricUpdater applicationMetricUpdater = metrics.getOrCreateMetricUpdater(Metrics.createDimensions(applicationId));
ServerCache serverCache = new ServerCache(configDefinitionRepo, zkClient.getUserConfigDefinitions());
- return new Application(modelFactory.createModel(modelContext),
+ return new Application(withDeferredConfigForRestartingClusters(modelFactory.createModel(modelContext)),
serverCache,
applicationGeneration,
modelFactory.version(),
@@ -171,4 +170,15 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
zkClient.readDataplaneTokens());
}
+ private Model withDeferredConfigForRestartingClusters(Model model) {
+ if ( ! (model instanceof VespaModel vespaModel)) return model;
+ for (ClusterSpec.Id cluster : zkClient.readActivationTriggers().restartingClusters()) {
+ ApplicationContainerCluster containerCluster = vespaModel.getContainerClusters().get(cluster.value());
+ if (containerCluster != null) containerCluster.setDeferChangesUntilRestart(true);
+ ContentCluster contentCluster = vespaModel.getContentClusters().get(cluster.value());
+ if (contentCluster != null) contentCluster.setDeferChangesUntilRestart(true);
+ }
+ return model;
+ }
+
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java
index 894cedd0a34..fd8728ac655 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java
@@ -128,7 +128,6 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
createModelContextProperties(modelFactory.version(), applicationPackage),
getAppDir(applicationPackage),
onnxModelCost,
- Set.of(), // Known after preparation and validation, passed from activated models builder only.
wantedDockerImageRepository,
modelVersion,
wantedNodeVespaVersion);
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java
index 27d82e90197..3289cc71357 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java
@@ -16,7 +16,6 @@ import com.yahoo.config.model.application.provider.MockFileRegistry;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.model.test.MockApplicationPackage;
import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.ClusterSpec.Id;
import com.yahoo.config.provision.Zone;
import com.yahoo.container.jdisc.SecretStoreProvider;
import com.yahoo.vespa.config.server.deploy.ModelContextImpl;
@@ -81,7 +80,6 @@ public class ModelContextImplTest {
List.of()),
Optional.empty(),
OnnxModelCost.disabled(),
- List.of(Id.from("foobar")),
Optional.empty(),
new Version(7),
new Version(8));
@@ -90,7 +88,6 @@ public class ModelContextImplTest {
assertFalse(context.previousModel().isPresent());
assertTrue(context.getFileRegistry() instanceof MockFileRegistry);
assertTrue(context.configDefinitionRepo() instanceof StaticConfigDefinitionRepo);
- assertEquals(Set.of(Id.from("foobar")), context.restartingClusters());
assertEquals(ApplicationId.defaultId(), context.properties().applicationId());
assertTrue(context.properties().configServerSpecs().isEmpty());
assertTrue(context.properties().multitenant());
diff --git a/container-core/src/main/resources/configdefinitions/container.qr.def b/container-core/src/main/resources/configdefinitions/container.qr.def
index e49e334a299..51ec6fc324a 100644
--- a/container-core/src/main/resources/configdefinitions/container.qr.def
+++ b/container-core/src/main/resources/configdefinitions/container.qr.def
@@ -9,16 +9,16 @@ namespace=container
filedistributor.configid reference default=""
## Is RPC server enabled?
-rpc.enabled bool default=false restart
+rpc.enabled bool default=false
## RPC server listen port
-rpc.port int default=8086 restart
+rpc.port int default=8086
## Which interface to bind to.
-rpc.host string default="" restart
+rpc.host string default=""
## The id this service should register itself with in slobrok
-rpc.slobrokId string default="" restart
+rpc.slobrokId string default=""
## A unique identifier string for this QRS. The only guarantee given is
## this string will be unique for every QRS in a Vespa application.
diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
index 6cc922682cb..0c93ccc43b3 100644
--- a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
+++ b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java
@@ -62,6 +62,7 @@ import java.util.Comparator;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Phaser;
import java.util.logging.Level;
@@ -272,8 +273,25 @@ public final class ConfiguredApplication implements Application {
if (first(subscriber.config().values()) instanceof QrConfig newConfig) {
reconfigure(newConfig.shutdown());
synchronized (this) {
- if (qrConfig.rpc().port() != newConfig.rpc().port()) {
- log.log(Level.INFO, "Rpc port changed from " + qrConfig.rpc().port() + " to " + newConfig.rpc().port());
+ var currRpc = qrConfig.rpc();
+ var newRpc = newConfig.rpc();
+ boolean reListen = (currRpc.port() != newRpc.port()) ||
+ (currRpc.enabled() != newRpc.enabled()) ||
+ ! Objects.equals(currRpc.host(), newRpc.host()) ||
+ ! Objects.equals(currRpc.slobrokId(), newRpc.slobrokId());
+ if (reListen) {
+ if (currRpc.port() != newRpc.port()) {
+ log.log(Level.INFO, "Rpc port changed from " + currRpc.port() + " to " + newRpc.port());
+ }
+ if (currRpc.enabled() != newRpc.enabled()) {
+ log.log(Level.INFO, "Rpc server " + (newRpc.enabled() ? "enabled" : "disabled"));
+ }
+ if ( ! Objects.equals(currRpc.host(), newRpc.host())) {
+ log.log(Level.INFO, "Rpc host changed from " + currRpc.host() + " to " + newRpc.host());
+ }
+ if ( ! Objects.equals(currRpc.slobrokId(), newRpc.slobrokId())) {
+ log.log(Level.INFO, "Rpc slobrokid changed from " + currRpc.slobrokId() + " to " + newRpc.slobrokId());
+ }
try {
reListenRpc(newConfig);
} catch (Throwable e) {
diff --git a/dependency-versions/pom.xml b/dependency-versions/pom.xml
index af9d51509cb..76e537601d5 100644
--- a/dependency-versions/pom.xml
+++ b/dependency-versions/pom.xml
@@ -145,6 +145,8 @@
<!-- Versions used by tenant parent pom and testing framework -->
<!-- CAUTION: upgrading junit for tenants poms may break testing frameworks -->
+ <!-- CAUTION 2: this version must match the exported packages from the tenant-cd-api module -->
+ <!-- CAUTION 3: this is probably not a good idea to change too ofter; consider a major version next time -->
<junit.vespa.tenant.version>5.10.1</junit.vespa.tenant.version>
<junit.platform.vespa.tenant.version>1.10.1</junit.platform.vespa.tenant.version>
<surefire.vespa.tenant.version>${surefire.vespa.version}</surefire.vespa.tenant.version>
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
index cf9ab5c3973..2b8bff8e6b4 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java
@@ -306,6 +306,14 @@ public class Flags {
"Takes effect at next tick",
INSTANCE_ID);
+ public static final UnboundListFlag<String> OTELCOL_LOGS = defineListFlag(
+ "otelcol-logs", List.of(), String.class,
+ List.of("olaa"), "2024-01-15", "2024-03-01",
+ "Determines log files handled by the OpenTelemetry collector",
+ "Takes effect at next tick",
+ INSTANCE_ID, HOSTNAME
+ );
+
public static final UnboundStringFlag CORE_ENCRYPTION_PUBLIC_KEY_ID = defineStringFlag(
"core-encryption-public-key-id", "",
List.of("vekterli"), "2022-11-03", "2024-02-01",
@@ -313,11 +321,6 @@ public class Flags {
"Takes effect on the next tick.",
NODE_TYPE, HOSTNAME);
- public static final UnboundBooleanFlag ENABLE_THE_ONE_THAT_SHOULD_NOT_BE_NAMED = defineFeatureFlag(
- "enable-the-one-that-should-not-be-named", false, List.of("hmusum"), "2023-05-08", "2024-02-01",
- "Whether to enable the one program that should not be named",
- "Takes effect at next host-admin tick");
-
public static final UnboundListFlag<String> ZONAL_WEIGHTED_ENDPOINT_RECORDS = defineListFlag(
"zonal-weighted-endpoint-records", List.of(), String.class, List.of("jonmv"), "2023-12-15", "2024-06-01",
"A list of weighted (application) endpoint fqdns for which we should use zonal endpoints as targets, not LBs.",
@@ -385,7 +388,7 @@ public class Flags {
INSTANCE_ID);
public static final UnboundBooleanFlag DYNAMIC_HEAP_SIZE = defineFeatureFlag(
- "dynamic-heap-size", false,
+ "dynamic-heap-size", true,
List.of("bjorncs"), "2023-09-21", "2024-02-15",
"Whether to calculate JVM heap size based on predicted Onnx model memory requirements",
"Takes effect at redeployment",
diff --git a/model-integration/src/main/java/ai/vespa/embedding/ColBertEmbedder.java b/model-integration/src/main/java/ai/vespa/embedding/ColBertEmbedder.java
index 0bee03a65af..8c39cc8c813 100644
--- a/model-integration/src/main/java/ai/vespa/embedding/ColBertEmbedder.java
+++ b/model-integration/src/main/java/ai/vespa/embedding/ColBertEmbedder.java
@@ -191,10 +191,10 @@ public class ColBertEmbedder extends AbstractComponent implements Embedder {
attentionMaskName, attentionMaskTensor.expand("d0"));
Map<String, Tensor> outputs = evaluator.evaluate(inputs);
Tensor tokenEmbeddings = outputs.get(outputName);
- IndexedTensor result = (IndexedTensor) tokenEmbeddings.reduce(Reduce.Aggregator.min, "d0");
+ IndexedTensor result = (IndexedTensor) tokenEmbeddings;
int dims = tensorType.indexedSubtype().dimensions().get(0).size().get().intValue();
- if (dims != result.shape()[1]) {
+ if (dims != result.shape()[2]) {
throw new IllegalArgumentException("Token vector dimensionality does not" +
" match indexed dimensionality of " + dims);
}
@@ -217,9 +217,9 @@ public class ColBertEmbedder extends AbstractComponent implements Embedder {
Map<String, Tensor> outputs = evaluator.evaluate(inputs);
Tensor tokenEmbeddings = outputs.get(outputName);
- IndexedTensor result = (IndexedTensor) tokenEmbeddings.reduce(Reduce.Aggregator.min, "d0");
+ IndexedTensor result = (IndexedTensor) tokenEmbeddings;
Tensor contextualEmbeddings;
- int maxTokens = input.inputIds.size() -1; //Do not retain last PAD
+ int maxTokens = input.inputIds.size(); //Retain all token vectors, including PAD tokens.
if (tensorType.valueType() == TensorType.Value.INT8) {
contextualEmbeddings = toBitTensor(result, tensorType, maxTokens);
} else {
@@ -230,11 +230,13 @@ public class ColBertEmbedder extends AbstractComponent implements Embedder {
}
public static Tensor toFloatTensor(IndexedTensor result, TensorType type, int nTokens) {
+ if(result.shape().length != 3)
+ throw new IllegalArgumentException("Expected onnx result to have 3-dimensions [batch, sequence, dim]");
int size = type.indexedSubtype().dimensions().size();
if (size != 1)
- throw new IllegalArgumentException("Indexed tensor must have one dimension");
+ throw new IllegalArgumentException("Target indexed sub-type must have one dimension");
int wantedDimensionality = type.indexedSubtype().dimensions().get(0).size().get().intValue();
- int resultDimensionality = (int)result.shape()[1];
+ int resultDimensionality = (int)result.shape()[2];
if (resultDimensionality != wantedDimensionality) {
throw new IllegalArgumentException("Not possible to map token vector embedding with " + resultDimensionality
+ " + dimensions into tensor with " + wantedDimensionality);
@@ -242,7 +244,7 @@ public class ColBertEmbedder extends AbstractComponent implements Embedder {
Tensor.Builder builder = Tensor.Builder.of(type);
for (int token = 0; token < nTokens; token++) {
for (int d = 0; d < resultDimensionality; d++) {
- var value = result.get(TensorAddress.of(token, d));
+ var value = result.get(0,token,d); // batch, sequence token, dimension
builder.cell(TensorAddress.of(token,d),value);
}
}
@@ -253,11 +255,14 @@ public class ColBertEmbedder extends AbstractComponent implements Embedder {
if (type.valueType() != TensorType.Value.INT8)
throw new IllegalArgumentException("Only a int8 tensor type can be" +
" the destination of bit packing");
+ if(result.shape().length != 3)
+ throw new IllegalArgumentException("Expected onnx result to have 3-dimensions [batch, sequence, dim]");
+
int size = type.indexedSubtype().dimensions().size();
if (size != 1)
- throw new IllegalArgumentException("Indexed tensor must have one dimension");
+ throw new IllegalArgumentException("Target indexed sub-type must have one dimension");
int wantedDimensionality = type.indexedSubtype().dimensions().get(0).size().get().intValue();
- int resultDimensionality = (int)result.shape()[1];
+ int resultDimensionality = (int)result.shape()[2];
if (resultDimensionality != 8 * wantedDimensionality) {
throw new IllegalArgumentException("Not possible to pack " + resultDimensionality
+ " + dimensions into " + wantedDimensionality + " dimensions");
@@ -266,8 +271,8 @@ public class ColBertEmbedder extends AbstractComponent implements Embedder {
for (int token = 0; token < nTokens; token++) {
BitSet bitSet = new BitSet(8);
int key = 0;
- for (int d = 0; d < result.shape()[1]; d++) {
- var value = result.get(TensorAddress.of(token, d));
+ for (int d = 0; d < result.shape()[2]; d++) {
+ var value = result.get(0, token, d); // batch, sequence token, dimension
int bitIndex = 7 - (d % 8);
if (value > 0.0) {
bitSet.set(bitIndex);
diff --git a/model-integration/src/test/java/ai/vespa/embedding/ColBertEmbedderTest.java b/model-integration/src/test/java/ai/vespa/embedding/ColBertEmbedderTest.java
index f3682e45efc..0cae94c372a 100644
--- a/model-integration/src/test/java/ai/vespa/embedding/ColBertEmbedderTest.java
+++ b/model-integration/src/test/java/ai/vespa/embedding/ColBertEmbedderTest.java
@@ -10,6 +10,7 @@ import com.yahoo.tensor.MixedTensor;
import com.yahoo.tensor.Tensor;
import com.yahoo.tensor.TensorAddress;
import com.yahoo.tensor.TensorType;
+import org.junit.Ignore;
import org.junit.Test;
import java.util.List;
@@ -35,25 +36,25 @@ public class ColBertEmbedderTest {
public void testPacking() {
assertPackedRight(
"" +
- "tensor<float>(d1[6],d2[8]):" +
- "[" +
+ "tensor<float>(d0[1],d1[6],d2[8]):" +
+ "[[" +
"[0, 0, 0, 0, 0, 0, 0, 1]," +
"[0, 0, 0, 0, 0, 1, 0, 1]," +
"[0, 0, 0, 0, 0, 0, 1, 1]," +
"[0, 1, 1, 1, 1, 1, 1, 1]," +
"[1, 0, 0, 0, 0, 0, 0, 0]," +
"[1, 1, 1, 1, 1, 1, 1, 1]" +
- "]",
+ "]]",
TensorType.fromSpec("tensor<int8>(dt{},x[1])"),
"tensor<int8>(dt{},x[1]):{0:1.0, 1:5.0, 2:3.0, 3:127.0, 4:-128.0, 5:-1.0}", 6
);
assertPackedRight(
"" +
- "tensor<float>(d1[2],d2[16]):" +
- "[" +
+ "tensor<float>(d0[1],d1[2],d2[16]):" +
+ "[[" +
"[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0]," +
"[0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1]" +
- "]",
+ "]]",
TensorType.fromSpec("tensor<int8>(dt{},x[2])"),
"tensor<int8>(dt{},x[2]):{0:[1.0, -128.0], 1:[5.0, 1.0]}",2
);
@@ -133,18 +134,35 @@ public class ColBertEmbedderTest {
}
String text = sb.toString();
Tensor fullFloat = assertEmbed("tensor<float>(dt{},x[128])", text, indexingContext);
- assertEquals(511*128,fullFloat.size());
+ assertEquals(512*128,fullFloat.size());
Tensor query = assertEmbed("tensor<float>(dt{},x[128])", text, queryContext);
assertEquals(32*128,query.size());
Tensor binaryRep = assertEmbed("tensor<int8>(dt{},x[16])", text, indexingContext);
- assertEquals(511*16,binaryRep.size());
+ assertEquals(512*16,binaryRep.size());
Tensor shortDoc = assertEmbed("tensor<int8>(dt{},x[16])", "annoyance", indexingContext);
- // 3 tokens, 16 bytes each = 48 bytes
+ // 4 tokens, 16 bytes each = 64 bytes
//CLS [unused1] sequence
- assertEquals(3*16,shortDoc.size());;
+ assertEquals(4*16,shortDoc.size());;
+ }
+
+ @Ignore
+ public void testPerf() {
+ StringBuilder sb = new StringBuilder();
+ for(int i = 0; i < 256; i++) {
+ sb.append("annoyance");
+ sb.append(" ");
+ }
+ String text = sb.toString();
+ Long now = System.currentTimeMillis();
+ int n = 1000;
+ for (int i = 0; i < n; i++) {
+ assertEmbed("tensor<float>(dt{},x[128])", text, indexingContext);
+ }
+ Long elapsed = (System.currentTimeMillis() - now);
+ System.out.println("Elapsed time: " + elapsed + " ms");
}
static Tensor assertEmbed(String tensorSpec, String text, Embedder.Context context) {
@@ -163,11 +181,11 @@ public class ColBertEmbedderTest {
Tensor packed = ColBertEmbedder.toBitTensor(in, destination, size);
assertEquals(expected, packed.toString());
Tensor unpacked = ColBertEmbedder.expandBitTensor(packed);
- assertEquals(in.shape()[1], unpacked.type().indexedSubtype().dimensions().get(0).size().get().longValue());
+ assertEquals(in.shape()[2], unpacked.type().indexedSubtype().dimensions().get(0).size().get().longValue());
for (int dOuter = 0; dOuter < size; dOuter++) {
- for (int dInner = 0; dInner < in.shape()[1]; dInner++) {
+ for (int dInner = 0; dInner < in.shape()[2]; dInner++) {
var addr = TensorAddress.of(dOuter, dInner);
- double oldVal = in.get(addr);
+ double oldVal = in.get(TensorAddress.of(0,dOuter, dInner));
if (oldVal > 0) {
assertEquals(unpacked.get(addr), 1.0, 0.0);
} else {
diff --git a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
index f800e124bdc..bbd2744119a 100644
--- a/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/blueprint_test.cpp
@@ -24,10 +24,10 @@ class MyOr : public IntermediateBlueprint
private:
public:
double calculate_cost() const final {
- return cost_of(get_children(), OrFlow());
+ return OrFlow::cost_of(get_children());
}
double calculate_relative_estimate() const final {
- return estimate_of(get_children(), OrFlow());
+ return OrFlow::estimate_of(get_children());
}
HitEstimate combine(const std::vector<HitEstimate> &data) const override {
return max(data);
diff --git a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
index ab1c004c721..856ac2391f8 100644
--- a/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
+++ b/searchlib/src/tests/queryeval/blueprint/intermediate_blueprints_test.cpp
@@ -1380,7 +1380,7 @@ TEST("cost for ONEAR") {
}
TEST("cost for WEAKAND") {
- verify_cost(make::WEAKAND(1000), calc_cost({{1.1, 0.8},{1.2, 0.7},{1.3, 0.5}}));
+ verify_cost(make::WEAKAND(1000), calc_cost({{1.3, 0.5},{1.2, 0.7},{1.1, 0.8}}));
}
TEST_MAIN() { TEST_DEBUG("lhs.out", "rhs.out"); TEST_RUN_ALL(); }
diff --git a/searchlib/src/tests/queryeval/flow/queryeval_flow_test.cpp b/searchlib/src/tests/queryeval/flow/queryeval_flow_test.cpp
index ceda30f169a..9a9adeac2bc 100644
--- a/searchlib/src/tests/queryeval/flow/queryeval_flow_test.cpp
+++ b/searchlib/src/tests/queryeval/flow/queryeval_flow_test.cpp
@@ -5,44 +5,46 @@
#include <vector>
#include <random>
-using search::queryeval::AndFlow;
-using search::queryeval::OrFlow;
+constexpr size_t loop_cnt = 64;
+
+using namespace search::queryeval;
+
+struct ItemAdapter {
+ double estimate(const auto &child) const noexcept { return child.rel_est; }
+ double cost(const auto &child) const noexcept { return child.cost; }
+ double strict_cost(const auto &child) const noexcept { return child.strict_cost; }
+};
struct Item {
double rel_est;
double cost;
- Item(double rel_est_in, double cost_in) noexcept
- : rel_est(rel_est_in), cost(cost_in) {}
- static void sort_for_and(std::vector<Item> &data) {
- std::sort(data.begin(), data.end(), [](const Item &a, const Item &b) noexcept {
- return (1.0 - a.rel_est) / a.cost > (1.0 - b.rel_est) / b.cost;
- });
+ double strict_cost;
+ Item(double rel_est_in, double cost_in, double strict_cost_in) noexcept
+ : rel_est(rel_est_in), cost(cost_in), strict_cost(strict_cost_in) {}
+ template <typename FLOW> static double estimate_of(std::vector<Item> &data) {
+ return FLOW::estimate_of(ItemAdapter(), data);
}
- static void sort_for_or(std::vector<Item> &data) {
- std::sort(data.begin(), data.end(), [](const Item &a, const Item &b) noexcept {
- return a.rel_est / a.cost > b.rel_est / b.cost;
- });
+ template <typename FLOW> static void sort(std::vector<Item> &data, bool strict) {
+ FLOW::sort(ItemAdapter(), data, strict);
}
- static double cost_of(const std::vector<Item> &data, auto flow) {
- double cost = 0.0;
- for (const Item &item: data) {
- cost += flow.flow() * item.cost;
- flow.add(item.rel_est);
- }
- return cost;
+ template <typename FLOW> static double cost_of(const std::vector<Item> &data, bool strict) {
+ return FLOW::cost_of(ItemAdapter(), data, strict);
+ }
+ template <typename FLOW> static double ordered_cost_of(const std::vector<Item> &data, bool strict) {
+ return flow::ordered_cost_of(ItemAdapter(), data, FLOW(1.0, strict));
}
- static double cost_of_and(const std::vector<Item> &data) { return cost_of(data, AndFlow()); }
- static double cost_of_or(const std::vector<Item> &data) { return cost_of(data, OrFlow()); }
+ auto operator <=>(const Item &rhs) const noexcept = default;
};
std::vector<Item> gen_data(size_t size) {
static std::mt19937 gen;
- static std::uniform_real_distribution<double> rel_est(0.1, 0.9);
- static std::uniform_real_distribution<double> cost(1.0, 10.0);
+ static std::uniform_real_distribution<double> rel_est(0.1, 0.9);
+ static std::uniform_real_distribution<double> cost(1.0, 10.0);
+ static std::uniform_real_distribution<double> strict_cost(0.1, 5.0);
std::vector<Item> result;
result.reserve(size);
for (size_t i = 0; i < size; ++i) {
- result.emplace_back(rel_est(gen), cost(gen));
+ result.emplace_back(rel_est(gen), cost(gen), strict_cost(gen));
}
return result;
}
@@ -80,37 +82,191 @@ TEST(FlowTest, perm_test) {
EXPECT_EQ(seen.size(), 120);
}
+template <template <typename> typename ORDER>
+void verify_ordering_is_strict_weak() {
+ auto cmp = ORDER(ItemAdapter());
+ auto input = gen_data(7);
+ input.emplace_back(0.5, 1.5, 0.5);
+ input.emplace_back(0.5, 1.5, 0.5);
+ input.emplace_back(0.5, 1.5, 0.5);
+ input.emplace_back(0.0, 1.5, 0.5);
+ input.emplace_back(0.0, 1.5, 0.5);
+ input.emplace_back(0.5, 0.0, 0.5);
+ input.emplace_back(0.5, 0.0, 0.5);
+ input.emplace_back(0.5, 1.5, 0.0);
+ input.emplace_back(0.5, 1.5, 0.0);
+ input.emplace_back(0.0, 0.0, 0.0);
+ input.emplace_back(0.0, 0.0, 0.0);
+ std::vector<Item> output;
+ for (const Item &in: input) {
+ EXPECT_FALSE(cmp(in, in)); // Irreflexivity
+ size_t out_idx = 0;
+ bool lower = false;
+ bool upper = false;
+ for (const Item &out: output) {
+ if (cmp(out, in)) {
+ EXPECT_FALSE(cmp(in, out)); // Antisymmetry
+ EXPECT_FALSE(lower); // Transitivity
+ EXPECT_FALSE(upper); // Transitivity
+ ++out_idx;
+ } else {
+ lower = true;
+ if (cmp(in, out)) {
+ upper = true;
+ } else {
+ EXPECT_FALSE(upper); // Transitivity
+ }
+ }
+ }
+ output.insert(output.begin() + out_idx, in);
+ }
+}
+
+TEST(FlowTest, and_ordering_is_strict_weak) {
+ verify_ordering_is_strict_weak<flow::MinAndCost>();
+}
+
+TEST(FlowTest, or_ordering_is_strict_weak) {
+ verify_ordering_is_strict_weak<flow::MinOrCost>();
+}
+
+TEST(FlowTest, strict_or_ordering_is_strict_weak) {
+ verify_ordering_is_strict_weak<flow::MinOrStrictCost>();
+}
+
+struct ExpectFlow {
+ double flow;
+ double est;
+ bool strict;
+};
+
+void verify_flow(auto flow, const std::vector<double> &est_list, const std::vector<ExpectFlow> &expect) {
+ ASSERT_EQ(est_list.size() + 1, expect.size());
+ for (size_t i = 0; i < expect.size(); ++i) {
+ EXPECT_DOUBLE_EQ(flow.flow(), expect[i].flow);
+ EXPECT_DOUBLE_EQ(flow.estimate(), expect[i].est);
+ EXPECT_EQ(flow.strict(), expect[i].strict);
+ if (i < est_list.size()) {
+ flow.add(est_list[i]);
+ }
+ }
+}
+
+TEST(FlowTest, basic_and_flow) {
+ for (double in: {1.0, 0.5, 0.25}) {
+ for (bool strict: {false, true}) {
+ verify_flow(AndFlow(in, strict), {0.4, 0.7, 0.2},
+ {{in, 0.0, strict},
+ {in*0.4, in*0.4, false},
+ {in*0.4*0.7, in*0.4*0.7, false},
+ {in*0.4*0.7*0.2, in*0.4*0.7*0.2, false}});
+ }
+ }
+}
+
+TEST(FlowTest, basic_or_flow) {
+ for (double in: {1.0, 0.5, 0.25}) {
+ for (bool strict: {false, true}) {
+ verify_flow(OrFlow(in, strict), {0.4, 0.7, 0.2},
+ {{in, 0.0, strict},
+ {in*0.6, 1.0-in*0.6, strict},
+ {in*0.6*0.3, 1.0-in*0.6*0.3, strict},
+ {in*0.6*0.3*0.8, 1.0-in*0.6*0.3*0.8, strict}});
+ }
+ }
+}
+
+TEST(FlowTest, basic_and_not_flow) {
+ for (double in: {1.0, 0.5, 0.25}) {
+ for (bool strict: {false, true}) {
+ verify_flow(AndNotFlow(in, strict), {0.4, 0.7, 0.2},
+ {{in, 0.0, strict},
+ {in*0.4, in*0.4, false},
+ {in*0.4*0.3, in*0.4*0.3, false},
+ {in*0.4*0.3*0.8, in*0.4*0.3*0.8, false}});
+ }
+ }
+}
+
+TEST(FlowTest, flow_cost) {
+ std::vector<Item> data = {{0.4, 1.1, 0.6}, {0.7, 1.2, 0.5}, {0.2, 1.3, 0.4}};
+ EXPECT_DOUBLE_EQ(Item::ordered_cost_of<AndFlow>(data, false), 1.1 + 0.4*1.2 + 0.4*0.7*1.3);
+ EXPECT_DOUBLE_EQ(Item::ordered_cost_of<AndFlow>(data, true), 0.6 + 0.4*1.2 + 0.4*0.7*1.3);
+ EXPECT_DOUBLE_EQ(Item::ordered_cost_of<OrFlow>(data, false), 1.1 + 0.6*1.2 + 0.6*0.3*1.3);
+ EXPECT_DOUBLE_EQ(Item::ordered_cost_of<OrFlow>(data, true), 0.6 + 0.6*0.5 + 0.6*0.3*0.4);
+ EXPECT_DOUBLE_EQ(Item::ordered_cost_of<AndNotFlow>(data, false), 1.1 + 0.4*1.2 + 0.4*0.3*1.3);
+ EXPECT_DOUBLE_EQ(Item::ordered_cost_of<AndNotFlow>(data, true), 0.6 + 0.4*1.2 + 0.4*0.3*1.3);
+}
+
TEST(FlowTest, optimal_and_flow) {
- for (size_t i = 0; i < 256; ++i) {
- auto data = gen_data(7);
- Item::sort_for_and(data);
- double min_cost = Item::cost_of_and(data);
- double max_cost = 0.0;
- auto check = [min_cost,&max_cost](const std::vector<Item> &my_data) noexcept {
- double my_cost = Item::cost_of_and(my_data);
- EXPECT_LE(min_cost, my_cost);
- max_cost = std::max(max_cost, my_cost);
- };
- each_perm(data, check);
- fprintf(stderr, " and cost(%zu): min: %g, max: %g, factor: %g\n",
- i, min_cost, max_cost, max_cost / min_cost);
+ for (size_t i = 0; i < loop_cnt; ++i) {
+ for (bool strict: {false, true}) {
+ auto data = gen_data(7);
+ double ref_est = Item::estimate_of<AndFlow>(data);
+ double min_cost = Item::cost_of<AndFlow>(data, strict);
+ double max_cost = 0.0;
+ Item::sort<AndFlow>(data, strict);
+ EXPECT_EQ(Item::ordered_cost_of<AndFlow>(data, strict), min_cost);
+ auto check = [&](const std::vector<Item> &my_data) noexcept {
+ double my_cost = Item::ordered_cost_of<AndFlow>(my_data, strict);
+ EXPECT_LE(min_cost, my_cost);
+ max_cost = std::max(max_cost, my_cost);
+ };
+ each_perm(data, check);
+ if (loop_cnt < 1024 || i % 1024 == 0) {
+ fprintf(stderr, " AND cost(%zu,%s): min: %g, max: %g, factor: %g\n",
+ i, strict ? "strict" : "non-strict", min_cost, max_cost, max_cost / min_cost);
+ }
+ EXPECT_NEAR(ref_est, Item::estimate_of<AndFlow>(data), 1e-9);
+ }
}
}
TEST(FlowTest, optimal_or_flow) {
- for (size_t i = 0; i < 256; ++i) {
- auto data = gen_data(7);
- Item::sort_for_or(data);
- double min_cost = Item::cost_of_or(data);
- double max_cost = 0.0;
- auto check = [min_cost,&max_cost](const std::vector<Item> &my_data) noexcept {
- double my_cost = Item::cost_of_or(my_data);
- EXPECT_LE(min_cost, my_cost);
- max_cost = std::max(max_cost, my_cost);
- };
- each_perm(data, check);
- fprintf(stderr, " or cost(%zu): min: %g, max: %g, factor: %g\n",
- i, min_cost, max_cost, max_cost / min_cost);
+ for (size_t i = 0; i < loop_cnt; ++i) {
+ for (bool strict: {false, true}) {
+ auto data = gen_data(7);
+ double min_cost = Item::cost_of<OrFlow>(data, strict);
+ double max_cost = 0.0;
+ Item::sort<OrFlow>(data, strict);
+ EXPECT_EQ(Item::ordered_cost_of<OrFlow>(data, strict), min_cost);
+ auto check = [&](const std::vector<Item> &my_data) noexcept {
+ double my_cost = Item::ordered_cost_of<OrFlow>(my_data, strict);
+ EXPECT_LE(min_cost, my_cost);
+ max_cost = std::max(max_cost, my_cost);
+ };
+ each_perm(data, check);
+ if (loop_cnt < 1024 || i % 1024 == 0) {
+ fprintf(stderr, " OR cost(%zu,%s): min: %g, max: %g, factor: %g\n",
+ i, strict ? "strict" : "non-strict", min_cost, max_cost, max_cost / min_cost);
+ }
+ }
+ }
+}
+
+TEST(FlowTest, optimal_and_not_flow) {
+ for (size_t i = 0; i < loop_cnt; ++i) {
+ for (bool strict: {false, true}) {
+ auto data = gen_data(7);
+ Item first = data[0];
+ double min_cost = Item::cost_of<AndNotFlow>(data, strict);
+ double max_cost = 0.0;
+ Item::sort<AndNotFlow>(data, strict);
+ EXPECT_EQ(data[0], first);
+ EXPECT_EQ(Item::ordered_cost_of<AndNotFlow>(data, strict), min_cost);
+ auto check = [&](const std::vector<Item> &my_data) noexcept {
+ if (my_data[0] == first) {
+ double my_cost = Item::ordered_cost_of<AndNotFlow>(my_data, strict);
+ EXPECT_LE(min_cost, my_cost);
+ max_cost = std::max(max_cost, my_cost);
+ }
+ };
+ each_perm(data, check);
+ if (loop_cnt < 1024 || i % 1024 == 0) {
+ fprintf(stderr, " ANDNOT cost(%zu,%s): min: %g, max: %g, factor: %g\n",
+ i, strict ? "strict" : "non-strict", min_cost, max_cost, max_cost / min_cost);
+ }
+ }
}
}
diff --git a/searchlib/src/vespa/searchlib/query/streaming/query.cpp b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
index 3079ec31e8f..ca742aabe26 100644
--- a/searchlib/src/vespa/searchlib/query/streaming/query.cpp
+++ b/searchlib/src/vespa/searchlib/query/streaming/query.cpp
@@ -107,9 +107,7 @@ QueryConnector::create(ParseItem::ItemType type)
case search::ParseItem::ITEM_AND: return std::make_unique<AndQueryNode>();
case search::ParseItem::ITEM_OR:
case search::ParseItem::ITEM_WEAK_AND: return std::make_unique<OrQueryNode>();
- case search::ParseItem::ITEM_WEIGHTED_SET:
case search::ParseItem::ITEM_EQUIV: return std::make_unique<EquivQueryNode>();
- case search::ParseItem::ITEM_WAND: return std::make_unique<OrQueryNode>();
case search::ParseItem::ITEM_NOT: return std::make_unique<AndNotQueryNode>();
case search::ParseItem::ITEM_PHRASE: return std::make_unique<PhraseQueryNode>();
case search::ParseItem::ITEM_SAME_ELEMENT: return std::make_unique<SameElementQueryNode>();
diff --git a/searchlib/src/vespa/searchlib/queryeval/blueprint.h b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
index a78dd092f5a..d998c2e343e 100644
--- a/searchlib/src/vespa/searchlib/queryeval/blueprint.h
+++ b/searchlib/src/vespa/searchlib/queryeval/blueprint.h
@@ -144,22 +144,6 @@ public:
return (total_docs == 0) ? 0.0 : double(est) / double(total_docs);
}
- static double cost_of(const Children &children, auto flow) {
- double cost = 0.0;
- for (const auto &child: children) {
- cost += flow.flow() * child->cost();
- flow.add(child->estimate());
- }
- return cost;
- }
-
- static double estimate_of(const Children &children, auto flow) {
- for (const auto &child: children) {
- flow.add(child->estimate());
- }
- return flow.estimate();
- }
-
// utility that just takes maximum estimate
static HitEstimate max(const std::vector<HitEstimate> &data);
@@ -172,20 +156,6 @@ public:
// lower limit for docid_limit: max child estimate
static HitEstimate sat_sum(const std::vector<HitEstimate> &data, uint32_t docid_limit);
- // sort children to minimize total cost of OR flow
- struct MinimalOrCost {
- bool operator () (const auto &a, const auto &b) const noexcept {
- return a->estimate() / a->cost() > b->estimate() / b->cost();
- }
- };
-
- // sort children to minimize total cost of AND flow
- struct MinimalAndCost {
- bool operator () (const auto &a, const auto &b) const noexcept {
- return (1.0 - a->estimate()) / a->cost() > (1.0 - b->estimate()) / b->cost();
- }
- };
-
// utility to get the greater estimate to sort first, higher tiers last
struct TieredGreaterEstimate {
bool operator () (const auto &a, const auto &b) const noexcept {
diff --git a/searchlib/src/vespa/searchlib/queryeval/flow.h b/searchlib/src/vespa/searchlib/queryeval/flow.h
index 36c0a259feb..86ce6f8b93b 100644
--- a/searchlib/src/vespa/searchlib/queryeval/flow.h
+++ b/searchlib/src/vespa/searchlib/queryeval/flow.h
@@ -2,60 +2,261 @@
#pragma once
#include <cstddef>
-
-namespace search::queryeval {
+#include <algorithm>
+#include <vespa/vespalib/util/small_vector.h>
// Model how boolean result decisions flow through intermediate nodes
// of different types based on relative estimates for sub-expressions
-class AndFlow {
+namespace search::queryeval {
+
+namespace flow {
+
+// the default adapter expects the shape of std::unique_ptr<Blueprint>
+// with respect to estimate, cost and (coming soon) strict_cost.
+struct DefaultAdapter {
+ double estimate(const auto &child) const noexcept { return child->estimate(); }
+ double cost(const auto &child) const noexcept { return child->cost(); }
+ // Estimate the per-document cost of strict evaluation of this
+ // child. This will typically be something like (estimate() *
+ // cost()) for leafs with posting lists. OR will aggregate strict
+ // cost by calculating the minimal OR flow of strict child
+ // costs. AND will aggregate strict cost by calculating the
+ // minimal AND flow where the cost of the first child is
+ // substituted by its strict cost. This value is currently not
+ // available in Blueprints.
+ double strict_cost(const auto &child) const noexcept { return child->cost(); }
+};
+
+template <typename ADAPTER, typename T>
+struct IndirectAdapter {
+ const T &data;
+ [[no_unique_address]] ADAPTER adapter;
+ IndirectAdapter(ADAPTER adapter_in, const T &data_in) noexcept
+ : data(data_in), adapter(adapter_in) {}
+ double estimate(size_t child) const noexcept { return adapter.estimate(data[child]); }
+ double cost(size_t child) const noexcept { return adapter.cost(data[child]); }
+ double strict_cost(size_t child) const noexcept { return adapter.strict_cost(data[child]); }
+};
+
+auto make_index(const auto &children) {
+ vespalib::SmallVector<uint32_t> index(children.size());
+ for (size_t i = 0; i < index.size(); ++i) {
+ index[i] = i;
+ }
+ return index;
+}
+
+template <typename ADAPTER>
+struct MinAndCost {
+ // sort children to minimize total cost of AND flow
+ [[no_unique_address]] ADAPTER adapter;
+ MinAndCost(ADAPTER adapter_in) noexcept : adapter(adapter_in) {}
+ bool operator () (const auto &a, const auto &b) const noexcept {
+ return (1.0 - adapter.estimate(a)) * adapter.cost(b) > (1.0 - adapter.estimate(b)) * adapter.cost(a);
+ }
+};
+
+template <typename ADAPTER>
+struct MinOrCost {
+ // sort children to minimize total cost of OR flow
+ [[no_unique_address]] ADAPTER adapter;
+ MinOrCost(ADAPTER adapter_in) noexcept : adapter(adapter_in) {}
+ bool operator () (const auto &a, const auto &b) const noexcept {
+ return adapter.estimate(a) * adapter.cost(b) > adapter.estimate(b) * adapter.cost(a);
+ }
+};
+
+template <typename ADAPTER>
+struct MinOrStrictCost {
+ // sort children to minimize total cost of strict OR flow
+ [[no_unique_address]] ADAPTER adapter;
+ MinOrStrictCost(ADAPTER adapter_in) noexcept : adapter(adapter_in) {}
+ bool operator () (const auto &a, const auto &b) const noexcept {
+ return adapter.estimate(a) * adapter.strict_cost(b) > adapter.estimate(b) * adapter.strict_cost(a);
+ }
+};
+
+template <typename ADAPTER, typename T, typename F>
+double estimate_of(ADAPTER adapter, const T &children, F flow) {
+ for (const auto &child: children) {
+ flow.add(adapter.estimate(child));
+ }
+ return flow.estimate();
+}
+
+template <template <typename> typename ORDER, typename ADAPTER, typename T>
+void sort(ADAPTER adapter, T &children) {
+ std::sort(children.begin(), children.end(), ORDER(adapter));
+}
+
+template <template <typename> typename ORDER, typename ADAPTER, typename T>
+void sort_partial(ADAPTER adapter, T &children, size_t offset) {
+ if (children.size() > offset) {
+ std::sort(children.begin() + offset, children.end(), ORDER(adapter));
+ }
+}
+
+template <typename ADAPTER, typename T, typename F>
+double ordered_cost_of(ADAPTER adapter, const T &children, F flow) {
+ double cost = 0.0;
+ for (const auto &child: children) {
+ double child_cost = flow.strict() ? adapter.strict_cost(child) : adapter.cost(child);
+ cost += flow.flow() * child_cost;
+ flow.add(adapter.estimate(child));
+ }
+ return cost;
+}
+
+template <typename ADAPTER, typename T>
+size_t select_strict_and_child(ADAPTER adapter, const T &children) {
+ size_t idx = 0;
+ double cost = 0.0;
+ size_t best_idx = 0;
+ double best_diff = 0.0;
+ double est = 1.0;
+ for (const auto &child: children) {
+ double child_cost = est * adapter.cost(child);
+ double child_strict_cost = adapter.strict_cost(child);
+ double child_est = adapter.estimate(child);
+ if (idx == 0) {
+ best_diff = child_strict_cost - child_cost;
+ } else {
+ double my_diff = (child_strict_cost + child_est * cost) - (cost + child_cost);
+ if (my_diff < best_diff) {
+ best_diff = my_diff;
+ best_idx = idx;
+ }
+ }
+ cost += child_cost;
+ est *= child_est;
+ ++idx;
+ }
+ return best_idx;
+}
+
+} // flow
+
+template <typename FLOW>
+struct FlowMixin {
+ static double estimate_of(auto adapter, const auto &children) {
+ return flow::estimate_of(adapter, children, FLOW(1.0, false));
+ }
+ static double estimate_of(const auto &children) {
+ return estimate_of(flow::DefaultAdapter(), children);
+ }
+ static double cost_of(auto adapter, const auto &children, bool strict) {
+ auto my_adapter = flow::IndirectAdapter(adapter, children);
+ auto order = flow::make_index(children);
+ FLOW::sort(my_adapter, order, strict);
+ return flow::ordered_cost_of(my_adapter, order, FLOW(1.0, strict));
+ }
+ static double cost_of(const auto &children, bool strict) {
+ return cost_of(flow::DefaultAdapter(), children, strict);
+ }
+ // TODO: remove
+ static double cost_of(const auto &children) { return cost_of(children, false); }
+};
+
+class AndFlow : public FlowMixin<AndFlow> {
private:
double _flow;
- size_t _cnt;
+ bool _strict;
+ bool _first;
public:
- AndFlow(double in = 1.0) noexcept : _flow(in), _cnt(0) {}
+ AndFlow(double in, bool strict) noexcept
+ : _flow(in), _strict(strict), _first(true) {}
void add(double est) noexcept {
_flow *= est;
- ++_cnt;
+ _first = false;
}
double flow() const noexcept {
return _flow;
}
+ bool strict() const noexcept {
+ return _strict && _first;
+ }
double estimate() const noexcept {
- return (_cnt > 0) ? _flow : 0.0;
+ return _first ? 0.0 : _flow;
+ }
+ static void sort(auto adapter, auto &children, bool strict) {
+ flow::sort<flow::MinAndCost>(adapter, children);
+ if (strict && children.size() > 1) {
+ size_t idx = flow::select_strict_and_child(adapter, children);
+ auto the_one = std::move(children[idx]);
+ for (; idx > 0; --idx) {
+ children[idx] = std::move(children[idx-1]);
+ }
+ children[0] = std::move(the_one);
+ }
+ }
+ // TODO: add strict
+ static void sort(auto &children) {
+ sort(flow::DefaultAdapter(), children, false);
}
};
-class OrFlow {
+class OrFlow : public FlowMixin<OrFlow>{
private:
double _flow;
+ bool _strict;
+ bool _first;
public:
- OrFlow(double in = 1.0) noexcept : _flow(in) {}
+ OrFlow(double in, bool strict) noexcept
+ : _flow(in), _strict(strict), _first(true) {}
void add(double est) noexcept {
_flow *= (1.0 - est);
+ _first = false;
}
double flow() const noexcept {
return _flow;
}
+ bool strict() const noexcept {
+ return _strict;
+ }
double estimate() const noexcept {
- return (1.0 - _flow);
+ return _first ? 0.0 : (1.0 - _flow);
+ }
+ static void sort(auto adapter, auto &children, bool strict) {
+ if (strict) {
+ flow::sort<flow::MinOrStrictCost>(adapter, children);
+ } else {
+ flow::sort<flow::MinOrCost>(adapter, children);
+ }
+ }
+ // TODO: add strict
+ static void sort(auto &children) {
+ sort(flow::DefaultAdapter(), children, false);
}
};
-class AndNotFlow {
+class AndNotFlow : public FlowMixin<AndNotFlow> {
private:
double _flow;
- size_t _cnt;
+ bool _strict;
+ bool _first;
public:
- AndNotFlow(double in = 1.0) noexcept : _flow(in), _cnt(0) {}
+ AndNotFlow(double in, bool strict) noexcept
+ : _flow(in), _strict(strict), _first(true) {}
void add(double est) noexcept {
- _flow *= (_cnt++ == 0) ? est : (1.0 - est);
+ _flow *= _first ? est : (1.0 - est);
+ _first = false;
}
double flow() const noexcept {
return _flow;
}
+ bool strict() const noexcept {
+ return _strict && _first;
+ }
double estimate() const noexcept {
- return (_cnt > 0) ? _flow : 0.0;
+ return _first ? 0.0 : _flow;
+ }
+ static void sort(auto adapter, auto &children, bool) {
+ flow::sort_partial<flow::MinOrCost>(adapter, children, 1);
+ }
+ // TODO: add strict
+ static void sort(auto &children) {
+ sort(flow::DefaultAdapter(), children, false);
}
};
diff --git a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
index bebc1f433f7..e60fe3d3f85 100644
--- a/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
+++ b/searchlib/src/vespa/searchlib/queryeval/intermediate_blueprints.cpp
@@ -89,13 +89,13 @@ need_normal_features_for_children(const IntermediateBlueprint &blueprint, fef::M
double
AndNotBlueprint::calculate_cost() const
{
- return cost_of(get_children(), AndNotFlow());
+ return AndNotFlow::cost_of(get_children());
}
double
AndNotBlueprint::calculate_relative_estimate() const
{
- return estimate_of(get_children(), AndNotFlow());
+ return AndNotFlow::estimate_of(get_children());
}
Blueprint::HitEstimate
@@ -168,10 +168,10 @@ AndNotBlueprint::get_replacement()
void
AndNotBlueprint::sort(Children &children, bool sort_by_cost) const
{
- if (children.size() > 2) {
- if (sort_by_cost) {
- std::sort(children.begin() + 1, children.end(), MinimalOrCost());
- } else {
+ if (sort_by_cost) {
+ AndNotFlow::sort(children);
+ } else {
+ if (children.size() > 2) {
std::sort(children.begin() + 1, children.end(), TieredGreaterEstimate());
}
}
@@ -214,12 +214,12 @@ AndNotBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) co
double
AndBlueprint::calculate_cost() const {
- return cost_of(get_children(), AndFlow());
+ return AndFlow::cost_of(get_children());
}
double
AndBlueprint::calculate_relative_estimate() const {
- return estimate_of(get_children(), AndFlow());
+ return AndFlow::estimate_of(get_children());
}
Blueprint::HitEstimate
@@ -265,7 +265,7 @@ void
AndBlueprint::sort(Children &children, bool sort_by_cost) const
{
if (sort_by_cost) {
- std::sort(children.begin(), children.end(), MinimalAndCost());
+ AndFlow::sort(children);
} else {
std::sort(children.begin(), children.end(), TieredLessEstimate());
}
@@ -323,12 +323,12 @@ OrBlueprint::~OrBlueprint() = default;
double
OrBlueprint::calculate_cost() const {
- return cost_of(get_children(), OrFlow());
+ return OrFlow::cost_of(get_children());
}
double
OrBlueprint::calculate_relative_estimate() const {
- return estimate_of(get_children(), OrFlow());
+ return OrFlow::estimate_of(get_children());
}
Blueprint::HitEstimate
@@ -376,7 +376,7 @@ void
OrBlueprint::sort(Children &children, bool sort_by_cost) const
{
if (sort_by_cost) {
- std::sort(children.begin(), children.end(), MinimalOrCost());
+ OrFlow::sort(children);
} else {
std::sort(children.begin(), children.end(), TieredGreaterEstimate());
}
@@ -428,12 +428,12 @@ WeakAndBlueprint::~WeakAndBlueprint() = default;
double
WeakAndBlueprint::calculate_cost() const {
- return cost_of(get_children(), OrFlow());
+ return OrFlow::cost_of(get_children());
}
double
WeakAndBlueprint::calculate_relative_estimate() const {
- double child_est = estimate_of(get_children(), OrFlow());
+ double child_est = OrFlow::estimate_of(get_children());
double my_est = abs_to_rel_est(_n, get_docid_limit());
return std::min(my_est, child_est);
}
@@ -499,12 +499,12 @@ WeakAndBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) c
double
NearBlueprint::calculate_cost() const {
- return cost_of(get_children(), AndFlow()) + childCnt() * 1.0;
+ return AndFlow::cost_of(get_children()) + childCnt() * 1.0;
}
double
NearBlueprint::calculate_relative_estimate() const {
- return estimate_of(get_children(), AndFlow());
+ return AndFlow::estimate_of(get_children());
}
Blueprint::HitEstimate
@@ -523,7 +523,7 @@ void
NearBlueprint::sort(Children &children, bool sort_by_cost) const
{
if (sort_by_cost) {
- std::sort(children.begin(), children.end(), MinimalAndCost());
+ AndFlow::sort(children);
} else {
std::sort(children.begin(), children.end(), TieredLessEstimate());
}
@@ -566,12 +566,12 @@ NearBlueprint::createFilterSearch(bool strict, FilterConstraint constraint) cons
double
ONearBlueprint::calculate_cost() const {
- return cost_of(get_children(), AndFlow()) + (childCnt() * 1.0);
+ return AndFlow::cost_of(get_children()) + (childCnt() * 1.0);
}
double
ONearBlueprint::calculate_relative_estimate() const {
- return estimate_of(get_children(), AndFlow());
+ return AndFlow::estimate_of(get_children());
}
Blueprint::HitEstimate
@@ -741,7 +741,7 @@ SourceBlenderBlueprint::calculate_cost() const {
double
SourceBlenderBlueprint::calculate_relative_estimate() const {
- return estimate_of(get_children(), OrFlow());
+ return OrFlow::estimate_of(get_children());
}
Blueprint::HitEstimate
diff --git a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp
index 6474a449272..095141c0359 100644
--- a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp
+++ b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp
@@ -3,6 +3,7 @@
#include "matching_elements_filler.h"
#include <vespa/searchlib/common/matching_elements.h>
#include <vespa/searchlib/common/matching_elements_fields.h>
+#include <vespa/searchlib/query/streaming/weighted_set_term.h>
#include <vespa/vsm/searcher/fieldsearcher.h>
#include <vespa/vdslib/container/searchresult.h>
#include "hitcollector.h"
@@ -17,6 +18,7 @@ using search::streaming::QueryConnector;
using search::streaming::QueryNode;
using search::streaming::QueryTerm;
using search::streaming::SameElementQueryNode;
+using search::streaming::WeightedSetTerm;
using vdslib::SearchResult;
using vsm::FieldIdTSearcherMap;
using vsm::StorageDocument;
@@ -79,6 +81,13 @@ Matcher::select_query_nodes(const MatchingElementsFields& fields, const QueryNod
if (fields.has_field(same_element->getIndex())) {
_same_element_nodes.emplace_back(same_element);
}
+ } else if (auto weighted_set_term = as<WeightedSetTerm>(query_node)) {
+ if (fields.has_field(weighted_set_term->getIndex())) {
+ auto &terms = weighted_set_term->get_terms();
+ for (auto& term : terms) {
+ _sub_field_terms.emplace_back(weighted_set_term->getIndex(), term.get());
+ }
+ }
} else if (auto query_term = as<QueryTerm>(query_node)) {
if (fields.has_struct_field(query_term->getIndex())) {
_sub_field_terms.emplace_back(fields.get_enclosing_field(query_term->getIndex()), query_term);
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/condition/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/condition/package-info.java
index ed1a075f9d2..7920928017b 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/condition/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/condition/package-info.java
@@ -2,7 +2,7 @@
/**
* @author bjorncs
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api.condition;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/package-info.java
index a2a9eab70e0..e3cff292714 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/package-info.java
@@ -2,7 +2,7 @@
/**
* @author bjorncs
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api.extension;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/support/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/support/package-info.java
index f3271fd9c22..57724e66600 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/support/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/extension/support/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api.extension.support;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/function/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/function/package-info.java
index 9e43f885f47..ec9b4a8a195 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/function/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/function/package-info.java
@@ -2,7 +2,7 @@
/**
* @author bjorncs
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api.function;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/io/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/io/package-info.java
index 685044e2ba5..daeba215701 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/io/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/io/package-info.java
@@ -2,7 +2,7 @@
/**
* @author bjorncs
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api.io;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/package-info.java
index 1bf0613132d..d9bf4f0316e 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/package-info.java
@@ -2,7 +2,7 @@
/**
* @author bjorncs
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/jupiter/api/parallel/package-info.java b/tenant-cd-api/src/main/java/org/junit/jupiter/api/parallel/package-info.java
index 1f67cbf96a5..c31977ac22f 100644
--- a/tenant-cd-api/src/main/java/org/junit/jupiter/api/parallel/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/jupiter/api/parallel/package-info.java
@@ -2,7 +2,7 @@
/**
* @author bjorncs
*/
-@ExportPackage(version = @Version(major = 5, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 5, minor = 10, micro = 1))
package org.junit.jupiter.api.parallel;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/platform/commons/annotation/package-info.java b/tenant-cd-api/src/main/java/org/junit/platform/commons/annotation/package-info.java
index bf69bc87903..87ae7c25bb1 100644
--- a/tenant-cd-api/src/main/java/org/junit/platform/commons/annotation/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/platform/commons/annotation/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 1, minor = 10, micro = 1))
package org.junit.platform.commons.annotation;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/platform/commons/function/package-info.java b/tenant-cd-api/src/main/java/org/junit/platform/commons/function/package-info.java
index c1020a3a364..7ca49947df6 100644
--- a/tenant-cd-api/src/main/java/org/junit/platform/commons/function/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/platform/commons/function/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 1, minor = 10, micro = 1))
package org.junit.platform.commons.function;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/platform/commons/logging/package-info.java b/tenant-cd-api/src/main/java/org/junit/platform/commons/logging/package-info.java
index f56cc14314e..0c8e124bb60 100644
--- a/tenant-cd-api/src/main/java/org/junit/platform/commons/logging/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/platform/commons/logging/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 1, minor = 10, micro = 1))
package org.junit.platform.commons.logging;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/platform/commons/package-info.java b/tenant-cd-api/src/main/java/org/junit/platform/commons/package-info.java
index 60ba2abbc54..a2ec3831534 100644
--- a/tenant-cd-api/src/main/java/org/junit/platform/commons/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/platform/commons/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 1, minor = 10, micro = 1))
package org.junit.platform.commons;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/platform/commons/support/package-info.java b/tenant-cd-api/src/main/java/org/junit/platform/commons/support/package-info.java
index 772a79e40f2..51b1df85173 100644
--- a/tenant-cd-api/src/main/java/org/junit/platform/commons/support/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/platform/commons/support/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 1, minor = 10, micro = 1))
package org.junit.platform.commons.support;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/junit/platform/commons/util/package-info.java b/tenant-cd-api/src/main/java/org/junit/platform/commons/util/package-info.java
index 5c11fbbb5e4..c30a31377c4 100644
--- a/tenant-cd-api/src/main/java/org/junit/platform/commons/util/package-info.java
+++ b/tenant-cd-api/src/main/java/org/junit/platform/commons/util/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 8, micro = 1))
+@ExportPackage(version = @Version(major = 1, minor = 10, micro = 1))
package org.junit.platform.commons.util;
import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/tenant-cd-api/src/main/java/org/opentest4j/package-info.java b/tenant-cd-api/src/main/java/org/opentest4j/package-info.java
index b5a3619017d..f0327bcef6f 100644
--- a/tenant-cd-api/src/main/java/org/opentest4j/package-info.java
+++ b/tenant-cd-api/src/main/java/org/opentest4j/package-info.java
@@ -2,7 +2,7 @@
/**
* @author jonmv
*/
-@ExportPackage(version = @Version(major = 1, minor = 2, micro = 0))
+@ExportPackage(version = @Version(major = 1, minor = 3, micro = 0))
package org.opentest4j;
import com.yahoo.osgi.annotation.ExportPackage;