This is an automated email from the ASF dual-hosted git repository. zehnder pushed a commit to branch revert-3648-dev in repository https://gitbox.apache.org/repos/asf/streampipes.git
commit 4c37879720b308734ca3b4735c96dfd3d9dc1ac0 Author: Philipp Zehnder <[email protected]> AuthorDate: Tue Jun 10 09:31:26 2025 +0200 Revert "feat: Qdrant Sink (#3648)" This reverts commit ac4ea4dd9b314f586e7f618b15c093b00081957e. --- pom.xml | 27 +- .../streampipes-sinks-databases-jvm/pom.xml | 4 - .../jvm/DatabaseSinksExtensionModuleExport.java | 5 +- .../sinks/databases/jvm/qdrant/QdrantSink.java | 325 --------------------- .../databases/jvm/qdrant/QdrantValueFactory.java | 112 ------- .../documentation.md | 88 ------ .../icon.png | Bin 3443 -> 0 bytes .../strings.en | 43 --- 8 files changed, 5 insertions(+), 599 deletions(-) diff --git a/pom.xml b/pom.xml index 10c6fd5999..8565eb2524 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ <graalvm.js.version>23.0.0</graalvm.js.version> <gson.version>2.12.1</gson.version> <guava.version>33.4.0-jre</guava.version> - <grpc.version>1.59.1</grpc.version> + <grpc-context.version>1.59.1</grpc-context.version> <httpclient.version>4.5.13</httpclient.version> <httpcore.version>4.4.9</httpcore.version> <hadoop.version>3.4.1</hadoop.version> @@ -104,7 +104,7 @@ <micrometer-prometheus.version>1.14.3</micrometer-prometheus.version> <micrometer-observation.version>1.14.3</micrometer-observation.version> <mqtt-client.version>1.12</mqtt-client.version> - <milvus-sdk-java.version>2.5.10</milvus-sdk-java.version> + <milvus-sdk-java.version>2.5.5</milvus-sdk-java.version> <nats.version>2.19.1</nats.version> <netty.version>4.2.0.Final</netty.version> <okhttp.version>3.13.1</okhttp.version> @@ -139,7 +139,6 @@ <hawtbuf.version>1.11</hawtbuf.version> <woodstox.version>7.0.0</woodstox.version> <xz.version>1.10</xz.version> - <qdrant-java-client.version>1.14.0</qdrant-java-client.version> <!-- Test dependencies --> <junit.version>5.11.4</junit.version> @@ -287,11 +286,6 @@ <artifactId>milvus-sdk-java</artifactId> <version>${milvus-sdk-java.version}</version> </dependency> - <dependency> - <groupId>io.qdrant</groupId> - <artifactId>client</artifactId> - <version>${qdrant-java-client.version}</version> - </dependency> <dependency> <groupId>org.apache.tsfile</groupId> <artifactId>tsfile</artifactId> @@ -330,22 +324,7 @@ <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-context</artifactId> - <version>${grpc.version}</version> - </dependency> - <dependency> - <groupId>io.grpc</groupId> - <artifactId>grpc-stub</artifactId> - <version>${grpc.version}</version> - </dependency> - <dependency> - <groupId>io.grpc</groupId> - <artifactId>grpc-protobuf</artifactId> - <version>${grpc.version}</version> - </dependency> - <dependency> - <groupId>io.grpc</groupId> - <artifactId>grpc-netty-shaded</artifactId> - <version>${grpc.version}</version> + <version>${grpc-context.version}</version> </dependency> <dependency> <groupId>io.nats</groupId> diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/pom.xml b/streampipes-extensions/streampipes-sinks-databases-jvm/pom.xml index 557c0de036..b5216cdf91 100644 --- a/streampipes-extensions/streampipes-sinks-databases-jvm/pom.xml +++ b/streampipes-extensions/streampipes-sinks-databases-jvm/pom.xml @@ -98,10 +98,6 @@ <groupId>io.milvus</groupId> <artifactId>milvus-sdk-java</artifactId> </dependency> - <dependency> - <groupId>io.qdrant</groupId> - <artifactId>client</artifactId> - </dependency> <dependency> <groupId>com.google.errorprone</groupId> <artifactId>error_prone_annotations</artifactId> diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/DatabaseSinksExtensionModuleExport.java b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/DatabaseSinksExtensionModuleExport.java index 5285759baa..cb33173b85 100644 --- a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/DatabaseSinksExtensionModuleExport.java +++ b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/DatabaseSinksExtensionModuleExport.java @@ -28,7 +28,6 @@ import org.apache.streampipes.sinks.databases.jvm.iotdb.IotDbSink; import org.apache.streampipes.sinks.databases.jvm.milvus.MilvusSink; import org.apache.streampipes.sinks.databases.jvm.parquet.ParquetSink; import org.apache.streampipes.sinks.databases.jvm.postgresql.PostgreSqlSink; -import org.apache.streampipes.sinks.databases.jvm.qdrant.QdrantSink; import org.apache.streampipes.sinks.databases.jvm.redis.RedisSink; import org.apache.streampipes.sinks.databases.jvm.tsfile.TsFileSink; @@ -50,9 +49,9 @@ public class DatabaseSinksExtensionModuleExport implements IExtensionModuleExpor new DittoSink(), new RedisSink(), new MilvusSink(), - new QdrantSink(), new TsFileSink(), - new ParquetSink()); + new ParquetSink() + ); } @Override diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/qdrant/QdrantSink.java b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/qdrant/QdrantSink.java deleted file mode 100644 index b8bb05d40c..0000000000 --- a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/qdrant/QdrantSink.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.streampipes.sinks.databases.jvm.qdrant; - -import org.apache.streampipes.commons.exceptions.SpRuntimeException; -import org.apache.streampipes.extensions.api.extractor.IDataSinkParameterExtractor; -import org.apache.streampipes.extensions.api.pe.context.EventSinkRuntimeContext; -import org.apache.streampipes.model.DataSinkType; -import org.apache.streampipes.model.extensions.ExtensionAssetType; -import org.apache.streampipes.model.graph.DataSinkDescription; -import org.apache.streampipes.model.runtime.Event; -import org.apache.streampipes.model.schema.PropertyScope; -import org.apache.streampipes.sdk.builder.DataSinkBuilder; -import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder; -import org.apache.streampipes.sdk.helpers.EpRequirements; -import org.apache.streampipes.sdk.helpers.Labels; -import org.apache.streampipes.sdk.helpers.Locales; -import org.apache.streampipes.sdk.helpers.Options; -import org.apache.streampipes.vocabulary.XSD; -import org.apache.streampipes.wrapper.params.compat.SinkParams; -import org.apache.streampipes.wrapper.standalone.StreamPipesDataSink; - -import io.qdrant.client.PointIdFactory; -import io.qdrant.client.QdrantClient; -import io.qdrant.client.QdrantGrpcClient; -import io.qdrant.client.VectorFactory; -import io.qdrant.client.grpc.Collections.Distance; -import io.qdrant.client.grpc.Collections.VectorParams; -import io.qdrant.client.grpc.JsonWithInt.Value; -import io.qdrant.client.grpc.Points.NamedVectors; -import io.qdrant.client.grpc.Points.PointStruct; -import io.qdrant.client.grpc.Points.Vectors; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.stream.Collectors; - -public class QdrantSink extends StreamPipesDataSink { - public static final String QDRANT_HOST_KEY = "qdrant_host"; - public static final String QDRANT_PORT_KEY = "qdrant_port"; - public static final String QDRANT_API_KEY_KEY = "qdrant_api_key"; - public static final String COLLECTION_NAME_KEY = "qdrant_collection_name"; - public static final String VECTOR_NAME_KEY = "qdrant_vector_field"; - public static final String VECTOR_DIMENSION_KEY = "qdrant_vector_dimension"; - public static final String VECTOR_DISTANCE_KEY = "qdrant_distance_metric"; - public static final String ID_KEY = "qdrant_id"; - - private QdrantClient client; - private String vector; - private String id; - private String collectionName; - private Integer dimension; - private Distance distanceType; - - public static final String BYTE = XSD.BYTE.toString(); - public static final String SHORT = XSD.SHORT.toString(); - public static final String LONG = XSD.LONG.toString(); - public static final String INT = XSD.INT.toString(); - public static final String FLOAT = XSD.FLOAT.toString(); - public static final String DOUBLE = XSD.DOUBLE.toString(); - public static final String BOOLEAN = XSD.BOOLEAN.toString(); - public static final String STRING = XSD.STRING.toString(); - - private static final Map<String, Distance> DISTANCE_TYPE_MAP = - new HashMap<>() { - { - put("Cosine", Distance.Cosine); - put("Euclid", Distance.Euclid); - put("Dot", Distance.Dot); - put("Manhattan", Distance.Manhattan); - } - }; - - @Override - public DataSinkDescription declareModel() { - return DataSinkBuilder.create("org.apache.streampipes.sinks.databases.jvm.qdrant", 0) - .withLocales(Locales.EN) - .withAssets(ExtensionAssetType.DOCUMENTATION, ExtensionAssetType.ICON) - .category(DataSinkType.DATABASE) - .requiredTextParameter(Labels.withId(QDRANT_HOST_KEY), "localhost") - .requiredIntegerParameter(Labels.withId(QDRANT_PORT_KEY), 6334) - .requiredTextParameter(Labels.withId(QDRANT_API_KEY_KEY), "<optional-api-key>") - .requiredTextParameter(Labels.withId(COLLECTION_NAME_KEY)) - .requiredTextParameter(Labels.withId(ID_KEY)) - .requiredIntegerParameter(Labels.withId(VECTOR_DIMENSION_KEY)) - .requiredStream( - StreamRequirementsBuilder.create() - .requiredPropertyWithUnaryMapping( - EpRequirements.anyProperty(), - Labels.withId(VECTOR_NAME_KEY), - PropertyScope.NONE) - .build()) - .requiredSingleValueSelection( - Labels.withId(VECTOR_DISTANCE_KEY), - Options.from(DISTANCE_TYPE_MAP.keySet().toArray(new String[0]))) - .build(); - } - - @Override - public void onInvocation(SinkParams parameters, EventSinkRuntimeContext runtimeContext) - throws SpRuntimeException { - var extractor = parameters.extractor(); - - final String host = validateAndExtractHost(extractor); - final Integer port = validateAndExtractPort(extractor); - final String apiKey = validateAndExtractApiKey(extractor); - this.collectionName = validateAndExtractCollectionName(extractor); - this.id = validateAndExtractId(extractor); - this.vector = validateAndExtractVectorField(extractor); - this.dimension = validateAndExtractDimension(extractor); - this.distanceType = validateAndExtractDistanceType(extractor); - - try { - client = new QdrantClient(QdrantGrpcClient.newBuilder(host, port).withApiKey(apiKey).build()); - - createOrValidateCollection(); - - } catch (Exception e) { - if (client != null) { - client.close(); - } - throw new SpRuntimeException("Failed to initialize Qdrant connection: " + e.getMessage()); - } - } - - private String validateAndExtractHost(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - String host = extractor.singleValueParameter(QDRANT_HOST_KEY, String.class); - if (host == null || host.trim().isEmpty()) { - throw new SpRuntimeException("Host cannot be empty"); - } - return host; - } - - private Integer validateAndExtractPort(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - Integer port = extractor.singleValueParameter(QDRANT_PORT_KEY, Integer.class); - if (port == null || port < 1 || port > 65535) { - throw new SpRuntimeException("Port must be between 1 and 65535"); - } - return port; - } - - private String validateAndExtractApiKey(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - String apiKey = extractor.singleValueParameter(QDRANT_API_KEY_KEY, String.class); - if (apiKey == null || apiKey.trim().isEmpty()) { - throw new SpRuntimeException("API key cannot be empty"); - } - return apiKey; - } - - private String validateAndExtractCollectionName(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - String collectionName = extractor.singleValueParameter(COLLECTION_NAME_KEY, String.class); - if (collectionName == null || collectionName.trim().isEmpty()) { - throw new SpRuntimeException("Collection name cannot be empty"); - } - return collectionName; - } - - private String validateAndExtractId(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - String id = extractor.singleValueParameter(ID_KEY, String.class); - if (id == null || id.trim().isEmpty()) { - throw new SpRuntimeException("ID field cannot be empty"); - } - try { - UUID.fromString(id); - } catch (IllegalArgumentException e) { - throw new SpRuntimeException("Invalid ID format. The ID must be a valid UUID string."); - } - return id; - } - - private String validateAndExtractVectorField(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - String vectorField = extractor.mappingPropertyValue(VECTOR_NAME_KEY); - if (vectorField == null || vectorField.trim().isEmpty()) { - throw new SpRuntimeException("Vector field cannot be empty"); - } - return vectorField.substring(4); - } - - private Integer validateAndExtractDimension(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - Integer dimension = - Integer.valueOf(extractor.singleValueParameter(VECTOR_DIMENSION_KEY, String.class)); - if (dimension == null || dimension <= 0) { - throw new SpRuntimeException("Vector dimension must be a positive number"); - } - return dimension; - } - - private Distance validateAndExtractDistanceType(IDataSinkParameterExtractor extractor) - throws SpRuntimeException { - String distanceTypeStr = extractor.selectedSingleValue(VECTOR_DISTANCE_KEY, String.class); - Distance distanceType = DISTANCE_TYPE_MAP.get(distanceTypeStr); - if (distanceType == null) { - throw new SpRuntimeException("Invalid distance type: " + distanceTypeStr); - } - return distanceType; - } - - private void createOrValidateCollection() throws SpRuntimeException { - try { - var collectionExists = client.collectionExistsAsync(collectionName).get(); - if (!collectionExists) { - - client - .createCollectionAsync( - collectionName, - Map.of( - vector, - VectorParams.newBuilder().setSize(dimension).setDistance(distanceType).build())) - .get(); - } - } catch (Exception e) { - throw new SpRuntimeException("Failed to create or validate collection: " + e.getMessage()); - } - } - - @Override - public void onDetach() { - if (client != null) { - client.close(); - } - } - - @Override - public void onEvent(Event event) { - if (event == null) { - return; - } - - final Map<String, Object> measurementValuePairs = event.getRaw(); - if (measurementValuePairs.size() <= 1) { - return; - } - - try { - Map<String, Value> payload = new HashMap<>(); - List<Float> vectorValues = null; - - for (Map.Entry<String, Object> entry : measurementValuePairs.entrySet()) { - final String name = entry.getKey(); - final Object value = entry.getValue(); - - if (name.equals(vector)) { - vectorValues = validateAndExtractVectorValues(value); - } else if (value != null) { - payload.put(name, QdrantValueFactory.value(value)); - } - } - - if (vectorValues != null) { - if (vectorValues.size() != dimension) { - throw new SpRuntimeException( - String.format( - "Vector dimension mismatch. Expected %d but got %d", - dimension, vectorValues.size())); - } - - PointStruct point = - PointStruct.newBuilder() - .setId(PointIdFactory.id(UUID.fromString(id))) - .setVectors( - Vectors.newBuilder() - .setVectors( - NamedVectors.newBuilder() - .putAllVectors(Map.of(vector, VectorFactory.vector(vectorValues))) - .build()) - .build()) - .putAllPayload(payload) - .build(); - - client.upsertAsync(collectionName, Collections.singletonList(point)).get(); - } else { - throw new SpRuntimeException("No vector values found in the event"); - } - } catch (Exception e) { - throw new SpRuntimeException("Error processing event: " + e.getMessage()); - } - } - - private List<Float> validateAndExtractVectorValues(Object value) throws SpRuntimeException { - if (!(value instanceof List)) { - throw new SpRuntimeException("Vector field must be a list of numbers"); - } - - List<?> list = (List<?>) value; - try { - return list.stream() - .map( - item -> { - if (item instanceof Number) { - return ((Number) item).floatValue(); - } - throw new IllegalArgumentException("Vector must contain only numbers"); - }) - .collect(Collectors.toList()); - } catch (IllegalArgumentException e) { - throw new SpRuntimeException("Invalid vector values: " + e.getMessage()); - } - } -} diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/qdrant/QdrantValueFactory.java b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/qdrant/QdrantValueFactory.java deleted file mode 100644 index 5557e1e1c3..0000000000 --- a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/java/org/apache/streampipes/sinks/databases/jvm/qdrant/QdrantValueFactory.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.streampipes.sinks.databases.jvm.qdrant; - -import io.qdrant.client.ValueFactory; -import io.qdrant.client.grpc.JsonWithInt.Struct; -import io.qdrant.client.grpc.JsonWithInt.Value; -import org.springframework.util.Assert; - -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** Utility methods for building io.qdrant.client.grpc.JsonWithInt.Value from Java objects. */ -final class QdrantValueFactory { - - private QdrantValueFactory() {} - - @SuppressWarnings("unchecked") - public static Value value(Object value) { - - if (value == null) { - return ValueFactory.nullValue(); - } - - if (value.getClass().isArray()) { - int length = Array.getLength(value); - Object[] objectArray = new Object[length]; - for (int i = 0; i < length; i++) { - objectArray[i] = Array.get(value, i); - } - return value(objectArray); - } - - if (value instanceof Map) { - return value((Map<String, Object>) value); - } - - if (value instanceof List) { - return value((List<Object>) value); - } - - switch (value.getClass().getSimpleName()) { - case "String": - return ValueFactory.value((String) value); - case "Integer": - return ValueFactory.value((Integer) value); - case "Long": - return ValueFactory.value(String.valueOf(value)); - case "Double": - return ValueFactory.value((Double) value); - case "Float": - return ValueFactory.value((Float) value); - case "Boolean": - return ValueFactory.value((Boolean) value); - default: - throw new IllegalArgumentException("Unsupported Qdrant value type: " + value.getClass()); - } - } - - private static Value value(List<Object> elements) { - List<Value> values = new ArrayList<Value>(elements.size()); - - for (Object element : elements) { - values.add(value(element)); - } - - return ValueFactory.list(values); - } - - private static Value value(Object[] elements) { - List<Value> values = new ArrayList<Value>(elements.length); - - for (Object element : elements) { - values.add(value(element)); - } - - return ValueFactory.list(values); - } - - private static Value value(Map<String, Object> inputMap) { - Struct.Builder structBuilder = Struct.newBuilder(); - Map<String, Value> map = toValueMap(inputMap); - structBuilder.putAllFields(map); - return Value.newBuilder().setStructValue(structBuilder).build(); - } - - private static Map<String, Value> toValueMap(Map<String, Object> inputMap) { - Assert.notNull(inputMap, "Input map must not be null"); - - return inputMap.entrySet().stream() - .collect(Collectors.toMap(e -> e.getKey(), e -> value(e.getValue()))); - } -} diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/documentation.md b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/documentation.md deleted file mode 100644 index 974d959ce2..0000000000 --- a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/documentation.md +++ /dev/null @@ -1,88 +0,0 @@ -<!-- - ~ Licensed to the Apache Software Foundation (ASF) under one or more - ~ contributor license agreements. See the NOTICE file distributed with - ~ this work for additional information regarding copyright ownership. - ~ The ASF licenses this file to You under the Apache License, Version 2.0 - ~ (the "License"); you may not use this file except in compliance with - ~ the License. You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - ~ - --> - -## Qdrant - -<p align="center"> - <img src="icon.png" width="150px;" class="pe-image-documentation"/> -</p> - -*** - -## Description - -Stores events in a Qdrant vector database. This sink connector allows you to store vector data along with associated metadata in a Qdrant collection. - -*** - -## Required input - -This sink requires an input stream that contains a vector field. The vector field should be a list of float values. - -*** - -## Configuration - -### Host - -The host address of the Qdrant instance (e.g., "localhost" or "xyz-example.cloud-region.cloud-provider.cloud.qdrant.io"). - -### Port - -The port number of the Qdrant instance (default is 6334 for gRPC). - -### API Key - -The API key for authentication with Qdrant. This is required for secure access to the Qdrant instance. - -### Collection Name - -The name of the collection where the data will be stored. If the collection doesn't exist, it will be created automatically. - -### ID Field - -The field name that will be used as the unique identifier for each point in the collection. This should be a UUID string. - -### Vector Field - -The name of the field containing the vector data. This field should contain a list of float values. - -### Vector Dimension - -The dimension of the vectors to be stored (default is 384). This must match the dimension of your input vectors. - -### Distance Metric - -The distance metric to use for vector similarity search. Available options are: - -- Cosine -- Euclid -- Dot -- Manhattan - -## Output - -(not applicable for data sinks) - -## Notes - -- The sink automatically creates the collection if it doesn't exist -- All non-vector fields from the input event are stored as payload -- The sink uses [gRPC for communication](https://qdrant.tech/documentation/interfaces/#grpc-interface) with Qdrant -- Vector data must be provided as a list of float values -- The ID fmust be a valid UUID string diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/icon.png b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/icon.png deleted file mode 100644 index a66b10cba2..0000000000 Binary files a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/icon.png and /dev/null differ diff --git a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/strings.en b/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/strings.en deleted file mode 100644 index e63878964d..0000000000 --- a/streampipes-extensions/streampipes-sinks-databases-jvm/src/main/resources/org.apache.streampipes.sinks.databases.jvm.qdrant/strings.en +++ /dev/null @@ -1,43 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -org.apache.streampipes.sinks.databases.jvm.qdrant.title=Qdrant -org.apache.streampipes.sinks.databases.jvm.qdrant.description=Stores events in a Qdrant vector database. This sink connector allows you to store vector data along with associated metadata in a Qdrant collection. - -qdrant_host.title=Host -qdrant_host.description=The host address of the Qdrant instance - -qdrant_port.title=Port -qdrant_port.description=The port number of the Qdrant instance (default is 6334 for gRPC) - -qdrant_api_key.title=API Key -qdrant_api_key.description=The API key for authentication with Qdrant. This is required for secure access to the Qdrant instance. - -qdrant_collection_name.title=Collection Name -qdrant_collection_name.description=The name of the collection where the data will be stored. If the collection doesn't exist, it will be created automatically. - -qdrant_id.title=ID Field -qdrant_id.description=The field name that will be used as the unique identifier for each point in the collection. This should be a UUID string. - -qdrant_vector_field.title=Vector Field -qdrant_vector_field.description=The name of the field containing the vector data. This field should contain a list of float values. - -qdrant_vector_dimension.title=Vector Dimension -qdrant_vector_dimension.description=The dimension of the vectors to be stored. This must match the dimension of your input vectors. - -qdrant_distance_metric.title=Distance Metric -qdrant_distance_metric.description=The distance metric to use for vector similarity search. Available options are: Cosine, Euclid, Dot, and Manhattan.
