You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by al...@apache.org on 2026/09/29 22:09:27 UTC
(asterixdb) branch master updated: [ASTERIXDB-3817][COMP] Reject num_clusters with train_list_fraction
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git
The following commit(s) were added to refs/heads/master by this push:
new 82f583242b [ASTERIXDB-3817][COMP] Reject num_clusters with train_list_fraction
82f583242b is described below
commit 82f583242b19c431c05683485b9b677b9a9f45ac
Author: Le0shy <le...@gmail.com>
AuthorDate: Tue Sep 22 13:58:51 2026 -0700
[ASTERIXDB-3817][COMP] Reject num_clusters with train_list_fraction
- user model changes: yes
- storage format changes: no
- interface changes: no
Details:
The training list of a vector index is sized from its cluster count, so
the two WITH knobs are one decision: a stated fraction next to a stated
count either restates the derived size or contradicts it.
VTreeParamsInference already documents that the two cannot both be set,
but nothing enforced it. The WITH clause validator now rejects the pair
before any cardinality is consulted.
The tests that stated both kept the cluster count: on small data the
training list is the whole partition whatever the count, so the build
and the persisted record are unchanged. The train-list-too-small case is
the exception, since a fraction alone can only fall short of the derived
cluster count on a collection large enough to derive several, so it now
generates one.
Ext-ref: MB-73194
Generated-by: Claude Fable 5.1 <no...@anthropic.com>
Change-Id: Ie3af0bae4580cebafbc5e1dca52eaf9c4b242d45
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/21868
Reviewed-by: Ali Alsuliman <al...@gmail.com>
Reviewed-by: Hongyu Shi <le...@gmail.com>
Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
---
.../vector-advise-existing.4.ddl.sqlpp | 2 +-
.../runtimets/queries_sqlpp/vector/VectorQueries.xml | 8 +++++++-
.../create-index-vtree-both-knobs.01.ddl.sqlpp} | 5 ++---
.../create-index-vtree-both-knobs.02.update.sqlpp} | 0
.../create-index-vtree-both-knobs.03.ddl.sqlpp} | 8 ++------
.../create-index-vtree-both-knobs.04.ddl.sqlpp} | 3 ++-
.../create-index-vtree-both-knobs.99.ddl.sqlpp} | 7 +------
.../create-index-vtree-composite-pk.4.ddl.sqlpp | 2 +-
.../create-index-vtree-dimension-mismatch.4.ddl.sqlpp | 2 +-
.../create-index-vtree-glove.4.ddl.sqlpp | 2 +-
.../create-index-vtree-include-filter-multi.4.ddl.sqlpp | 2 +-
.../create-index-vtree-include-filter.4.ddl.sqlpp | 2 +-
.../create-index-vtree-include-nested.4.ddl.sqlpp | 2 +-
.../create-index-vtree-include-open-nested.4.ddl.sqlpp | 2 +-
.../create-index-vtree-include-typed.4.ddl.sqlpp | 2 +-
.../create-index-vtree-meta-include.4.ddl.sqlpp | 2 +-
.../create-index-vtree-meta-pk.4.ddl.sqlpp | 2 +-
.../create-index-vtree-metadata.4.ddl.sqlpp | 4 ++--
.../create-index-vtree-metadata.7.ddl.sqlpp | 2 +-
.../create-index-vtree-movie.4.ddl.sqlpp | 2 +-
.../create-index-vtree-nested.4.ddl.sqlpp | 2 +-
.../create-index-vtree-no-type.04.ddl.sqlpp | 2 +-
.../create-index-vtree-null-embedding.04.ddl.sqlpp | 2 +-
.../create-index-vtree-open-undeclared.4.ddl.sqlpp | 2 +-
.../create-index-vtree-similarity-normalize.4.ddl.sqlpp | 2 +-
.../create-index-vtree-train-list-too-small.01.ddl.sqlpp | 5 ++---
.../create-index-vtree-train-list-too-small.02.update.sqlpp | 8 ++++++++
.../create-index-vtree-train-list-too-small.04.ddl.sqlpp | 8 ++++----
.../create-index-vtree/create-index-vtree.4.ddl.sqlpp | 2 +-
.../vtree-dml-composite-pk.04.ddl.sqlpp | 2 +-
.../vtree-dml-dimension-mismatch.04.ddl.sqlpp | 2 +-
.../vtree-dml-unusable-embedding.04.ddl.sqlpp | 2 +-
.../vtree-include-unknown.04.ddl.sqlpp | 2 +-
.../vector/vtree-scan-choice/vtree-scan-choice.4.ddl.sqlpp | 2 +-
.../vtree-unnest-not-indexable.4.ddl.sqlpp | 2 +-
.../asterix/lang/common/util/VectorIndexDeclUtil.java | 13 +++++++++++++
36 files changed, 68 insertions(+), 51 deletions(-)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp
index 9b3402ece4..4ff1d6b28e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp
@@ -22,4 +22,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/VectorQueries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/VectorQueries.xml
index e9350e2207..a42a85d005 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/VectorQueries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/VectorQueries.xml
@@ -120,7 +120,13 @@
<test-case FilePath="vector">
<compilation-unit name="create-index-vtree-train-list-too-small">
<output-dir compare="Text">create-index-vtree-train-list-too-small</output-dir>
- <expected-error>fewer than the 2 clusters to be built</expected-error>
+ <expected-error>clusters to be built. Raise it to at least</expected-error>
+ </compilation-unit>
+ </test-case>
+ <test-case FilePath="vector">
+ <compilation-unit name="create-index-vtree-both-knobs">
+ <output-dir compare="Text">create-index-vtree-both-knobs</output-dir>
+ <expected-error>cannot both be set</expected-error>
</compilation-unit>
</test-case>
<test-case FilePath="vector">
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.01.ddl.sqlpp
similarity index 79%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.01.ddl.sqlpp
index 2497935a12..d32729d9aa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.01.ddl.sqlpp
@@ -16,9 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/
-// TYPE VTREE is optional when the indexed field carries the VECTOR annotation: no other index type
-// accepts one, so the annotation alone determines the type. Everything below is deliberately the
-// same shape as create-index-vtree, minus the TYPE clause.
+// num_clusters and train_list_fraction stated together are rejected at DDL time, before the
+// cardinality is consulted. Same collection shape as create-index-vtree.
DROP DATAVERSE test IF EXISTS;
CREATE DATAVERSE test;
USE test;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.02.update.sqlpp
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.02.update.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.02.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.03.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.03.ddl.sqlpp
index 024a8308e0..b63fc7af98 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.03.ddl.sqlpp
@@ -16,9 +16,5 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-USE test;
-CREATE INDEX idx_emb
- ON Movies(embedding VECTOR)
- TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+// A sample index is required before creating a vector index (quantization training scans it).
+ANALYZE DATASET test.MovieSmall WITH {"sample-seed": 1000};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.04.ddl.sqlpp
similarity index 84%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.04.ddl.sqlpp
index 9b3402ece4..6f62098077 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cbo-join/index-advisor/vector-advise-existing/vector-advise-existing.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.04.ddl.sqlpp
@@ -16,9 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-
USE test;
+// The training list is sized from the cluster count, so the two knobs are one decision and stating
+// both is rejected before any cardinality is consulted. Each value is legal on its own.
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.99.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.99.ddl.sqlpp
index 024a8308e0..d240ef212d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-both-knobs/create-index-vtree-both-knobs.99.ddl.sqlpp
@@ -16,9 +16,4 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-USE test;
-CREATE INDEX idx_emb
- ON Movies(embedding VECTOR)
- TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+DROP DATAVERSE test IF EXISTS;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-composite-pk/create-index-vtree-composite-pk.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-composite-pk/create-index-vtree-composite-pk.4.ddl.sqlpp
index da946b996f..bf6ad6d87f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-composite-pk/create-index-vtree-composite-pk.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-composite-pk/create-index-vtree-composite-pk.4.ddl.sqlpp
@@ -22,4 +22,4 @@ USE testcpk;
CREATE INDEX idx_cpk_emb
ON MovieCpk(embedding VECTOR) INCLUDE (year)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-dimension-mismatch/create-index-vtree-dimension-mismatch.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-dimension-mismatch/create-index-vtree-dimension-mismatch.4.ddl.sqlpp
index be86158fa8..9e37d1a46b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-dimension-mismatch/create-index-vtree-dimension-mismatch.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-dimension-mismatch/create-index-vtree-dimension-mismatch.4.ddl.sqlpp
@@ -23,4 +23,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 8, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 8, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-glove/create-index-vtree-glove.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-glove/create-index-vtree-glove.4.ddl.sqlpp
index 4be20a5830..c2c5529604 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-glove/create-index-vtree-glove.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-glove/create-index-vtree-glove.4.ddl.sqlpp
@@ -20,4 +20,4 @@
USE testg;
CREATE INDEX idx_emb ON GloveReal(embedding VECTOR) TYPE VTREE
- WITH { "dimension": 100, "similarity": "cosine", "num_clusters": 4, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 100, "similarity": "cosine", "num_clusters": 4, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter-multi/create-index-vtree-include-filter-multi.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter-multi/create-index-vtree-include-filter-multi.4.ddl.sqlpp
index 76214d4dc8..20c4e3a162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter-multi/create-index-vtree-include-filter-multi.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter-multi/create-index-vtree-include-filter-multi.4.ddl.sqlpp
@@ -22,4 +22,4 @@ CREATE INDEX idx_emb
ON MovieMulti(embedding VECTOR)
INCLUDE (year, rating, title, verified)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter/create-index-vtree-include-filter.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter/create-index-vtree-include-filter.4.ddl.sqlpp
index 6a841c2b95..c514e2aad0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter/create-index-vtree-include-filter.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-filter/create-index-vtree-include-filter.4.ddl.sqlpp
@@ -21,4 +21,4 @@ CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
INCLUDE (year)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-nested/create-index-vtree-include-nested.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-nested/create-index-vtree-include-nested.4.ddl.sqlpp
index b9d1c17f37..ca441a32b3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-nested/create-index-vtree-include-nested.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-nested/create-index-vtree-include-nested.4.ddl.sqlpp
@@ -22,4 +22,4 @@ CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
INCLUDE (info.year)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-open-nested/create-index-vtree-include-open-nested.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-open-nested/create-index-vtree-include-open-nested.4.ddl.sqlpp
index 1fe5fd4e28..a44dbc6b07 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-open-nested/create-index-vtree-include-open-nested.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-open-nested/create-index-vtree-include-open-nested.4.ddl.sqlpp
@@ -22,4 +22,4 @@ CREATE INDEX idx_emb
ON MovieNested(embedding VECTOR)
INCLUDE (info)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-typed/create-index-vtree-include-typed.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-typed/create-index-vtree-include-typed.4.ddl.sqlpp
index bd53765921..737480cdca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-typed/create-index-vtree-include-typed.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-include-typed/create-index-vtree-include-typed.4.ddl.sqlpp
@@ -24,4 +24,4 @@ CREATE INDEX idx_emb
ON MovieOpen(embedding VECTOR)
INCLUDE (year: int)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-include/create-index-vtree-meta-include.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-include/create-index-vtree-meta-include.4.ddl.sqlpp
index 4fe80a8b1e..185b266160 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-include/create-index-vtree-meta-include.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-include/create-index-vtree-meta-include.4.ddl.sqlpp
@@ -22,4 +22,4 @@ CREATE INDEX idx_emb
ON VecMeta(embedding VECTOR)
INCLUDE (id)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-pk/create-index-vtree-meta-pk.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-pk/create-index-vtree-meta-pk.4.ddl.sqlpp
index 4b756ee8d0..bbeb872e8d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-pk/create-index-vtree-meta-pk.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-meta-pk/create-index-vtree-meta-pk.4.ddl.sqlpp
@@ -22,4 +22,4 @@ USE test;
CREATE INDEX idx_emb
ON VecMeta(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.4.ddl.sqlpp
index f33f92a000..4856ad6ba9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.4.ddl.sqlpp
@@ -21,7 +21,8 @@ USE test;
// Every WITH parameter is given a non-default value, and one INCLUDE path is nested, so the
// expected record below shows the actual persisted value of each rather than a default that
-// would also be produced by dropping the field.
+// would also be produced by dropping the field. train_list_fraction is the exception: it cannot
+// be stated alongside num_clusters, so the record shows the value derived from the cluster count.
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
INCLUDE (title, info.year)
@@ -31,7 +32,6 @@ CREATE INDEX idx_emb
"similarity": "cosine",
"quantization": "SQ4",
"num_clusters": 2,
- "train_list_fraction": 1.0,
"seed": 42,
"epsilon": 0.5,
"cross_pollination_m": 3,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.7.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.7.ddl.sqlpp
index 36fb7baf79..9692b0ea1d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.7.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-metadata/create-index-vtree-metadata.7.ddl.sqlpp
@@ -24,4 +24,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-movie/create-index-vtree-movie.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-movie/create-index-vtree-movie.4.ddl.sqlpp
index b724a0f013..78484c413f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-movie/create-index-vtree-movie.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-movie/create-index-vtree-movie.4.ddl.sqlpp
@@ -20,4 +20,4 @@
USE testm;
CREATE INDEX idx_emb ON MovieReal(embedding VECTOR) TYPE VTREE
- WITH { "dimension": 384, "similarity": "l2_squared", "num_clusters": 4, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 384, "similarity": "l2_squared", "num_clusters": 4, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-nested/create-index-vtree-nested.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-nested/create-index-vtree-nested.4.ddl.sqlpp
index a443fdf2f0..33d651c5c1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-nested/create-index-vtree-nested.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-nested/create-index-vtree-nested.4.ddl.sqlpp
@@ -23,4 +23,4 @@ CREATE INDEX idx_emb
ON MovieNested(meta.embedding VECTOR)
INCLUDE (meta.year)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-no-type/create-index-vtree-no-type.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-no-type/create-index-vtree-no-type.04.ddl.sqlpp
index 09b0f72d98..0fd5473d20 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-no-type/create-index-vtree-no-type.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-no-type/create-index-vtree-no-type.04.ddl.sqlpp
@@ -22,4 +22,4 @@ USE test;
// INCLUDE/WITH clauses that only a vector index accepts must be honoured too.
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-null-embedding/create-index-vtree-null-embedding.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-null-embedding/create-index-vtree-null-embedding.04.ddl.sqlpp
index ec71d2b48a..3677734b6e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-null-embedding/create-index-vtree-null-embedding.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-null-embedding/create-index-vtree-null-embedding.04.ddl.sqlpp
@@ -21,4 +21,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-open-undeclared/create-index-vtree-open-undeclared.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-open-undeclared/create-index-vtree-open-undeclared.4.ddl.sqlpp
index 7ed23de5aa..ceac1c859f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-open-undeclared/create-index-vtree-open-undeclared.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-open-undeclared/create-index-vtree-open-undeclared.4.ddl.sqlpp
@@ -22,4 +22,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieOpen(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-similarity-normalize/create-index-vtree-similarity-normalize.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-similarity-normalize/create-index-vtree-similarity-normalize.4.ddl.sqlpp
index f27865c737..2ccaaae15f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-similarity-normalize/create-index-vtree-similarity-normalize.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-similarity-normalize/create-index-vtree-similarity-normalize.4.ddl.sqlpp
@@ -23,4 +23,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "L2", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "L2", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp
index 2497935a12..93973643fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.01.ddl.sqlpp
@@ -16,9 +16,8 @@
* specific language governing permissions and limitations
* under the License.
*/
-// TYPE VTREE is optional when the indexed field carries the VECTOR annotation: no other index type
-// accepts one, so the annotation alone determines the type. Everything below is deliberately the
-// same shape as create-index-vtree, minus the TYPE clause.
+// A stated train_list_fraction that leaves fewer training records per partition than the clusters
+// derived for the collection is rejected at DDL time. Same collection shape as create-index-vtree.
DROP DATAVERSE test IF EXISTS;
CREATE DATAVERSE test;
USE test;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.02.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.02.update.sqlpp
index 94517b1979..a760e63e83 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.02.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.02.update.sqlpp
@@ -52,3 +52,11 @@ INSERT INTO MovieSmall ([
{"id": 29, "embedding": [10.0, 10.0, 10.0, 1.4]},
{"id": 30, "embedding": [10.0, 10.0, 10.0, 1.5]}
]);
+
+// Enough rows that every storage partition recommends several clusters, so a fraction that
+// trains on one or two rows per partition is short of the cluster count whatever the partition
+// count is.
+INSERT INTO MovieSmall (
+ SELECT VALUE {"id": 1000 + r, "embedding": [0.0, 0.0, 0.0, r * 0.001]}
+ FROM range(1, 4000) r
+);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.04.ddl.sqlpp
index 9fa15abc71..c6ad8e0a5a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree-train-list-too-small/create-index-vtree-train-list-too-small.04.ddl.sqlpp
@@ -18,10 +18,10 @@
*/
USE test;
-// A fraction this small leaves fewer training records than clusters, so there is not even one record
-// per centroid to place. Kept at 2 clusters so the collection is never smaller than the cluster count
-// itself -- D here is 30 records spread over the suite's storage partitions, so it is single digits.
+// A fraction this small leaves fewer training records than the clusters derived for the collection,
+// so there is not even one record per centroid to place. The cluster count is left to inference:
+// stating it alongside the fraction is itself an error (create-index-vtree-both-knobs).
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 0.01, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "train_list_fraction": 0.001, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree/create-index-vtree.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree/create-index-vtree.4.ddl.sqlpp
index 9b3402ece4..4ff1d6b28e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree/create-index-vtree.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/create-index-vtree/create-index-vtree.4.ddl.sqlpp
@@ -22,4 +22,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-composite-pk/vtree-dml-composite-pk.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-composite-pk/vtree-dml-composite-pk.04.ddl.sqlpp
index 346e040b84..fe33f195b2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-composite-pk/vtree-dml-composite-pk.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-composite-pk/vtree-dml-composite-pk.04.ddl.sqlpp
@@ -20,4 +20,4 @@ USE testcpk;
CREATE INDEX idx_cpk_emb
ON MovieCpk(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-dimension-mismatch/vtree-dml-dimension-mismatch.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-dimension-mismatch/vtree-dml-dimension-mismatch.04.ddl.sqlpp
index f16b2b8ee0..38e4598746 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-dimension-mismatch/vtree-dml-dimension-mismatch.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-dimension-mismatch/vtree-dml-dimension-mismatch.04.ddl.sqlpp
@@ -20,4 +20,4 @@ USE test;
CREATE INDEX idx_emb
ON MovieSmall(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-unusable-embedding/vtree-dml-unusable-embedding.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-unusable-embedding/vtree-dml-unusable-embedding.04.ddl.sqlpp
index b6582a1c8b..7c94eb9898 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-unusable-embedding/vtree-dml-unusable-embedding.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-dml-unusable-embedding/vtree-dml-unusable-embedding.04.ddl.sqlpp
@@ -20,4 +20,4 @@ USE testue;
CREATE INDEX idx_ue
ON MovieUE(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-include-unknown/vtree-include-unknown.04.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-include-unknown/vtree-include-unknown.04.ddl.sqlpp
index d0df87b967..d4405ef51a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-include-unknown/vtree-include-unknown.04.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-include-unknown/vtree-include-unknown.04.ddl.sqlpp
@@ -20,4 +20,4 @@ USE testinc;
CREATE INDEX idx_inc
ON MovieInc(embedding VECTOR) INCLUDE (color)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-scan-choice/vtree-scan-choice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-scan-choice/vtree-scan-choice.4.ddl.sqlpp
index 328009da15..40b1319bd5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-scan-choice/vtree-scan-choice.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-scan-choice/vtree-scan-choice.4.ddl.sqlpp
@@ -24,6 +24,6 @@ CREATE INDEX idx_emb
ON Vec(embedding VECTOR)
INCLUDE (year)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
CREATE INDEX idx_cat ON Vec(category);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
index 024a8308e0..312f6cec94 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/vector/vtree-unnest-not-indexable/vtree-unnest-not-indexable.4.ddl.sqlpp
@@ -21,4 +21,4 @@ USE test;
CREATE INDEX idx_emb
ON Movies(embedding VECTOR)
TYPE VTREE
- WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "train_list_fraction": 1.0, "seed": 42 };
+ WITH { "dimension": 4, "similarity": "euclidean", "num_clusters": 2, "seed": 42 };
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VectorIndexDeclUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VectorIndexDeclUtil.java
index 8b6f96422e..940f8c1e4c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VectorIndexDeclUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/VectorIndexDeclUtil.java
@@ -99,6 +99,7 @@ public class VectorIndexDeclUtil {
}
AdmObjectNode node = ExpressionUtils.toNode(withRecord);
validateWithClauseFieldNames(node);
+ validateSizingKnobsExclusive(node);
VectorIndexParameters.Builder builder = VectorIndexParameters.builder();
builder.setDimension(validateDimension(node));
@@ -119,6 +120,18 @@ public class VectorIndexDeclUtil {
}
}
+ /**
+ * {@code num_clusters} and {@code train_list_fraction} are one decision: the training list is sized
+ * from the cluster count, so a stated fraction would either restate that size or contradict it.
+ */
+ private static void validateSizingKnobsExclusive(AdmObjectNode node) throws CompilationException {
+ if (node.get(NUM_CLUSTERS) != null && node.get(TRAIN_LIST_FRACTION) != null) {
+ throw new CompilationException(ErrorCode.COMPILATION_VECTOR_INDEX_CREATION_FAILED,
+ "`num_clusters` and `train_list_fraction` cannot both be set. Set one and the other is "
+ + "derived from it.");
+ }
+ }
+
private static void validateWithClauseFieldNames(AdmObjectNode node) throws CompilationException {
for (String name : node.getFieldNames()) {
if (!VectorIndexParameters.isKnown(name)) {