Skip to content

Commit f13590d

Browse files
committed
Esql resultset dense vector (#1208)
* make result set support dense vector * improve test
1 parent b4d5af8 commit f13590d

4 files changed

Lines changed: 57 additions & 8 deletions

File tree

java-client/src/main/java/co/elastic/clients/elasticsearch/_helpers/esql/jdbc/EsType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ enum EsType implements SQLType {
6161
GEO_SHAPE(ExtraTypes.GEOMETRY),
6262
SHAPE(ExtraTypes.GEOMETRY),
6363
UNSIGNED_LONG(Types.NUMERIC),
64-
VERSION(Types.VARCHAR);
64+
VERSION(Types.VARCHAR),
65+
DENSE_VECTOR(Types.ARRAY);
6566

6667
private final Integer type;
6768

java-client/src/main/java/co/elastic/clients/elasticsearch/_helpers/esql/jdbc/TypeConverter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ static Object convert(Object v, EsType columnType, String typeString) throws SQL
211211
case BOOLEAN:
212212
case TEXT:
213213
case KEYWORD:
214+
case DENSE_VECTOR:
214215
return v; // These types are already represented correctly in JSON
215216
case BYTE:
216217
return ((Number) v).byteValue(); // Parser might return it as integer or long - need to update to the correct type

java-client/src/main/java/co/elastic/clients/elasticsearch/_helpers/esql/jdbc/TypeUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.EnumSet;
3232
import java.util.GregorianCalendar;
3333
import java.util.LinkedHashMap;
34+
import java.util.List;
3435
import java.util.Locale;
3536
import java.util.Map;
3637
import java.util.Set;
@@ -117,6 +118,7 @@ private TypeUtils() {}
117118
types.put(EsType.GEO_POINT, String.class);
118119
types.put(EsType.GEO_SHAPE, String.class);
119120
types.put(EsType.SHAPE, String.class);
121+
types.put(EsType.DENSE_VECTOR, List.class);
120122

121123
TYPE_TO_CLASS = unmodifiableMap(types);
122124

java-client/src/test/java/co/elastic/clients/elasticsearch/_helpers/esql/EsqlAdapterTest.java

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@
2222
import co.elastic.clients.elasticsearch.ElasticsearchClient;
2323
import co.elastic.clients.elasticsearch._helpers.esql.jdbc.ResultSetEsqlAdapter;
2424
import co.elastic.clients.elasticsearch._helpers.esql.objects.ObjectsEsqlAdapter;
25-
import co.elastic.clients.elasticsearch.esql.query.EsqlFormat;
2625
import co.elastic.clients.json.JsonpMappingException;
2726
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
2827
import co.elastic.clients.testkit.MockHttpClient;
29-
import co.elastic.clients.transport.endpoints.BinaryResponse;
3028
import org.junit.jupiter.api.Assertions;
3129
import org.junit.jupiter.api.Test;
3230

3331
import java.io.IOException;
3432
import java.sql.ResultSet;
33+
import java.sql.SQLException;
3534
import java.sql.Types;
35+
import java.util.List;
3636

3737
public class EsqlAdapterTest extends Assertions {
3838

@@ -118,11 +118,6 @@ public void testProfilingInfo() throws IOException {
118118
@Test
119119
public void testObjectDeserializer() throws IOException {
120120

121-
BinaryResponse response = esClient.esql().query(q -> q
122-
.query("FROM foo")
123-
.format(EsqlFormat.Json)
124-
);
125-
126121
Iterable<Data> data = esClient.esql().query(
127122
new ObjectsEsqlAdapter<>(Data.class),
128123
"FROM employees | STATS avg_salary = AVG(salary) by country"
@@ -149,4 +144,54 @@ public void testResultSetAdapter() throws Exception {
149144
System.out.println(resultSet.getDouble("avg_salary") + " " + resultSet.getString(2));
150145
}
151146
}
147+
148+
@Test
149+
public void testDenseVector() throws IOException, SQLException {
150+
151+
String jsonEmbeddings = "{\n" +
152+
" \"took\": 8,\n" +
153+
" \"is_partial\": false,\n" +
154+
" \"completion_time_in_millis\": 1776348683193,\n" +
155+
" \"documents_found\": 1,\n" +
156+
" \"values_loaded\": 252725,\n" +
157+
" \"start_time_in_millis\": 1776348683185,\n" +
158+
" \"expiration_time_in_millis\": 1776780683134,\n" +
159+
" \"columns\": [\n" +
160+
" {\n" +
161+
" \"name\": \"content\",\n" +
162+
" \"type\": \"text\"\n" +
163+
" },\n" +
164+
" {\n" +
165+
" \"name\": \"content.keyword\",\n" +
166+
" \"type\": \"keyword\"\n" +
167+
" },\n" +
168+
" {\n" +
169+
" \"name\": \"embedding\",\n" +
170+
" \"type\": \"dense_vector\"\n" +
171+
" }\n" +
172+
" ],\n" +
173+
" \"values\": [\n" +
174+
"[\"some text\",\"id\",[0.1,0.2,0.3]]\n" +
175+
"]\n" +
176+
"}";
177+
178+
ElasticsearchClient esClient = new MockHttpClient()
179+
.add("/_query", "application/json", jsonEmbeddings)
180+
.client(new JacksonJsonpMapper());
181+
182+
ResultSet resultSet = esClient.esql().query(
183+
ResultSetEsqlAdapter.INSTANCE,
184+
"FROM embeddings");
185+
186+
assertEquals(3, resultSet.getMetaData().getColumnCount());
187+
assertEquals(Types.VARCHAR, resultSet.getMetaData().getColumnType(1));
188+
assertEquals(Types.VARCHAR, resultSet.getMetaData().getColumnType(2));
189+
assertEquals(Types.ARRAY, resultSet.getMetaData().getColumnType(3));
190+
191+
while (resultSet.next()) {
192+
List vec = resultSet.getObject("embedding", List.class);
193+
assertEquals(3,vec.size());
194+
System.out.println(resultSet.getString("embedding"));
195+
}
196+
}
152197
}

0 commit comments

Comments
 (0)