This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 239690cfccb CAMEL-21819 Add fetch action to camel-pinecone (#17317) 239690cfccb is described below commit 239690cfccb654c042345f62fd1a972355bfcabb Author: Tom Cunningham <tcunn...@redhat.com> AuthorDate: Sat Mar 1 02:31:15 2025 -0500 CAMEL-21819 Add fetch action to camel-pinecone (#17317) --- .../apache/camel/catalog/components/pinecone.json | 2 +- .../apache/camel/component/pinecone/pinecone.json | 2 +- .../camel/component/pinecone/PineconeVectorDb.java | 4 +-- .../component/pinecone/PineconeVectorDbAction.java | 1 + .../pinecone/PineconeVectorDbProducer.java | 37 +++++++++++++++++++--- .../component/pinecone/it/PineconeComponentIT.java | 20 +++++++++++- .../PineconeVectorDbEndpointBuilderFactory.java | 8 ++--- 7 files changed, 61 insertions(+), 13 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pinecone.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pinecone.json index f8d422124a3..ce3b21b1a0e 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pinecone.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/pinecone.json @@ -52,7 +52,7 @@ "CamelPineconeCollectionCloudRegion": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "enum": [ "aws", "gcp", "azure" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Collection Cloud Vendor Region", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#COLLECTION_CLOUD_REGION" }, "CamelPineconeIndexId": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Index Upsert Id", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#INDEX_ID" }, "CamelPineconeQueryTopK": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Top K", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_TOP_K" }, - "CamelPineconeQueryNamespace": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Namespace", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_NAMESPACE" }, + "CamelPineconeNamespace": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Namespace for actions (query\/upsert\/etc)", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#NAMESPACE" }, "CamelPineconeQueryFilter": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Filter", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_FILTER" }, "CamelPineconeQueryIncludeValues": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Include Values", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_INCLUDE_VALUES" }, "CamelPineconeQueryIncludeMetadata": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "com.google.protobuf.Struct", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Include Metadata", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_INCLUDE_METADATA" } diff --git a/components/camel-ai/camel-pinecone/src/generated/resources/META-INF/org/apache/camel/component/pinecone/pinecone.json b/components/camel-ai/camel-pinecone/src/generated/resources/META-INF/org/apache/camel/component/pinecone/pinecone.json index f8d422124a3..ce3b21b1a0e 100644 --- a/components/camel-ai/camel-pinecone/src/generated/resources/META-INF/org/apache/camel/component/pinecone/pinecone.json +++ b/components/camel-ai/camel-pinecone/src/generated/resources/META-INF/org/apache/camel/component/pinecone/pinecone.json @@ -52,7 +52,7 @@ "CamelPineconeCollectionCloudRegion": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "enum": [ "aws", "gcp", "azure" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Collection Cloud Vendor Region", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#COLLECTION_CLOUD_REGION" }, "CamelPineconeIndexId": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Index Upsert Id", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#INDEX_ID" }, "CamelPineconeQueryTopK": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Top K", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_TOP_K" }, - "CamelPineconeQueryNamespace": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Namespace", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_NAMESPACE" }, + "CamelPineconeNamespace": { "index": 13, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Namespace for actions (query\/upsert\/etc)", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#NAMESPACE" }, "CamelPineconeQueryFilter": { "index": 14, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Filter", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_FILTER" }, "CamelPineconeQueryIncludeValues": { "index": 15, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Include Values", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_INCLUDE_VALUES" }, "CamelPineconeQueryIncludeMetadata": { "index": 16, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "com.google.protobuf.Struct", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query Include Metadata", "constantName": "org.apache.camel.component.pinecone.PineconeVectorDb$Headers#QUERY_INCLUDE_METADATA" } diff --git a/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDb.java b/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDb.java index a47fd08cdc2..6a3f792bc8e 100644 --- a/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDb.java +++ b/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDb.java @@ -66,8 +66,8 @@ public class PineconeVectorDb { @Metadata(description = "Query Top K", javaType = "Integer") public static final String QUERY_TOP_K = "CamelPineconeQueryTopK"; - @Metadata(description = "Query Namespace", javaType = "String") - public static final String QUERY_NAMESPACE = "CamelPineconeQueryNamespace"; + @Metadata(description = "Namespace for actions (query/upsert/etc)", javaType = "String") + public static final String NAMESPACE = "CamelPineconeNamespace"; @Metadata(description = "Query Filter", javaType = "String") public static final String QUERY_FILTER = "CamelPineconeQueryFilter"; diff --git a/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbAction.java b/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbAction.java index 9fe76c664ba..406b27aa1b6 100644 --- a/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbAction.java +++ b/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbAction.java @@ -20,6 +20,7 @@ public enum PineconeVectorDbAction { CREATE_COLLECTION, CREATE_SERVERLESS_INDEX, CREATE_POD_INDEX, + FETCH, UPSERT, DELETE_INDEX, DELETE_COLLECTION, diff --git a/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbProducer.java b/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbProducer.java index c1452a8cde7..b5cae413ecd 100644 --- a/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbProducer.java +++ b/components/camel-ai/camel-pinecone/src/main/java/org/apache/camel/component/pinecone/PineconeVectorDbProducer.java @@ -22,6 +22,7 @@ import java.util.concurrent.ExecutorService; import com.google.protobuf.Struct; import io.pinecone.clients.Index; import io.pinecone.clients.Pinecone; +import io.pinecone.proto.FetchResponse; import io.pinecone.proto.UpdateResponse; import io.pinecone.proto.UpsertResponse; import io.pinecone.unsigned_indices_model.QueryResponseWithUnsignedIndices; @@ -86,6 +87,9 @@ public class PineconeVectorDbProducer extends DefaultProducer { case DELETE_COLLECTION: deleteCollection(exchange); break; + case FETCH: + fetch(exchange); + break; case QUERY: query(exchange); break; @@ -202,9 +206,11 @@ public class PineconeVectorDbProducer extends DefaultProducer { indexName = in.getHeader(PineconeVectorDb.Headers.INDEX_NAME, String.class); } String indexId = in.getHeader(PineconeVectorDb.Headers.INDEX_ID, String.class); + String namespace = in.getHeader(PineconeVectorDb.Headers.NAMESPACE, String.class); + Index index = this.client.getIndexConnection(indexName); - UpsertResponse result = index.upsert(indexId, elements); + UpsertResponse result = index.upsert(indexId, elements, namespace); populateUpsertResponse(result, exchange); @@ -219,9 +225,10 @@ public class PineconeVectorDbProducer extends DefaultProducer { indexName = in.getHeader(PineconeVectorDb.Headers.INDEX_NAME, String.class); } String indexId = in.getHeader(PineconeVectorDb.Headers.INDEX_ID, String.class); + String namespace = in.getHeader(PineconeVectorDb.Headers.NAMESPACE, String.class); Index index = this.client.getIndexConnection(indexName); - UpdateResponse result = index.update(indexId, elements); + UpdateResponse result = index.update(indexId, elements, namespace); populateUpdateResponse(result, exchange); @@ -243,6 +250,23 @@ public class PineconeVectorDbProducer extends DefaultProducer { this.client.deleteCollection(collectionName); } + private void fetch(Exchange exchange) throws Exception { + final Message in = exchange.getMessage(); + List elements = in.getMandatoryBody(List.class); + String indexName = getEndpoint().getConfiguration().getIndexName(); + + if (in.getHeader(PineconeVectorDb.Headers.INDEX_NAME, String.class) != null) { + indexName = in.getHeader(PineconeVectorDb.Headers.INDEX_NAME, String.class); + } + + Index index = this.client.getIndexConnection(indexName); + + FetchResponse result + = index.fetch(elements); + + populateFetchResponse(result, exchange); + } + private void query(Exchange exchange) throws Exception { final Message in = exchange.getMessage(); List elements = in.getMandatoryBody(List.class); @@ -256,7 +280,7 @@ public class PineconeVectorDbProducer extends DefaultProducer { Index index = this.client.getIndexConnection(indexName); // Optional arguments, can be null - String namespace = in.getHeader(PineconeVectorDb.Headers.QUERY_NAMESPACE, String.class); + String namespace = in.getHeader(PineconeVectorDb.Headers.NAMESPACE, String.class); Struct filter = in.getHeader(PineconeVectorDb.Headers.QUERY_FILTER, Struct.class); boolean includeValues = (in.getHeader(PineconeVectorDb.Headers.QUERY_INCLUDE_VALUES, Boolean.class) == null) ? false : in.getHeader(PineconeVectorDb.Headers.QUERY_INCLUDE_VALUES, Boolean.class); @@ -285,7 +309,7 @@ public class PineconeVectorDbProducer extends DefaultProducer { String indexId = in.getHeader(PineconeVectorDb.Headers.INDEX_ID, String.class); // Optional arguments, can be null - String namespace = in.getHeader(PineconeVectorDb.Headers.QUERY_NAMESPACE, String.class); + String namespace = in.getHeader(PineconeVectorDb.Headers.NAMESPACE, String.class); Struct filter = in.getHeader(PineconeVectorDb.Headers.QUERY_FILTER, Struct.class); boolean includeValues = (in.getHeader(PineconeVectorDb.Headers.QUERY_INCLUDE_VALUES, Boolean.class) == null) ? false : in.getHeader(PineconeVectorDb.Headers.QUERY_INCLUDE_VALUES, Boolean.class); @@ -313,6 +337,11 @@ public class PineconeVectorDbProducer extends DefaultProducer { out.setBody(r); } + private void populateFetchResponse(FetchResponse r, Exchange exchange) { + Message out = exchange.getMessage(); + out.setBody(r); + } + private void populateIndexResponse(IndexModel r, Exchange exchange) { Message out = exchange.getMessage(); out.setBody(r); diff --git a/components/camel-ai/camel-pinecone/src/test/java/org/apache/camel/component/pinecone/it/PineconeComponentIT.java b/components/camel-ai/camel-pinecone/src/test/java/org/apache/camel/component/pinecone/it/PineconeComponentIT.java index 2907e9ef081..cb4143ea246 100644 --- a/components/camel-ai/camel-pinecone/src/test/java/org/apache/camel/component/pinecone/it/PineconeComponentIT.java +++ b/components/camel-ai/camel-pinecone/src/test/java/org/apache/camel/component/pinecone/it/PineconeComponentIT.java @@ -19,6 +19,7 @@ package org.apache.camel.component.pinecone.it; import java.util.Arrays; import java.util.List; +import io.pinecone.proto.FetchResponse; import io.pinecone.unsigned_indices_model.QueryResponseWithUnsignedIndices; import org.apache.camel.Exchange; import org.apache.camel.component.pinecone.PineconeVectorDb; @@ -123,7 +124,7 @@ public class PineconeComponentIT extends CamelTestSupport { elements) .withHeader(PineconeVectorDb.Headers.INDEX_NAME, "test-serverless-index") .withHeader(PineconeVectorDb.Headers.QUERY_TOP_K, 3) - .withHeader(PineconeVectorDb.Headers.QUERY_NAMESPACE, "defaultNamespace") + .withHeader(PineconeVectorDb.Headers.NAMESPACE, "defaultNamespace") .withHeader(PineconeVectorDb.Headers.QUERY_FILTER, "subject\": {\"$eq\": \"marine\"}") .withHeader(PineconeVectorDb.Headers.QUERY_INCLUDE_VALUES, true) .withHeader(PineconeVectorDb.Headers.QUERY_INCLUDE_METADATA, true) @@ -166,4 +167,21 @@ public class PineconeComponentIT extends CamelTestSupport { assertThat(result.getException()).isNull(); } + @Test + @Order(7) + public void fetch() { + + List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.2f); + + Exchange result = fluentTemplate.to("pinecone:test-collection?token={{pinecone.token}}") + .withHeader(PineconeVectorDb.Headers.ACTION, PineconeVectorDbAction.FETCH) + .withBody( + elements) + .request(Exchange.class); + + assertThat(result).isNotNull(); + assertThat(result.getException()).isNull(); + assertThat(result.getMessage().getBody(FetchResponse.class).getVectorsCount() != 0); + } + } diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PineconeVectorDbEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PineconeVectorDbEndpointBuilderFactory.java index e0530022e09..153f259332f 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PineconeVectorDbEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/PineconeVectorDbEndpointBuilderFactory.java @@ -519,16 +519,16 @@ public interface PineconeVectorDbEndpointBuilderFactory { return "CamelPineconeQueryTopK"; } /** - * Query Namespace. + * Namespace for actions (query/upsert/etc). * * The option is a: {@code String} type. * * Group: producer * - * @return the name of the header {@code PineconeQueryNamespace}. + * @return the name of the header {@code PineconeNamespace}. */ - public String pineconeQueryNamespace() { - return "CamelPineconeQueryNamespace"; + public String pineconeNamespace() { + return "CamelPineconeNamespace"; } /** * Query Filter.