Skip to content

Commit 6439422

Browse files
committed
Register dense vector field type
1 parent f83ca0c commit 6439422

File tree

9 files changed

+33
-9
lines changed

9 files changed

+33
-9
lines changed

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ public class EsqlCorePlugin extends Plugin implements ExtensiblePlugin {
1515

1616
public static final FeatureFlag SEMANTIC_TEXT_FEATURE_FLAG = new FeatureFlag("esql_semantic_text");
1717
public static final FeatureFlag AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG = new FeatureFlag("esql_aggregate_metric_double");
18+
public static final FeatureFlag DENSE_VECTOR_FEATURE_FLAG = new FeatureFlag("esql_dense_vector");
1819
}

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,13 @@ public enum DataType {
309309
*/
310310
SEMANTIC_TEXT(builder().esType("semantic_text").unknownSize()),
311311

312-
AGGREGATE_METRIC_DOUBLE(builder().esType("aggregate_metric_double").estimatedSize(Double.BYTES * 3 + Integer.BYTES));
312+
AGGREGATE_METRIC_DOUBLE(builder().esType("aggregate_metric_double").estimatedSize(Double.BYTES * 3 + Integer.BYTES)),
313+
314+
/**
315+
* Fields with this type are dense vectors, represented as an array of double values.
316+
*/
317+
DENSE_VECTOR(builder().esType("dense_vector").unknownSize());
318+
313319

314320
/**
315321
* Types that are actively being built. These types are not returned
@@ -319,7 +325,8 @@ public enum DataType {
319325
*/
320326
public static final Map<DataType, FeatureFlag> UNDER_CONSTRUCTION = Map.ofEntries(
321327
Map.entry(SEMANTIC_TEXT, EsqlCorePlugin.SEMANTIC_TEXT_FEATURE_FLAG),
322-
Map.entry(AGGREGATE_METRIC_DOUBLE, EsqlCorePlugin.AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG)
328+
Map.entry(AGGREGATE_METRIC_DOUBLE, EsqlCorePlugin.AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG),
329+
Map.entry(DENSE_VECTOR, EsqlCorePlugin.DENSE_VECTOR_FEATURE_FLAG)
323330
);
324331

325332
private final String typeName;

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
import static org.elasticsearch.test.ESTestCase.assertEquals;
122122
import static org.elasticsearch.test.ESTestCase.between;
123123
import static org.elasticsearch.test.ESTestCase.randomAlphaOfLength;
124+
import static org.elasticsearch.test.ESTestCase.randomArray;
124125
import static org.elasticsearch.test.ESTestCase.randomBoolean;
125126
import static org.elasticsearch.test.ESTestCase.randomByte;
126127
import static org.elasticsearch.test.ESTestCase.randomDouble;
@@ -805,6 +806,8 @@ public static Literal randomLiteral(DataType type) {
805806
throw new UncheckedIOException(e);
806807
}
807808
}
809+
// TODO Need to get the dimensions
810+
case DENSE_VECTOR -> randomArray(10, 10, i -> new Float[10], ESTestCase::randomFloat);
808811
case UNSUPPORTED, OBJECT, DOC_DATA_TYPE, TSID_DATA_TYPE, PARTIAL_AGG -> throw new IllegalArgumentException(
809812
"can't make random values for [" + type.typeName() + "]"
810813
);

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,12 @@ public enum Cap {
912912
/**
913913
* The metrics command
914914
*/
915-
METRICS_COMMAND(Build.current().isSnapshot());
915+
METRICS_COMMAND(Build.current().isSnapshot()),
916+
917+
/**
918+
* Dense vector field type support
919+
*/
920+
DENSE_VECTOR_FIELD_TYPE(EsqlCorePlugin.DENSE_VECTOR_FEATURE_FLAG);
916921

917922
private final boolean enabled;
918923

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/PositionToXContent.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.elasticsearch.compute.data.BytesRefBlock;
1616
import org.elasticsearch.compute.data.CompositeBlock;
1717
import org.elasticsearch.compute.data.DoubleBlock;
18+
import org.elasticsearch.compute.data.FloatBlock;
1819
import org.elasticsearch.compute.data.IntBlock;
1920
import org.elasticsearch.compute.data.LongBlock;
2021
import org.elasticsearch.xcontent.ToXContent;
@@ -182,6 +183,13 @@ protected XContentBuilder valueToXContent(XContentBuilder builder, ToXContent.Pa
182183
}
183184
}
184185
};
186+
case DENSE_VECTOR -> new PositionToXContent(block) {
187+
@Override
188+
protected XContentBuilder valueToXContent(XContentBuilder builder, ToXContent.Params params, int valueIndex)
189+
throws IOException {
190+
return builder.value(((FloatBlock) block).getFloat(valueIndex));
191+
}
192+
};
185193
case DATE_PERIOD, TIME_DURATION, DOC_DATA_TYPE, TSID_DATA_TYPE, SHORT, BYTE, OBJECT, FLOAT, HALF_FLOAT, SCALED_FLOAT,
186194
PARTIAL_AGG -> throw new IllegalArgumentException("can't convert values of type [" + columnInfo.type() + "]");
187195
};

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/ResponseValueUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private static Object valueAt(DataType dataType, Block block, int offset, BytesR
115115
case UNSIGNED_LONG -> unsignedLongAsNumber(((LongBlock) block).getLong(offset));
116116
case LONG, COUNTER_LONG -> ((LongBlock) block).getLong(offset);
117117
case INTEGER, COUNTER_INTEGER -> ((IntBlock) block).getInt(offset);
118-
case DOUBLE, COUNTER_DOUBLE -> ((DoubleBlock) block).getDouble(offset);
118+
case DOUBLE, COUNTER_DOUBLE, DENSE_VECTOR -> ((DoubleBlock) block).getDouble(offset);
119119
case KEYWORD, SEMANTIC_TEXT, TEXT -> ((BytesRefBlock) block).getBytesRef(offset, scratch).utf8ToString();
120120
case IP -> {
121121
BytesRef val = ((BytesRefBlock) block).getBytesRef(offset, scratch);

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/nulls/Coalesce.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public ExpressionEvaluator.Factory toEvaluator(ToEvaluator toEvaluator) {
210210
CoalesceBytesRefEvaluator.toEvaluator(toEvaluator, children());
211211
case NULL -> EvalOperator.CONSTANT_NULL_FACTORY;
212212
case UNSUPPORTED, SHORT, BYTE, DATE_PERIOD, OBJECT, DOC_DATA_TYPE, SOURCE, TIME_DURATION, FLOAT, HALF_FLOAT, TSID_DATA_TYPE,
213-
SCALED_FLOAT, PARTIAL_AGG, AGGREGATE_METRIC_DOUBLE -> throw new UnsupportedOperationException(
213+
SCALED_FLOAT, PARTIAL_AGG, AGGREGATE_METRIC_DOUBLE, DENSE_VECTOR -> throw new UnsupportedOperationException(
214214
dataType() + " can’t be coalesced"
215215
);
216216
};

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,9 @@ private PhysicalOperation planTopN(TopNExec topNExec, LocalExecutionPlannerConte
416416
case TEXT, KEYWORD, SEMANTIC_TEXT -> TopNEncoder.UTF8;
417417
case VERSION -> TopNEncoder.VERSION;
418418
case BOOLEAN, NULL, BYTE, SHORT, INTEGER, LONG, DOUBLE, FLOAT, HALF_FLOAT, DATETIME, DATE_NANOS, DATE_PERIOD, TIME_DURATION,
419-
OBJECT, SCALED_FLOAT, UNSIGNED_LONG, DOC_DATA_TYPE, TSID_DATA_TYPE -> TopNEncoder.DEFAULT_SORTABLE;
420-
case GEO_POINT, CARTESIAN_POINT, GEO_SHAPE, CARTESIAN_SHAPE, COUNTER_LONG, COUNTER_INTEGER, COUNTER_DOUBLE, SOURCE ->
421-
TopNEncoder.DEFAULT_UNSORTABLE;
419+
OBJECT, SCALED_FLOAT, UNSIGNED_LONG, DOC_DATA_TYPE, TSID_DATA_TYPE -> TopNEncoder.DEFAULT_SORTABLE;
420+
case GEO_POINT, CARTESIAN_POINT, GEO_SHAPE, CARTESIAN_SHAPE, COUNTER_LONG, COUNTER_INTEGER, COUNTER_DOUBLE, SOURCE,
421+
DENSE_VECTOR -> TopNEncoder.DEFAULT_UNSORTABLE;
422422
// unsupported fields are encoded as BytesRef, we'll use the same encoder; all values should be null at this point
423423
case PARTIAL_AGG, UNSUPPORTED, AGGREGATE_METRIC_DOUBLE -> TopNEncoder.UNSUPPORTED;
424424
};

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/PlannerUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ public static ElementType toElementType(DataType dataType, MappedFieldType.Field
256256
return switch (dataType) {
257257
case LONG, DATETIME, DATE_NANOS, UNSIGNED_LONG, COUNTER_LONG -> ElementType.LONG;
258258
case INTEGER, COUNTER_INTEGER -> ElementType.INT;
259-
case DOUBLE, COUNTER_DOUBLE -> ElementType.DOUBLE;
259+
case DOUBLE, COUNTER_DOUBLE, DENSE_VECTOR -> ElementType.DOUBLE;
260260
// unsupported fields are passed through as a BytesRef
261261
case KEYWORD, TEXT, IP, SOURCE, VERSION, SEMANTIC_TEXT, UNSUPPORTED -> ElementType.BYTES_REF;
262262
case NULL -> ElementType.NULL;

0 commit comments

Comments
 (0)