This is an automated email from the ASF dual-hosted git repository.

acosentino 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 cde8d2521cd CAMEL-21012 - camel-milvus: action name mismatch with 
embeddings (#15041)
cde8d2521cd is described below

commit cde8d2521cd106841779d8afc6b5cd6126517d48
Author: Andrea Cosentino <anco...@gmail.com>
AuthorDate: Wed Aug 7 14:36:46 2024 +0200

    CAMEL-21012 - camel-milvus: action name mismatch with embeddings (#15041)
    
    * CAMEL-21012 - camel-milvus: action name mismatch with embeddings
    
    Signed-off-by: Andrea Cosentino <anco...@gmail.com>
    
    * CAMEL-21012 - camel-milvus: action name mismatch with embeddings
    
    Signed-off-by: Andrea Cosentino <anco...@gmail.com>
    
    ---------
    
    Signed-off-by: Andrea Cosentino <anco...@gmail.com>
---
 .../apache/camel/catalog/components/milvus.json    |  4 +-
 ...ngChain4jEmbeddingsComponentMilvusTargetIT.java | 23 ++++++++++-
 .../org/apache/camel/component/milvus/milvus.json  |  4 +-
 .../org/apache/camel/component/milvus/Milvus.java  |  6 +++
 .../MilvusEmbeddingsDataTypeTransformer.java       | 46 ++++++++++++++++++++++
 .../endpoint/dsl/MilvusEndpointBuilderFactory.java | 24 +++++++++++
 6 files changed, 104 insertions(+), 3 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json
index 6405557553d..b0fdb0f3bd5 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/milvus.json
@@ -37,7 +37,9 @@
     "CamelMilvusOperationStatusValue": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Operation Status Value.", 
"constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#OPERATION_STATUS_VALUE" },
     "CamelMilvusTextFieldName": { "index": 3, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Text Field Name for Insert\/Upsert operation", 
"constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#TEXT_FIELD_NAME" },
     "CamelMilvusVectorFieldName": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Vector Field Name for Insert\/Upsert 
operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#VECTOR_FIELD_NAME" },
-    "CamelMilvusCollectionName": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Collection Name for Insert\/Upsert 
operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" }
+    "CamelMilvusCollectionName": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Collection Name for Insert\/Upsert 
operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" },
+    "CamelMilvusKeyName": { "index": 6, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Name for Insert\/Upsert operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#KEY_NAME" },
+    "CamelMilvusKeyValue": { "index": 7, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Value for Insert\/Upsert operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#KEY_VALUE" }
   },
   "properties": {
     "collection": { "index": 0, "kind": "path", "displayName": "Collection", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The collection Name" },
diff --git 
a/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java
 
b/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java
index 28811aa4faa..3baf991111e 100644
--- 
a/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java
+++ 
b/components/camel-ai/camel-langchain4j-embeddings/src/test/java/org/apache/camel/component/langchain4j/embeddings/LangChain4jEmbeddingsComponentMilvusTargetIT.java
@@ -80,7 +80,6 @@ public class LangChain4jEmbeddingsComponentMilvusTargetIT 
extends CamelTestSuppo
                 .withDescription("user identification")
                 .withDataType(DataType.Int64)
                 .withPrimaryKey(true)
-                .withAutoID(true)
                 .build();
 
         FieldType fieldType2 = FieldType.newBuilder()
@@ -171,6 +170,18 @@ public class LangChain4jEmbeddingsComponentMilvusTargetIT 
extends CamelTestSuppo
                 c -> assertThat(c.rowRecords.size() == 1));
     }
 
+    @Test
+    @Order(4)
+    public void upsert() {
+
+        Exchange result = fluentTemplate.to("direct:up")
+                .withBody("hello")
+                .request(Exchange.class);
+
+        assertThat(result).isNotNull();
+        assertThat(result.getException()).isNull();
+    }
+
     @Override
     protected RoutesBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -178,6 +189,16 @@ public class LangChain4jEmbeddingsComponentMilvusTargetIT 
extends CamelTestSuppo
                 from("direct:in")
                         .to("langchain4j-embeddings:test")
                         
.setHeader(Milvus.Headers.ACTION).constant(MilvusAction.INSERT)
+                        .setHeader(Milvus.Headers.KEY_NAME).constant("userID")
+                        
.setHeader(Milvus.Headers.KEY_VALUE).constant(Long.valueOf("3"))
+                        .transform(new 
org.apache.camel.spi.DataType("milvus:embeddings"))
+                        .to(MILVUS_URI);
+
+                from("direct:up")
+                        .to("langchain4j-embeddings:test")
+                        
.setHeader(Milvus.Headers.ACTION).constant(MilvusAction.UPSERT)
+                        .setHeader(Milvus.Headers.KEY_NAME).constant("userID")
+                        
.setHeader(Milvus.Headers.KEY_VALUE).constant(Long.valueOf("3"))
                         .transform(new 
org.apache.camel.spi.DataType("milvus:embeddings"))
                         .to(MILVUS_URI);
             }
diff --git 
a/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json
 
b/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json
index 6405557553d..b0fdb0f3bd5 100644
--- 
a/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json
+++ 
b/components/camel-ai/camel-milvus/src/generated/resources/META-INF/org/apache/camel/component/milvus/milvus.json
@@ -37,7 +37,9 @@
     "CamelMilvusOperationStatusValue": { "index": 2, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Operation Status Value.", 
"constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#OPERATION_STATUS_VALUE" },
     "CamelMilvusTextFieldName": { "index": 3, "kind": "header", "displayName": 
"", "group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Text Field Name for Insert\/Upsert operation", 
"constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#TEXT_FIELD_NAME" },
     "CamelMilvusVectorFieldName": { "index": 4, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Vector Field Name for Insert\/Upsert 
operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#VECTOR_FIELD_NAME" },
-    "CamelMilvusCollectionName": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Collection Name for Insert\/Upsert 
operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" }
+    "CamelMilvusCollectionName": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Collection Name for Insert\/Upsert 
operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#COLLECTION_NAME" },
+    "CamelMilvusKeyName": { "index": 6, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Name for Insert\/Upsert operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#KEY_NAME" },
+    "CamelMilvusKeyValue": { "index": 7, "kind": "header", "displayName": "", 
"group": "producer", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Key Value for Insert\/Upsert operation", "constantName": 
"org.apache.camel.component.milvus.Milvus$Headers#KEY_VALUE" }
   },
   "properties": {
     "collection": { "index": 0, "kind": "path", "displayName": "Collection", 
"group": "producer", "label": "", "required": true, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "The collection Name" },
diff --git 
a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java
 
b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java
index 0a5a2fe1f83..defaf5cd3ec 100644
--- 
a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java
+++ 
b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/Milvus.java
@@ -43,5 +43,11 @@ public class Milvus {
 
         @Metadata(description = "Collection Name for Insert/Upsert operation", 
javaType = "String")
         public static final String COLLECTION_NAME = 
"CamelMilvusCollectionName";
+
+        @Metadata(description = "Key Name for Insert/Upsert operation", 
javaType = "String")
+        public static final String KEY_NAME = "CamelMilvusKeyName";
+
+        @Metadata(description = "Key Value for Insert/Upsert operation", 
javaType = "String")
+        public static final String KEY_VALUE = "CamelMilvusKeyValue";
     }
 }
diff --git 
a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java
 
b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java
index 5cd64f1c3b4..f1debf059b0 100644
--- 
a/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java
+++ 
b/components/camel-ai/camel-milvus/src/main/java/org/apache/camel/component/milvus/transform/MilvusEmbeddingsDataTypeTransformer.java
@@ -24,12 +24,15 @@ import java.util.List;
 import dev.langchain4j.data.embedding.Embedding;
 import dev.langchain4j.data.segment.TextSegment;
 import io.milvus.param.dml.InsertParam;
+import io.milvus.param.dml.UpsertParam;
 import org.apache.camel.Message;
 import org.apache.camel.ai.CamelLangchain4jAttributes;
 import org.apache.camel.component.milvus.Milvus;
+import org.apache.camel.component.milvus.MilvusAction;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.DataTypeTransformer;
 import org.apache.camel.spi.Transformer;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * Maps a LangChain4j Embeddings to a Milvus InsertParam/Upsert Param to write 
an embeddings vector on a Milvus
@@ -45,13 +48,34 @@ public class MilvusEmbeddingsDataTypeTransformer extends 
Transformer {
         String textFieldName = 
message.getHeader(Milvus.Headers.TEXT_FIELD_NAME, () -> "text", String.class);
         String vectorFieldName = 
message.getHeader(Milvus.Headers.VECTOR_FIELD_NAME, () -> "vector", 
String.class);
         String collectionName = 
message.getHeader(Milvus.Headers.COLLECTION_NAME, () -> "embeddings", 
String.class);
+        String keyName = message.getHeader(Milvus.Headers.KEY_NAME, () -> 
"id", String.class);
+        Object keyValue = message.getHeader(Milvus.Headers.KEY_VALUE, () -> 
null);
         TextSegment text = message.getBody(TextSegment.class);
+        final MilvusAction action = message.getHeader(Milvus.Headers.ACTION, 
MilvusAction.class);
+        switch (action) {
+            case INSERT -> insertEmbeddingOperation(message, embedding, 
vectorFieldName, textFieldName, text, collectionName,
+                    keyValue, keyName);
+            case UPSERT -> upsertEmbeddingOperation(message, embedding, 
vectorFieldName, textFieldName, text, collectionName,
+                    keyValue, keyName);
+            default -> throw new IllegalStateException("The only operations 
supported are insert and upsert");
+        }
+    }
+
+    private static void insertEmbeddingOperation(
+            Message message, Embedding embedding, String vectorFieldName, 
String textFieldName, TextSegment text,
+            String collectionName, Object keyValue, String keyName) {
         List<InsertParam.Field> fields = new ArrayList<>();
         ArrayList list = new ArrayList<>();
         list.add(embedding.vectorAsList());
         fields.add(new InsertParam.Field(vectorFieldName, list));
         fields.add(new InsertParam.Field(textFieldName, 
Collections.singletonList(text.text())));
 
+        if (ObjectHelper.isNotEmpty(keyValue) && 
ObjectHelper.isNotEmpty(keyName)) {
+            ArrayList keyValues = new ArrayList<>();
+            keyValues.add(keyValue);
+            fields.add(new InsertParam.Field(keyName, keyValues));
+        }
+
         InsertParam insertParam = InsertParam.newBuilder()
                 .withCollectionName(collectionName)
                 .withFields(fields)
@@ -59,4 +83,26 @@ public class MilvusEmbeddingsDataTypeTransformer extends 
Transformer {
 
         message.setBody(insertParam);
     }
+
+    private static void upsertEmbeddingOperation(
+            Message message, Embedding embedding, String vectorFieldName, 
String textFieldName, TextSegment text,
+            String collectionName, Object keyValue, String keyName) {
+        List<InsertParam.Field> fields = new ArrayList<>();
+        ArrayList list = new ArrayList<>();
+        list.add(embedding.vectorAsList());
+        fields.add(new UpsertParam.Field(vectorFieldName, list));
+        fields.add(new UpsertParam.Field(textFieldName, 
Collections.singletonList(text.text())));
+        if (ObjectHelper.isNotEmpty(keyValue) && 
ObjectHelper.isNotEmpty(keyName)) {
+            ArrayList keyValues = new ArrayList<>();
+            keyValues.add(keyValue);
+            fields.add(new UpsertParam.Field(keyName, keyValues));
+        }
+
+        UpsertParam upsertParam = UpsertParam.newBuilder()
+                .withCollectionName(collectionName)
+                .withFields(fields)
+                .build();
+
+        message.setBody(upsertParam);
+    }
 }
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java
index 2e3b76f8266..cc09b81be7b 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MilvusEndpointBuilderFactory.java
@@ -329,6 +329,30 @@ public interface MilvusEndpointBuilderFactory {
         public String milvusCollectionName() {
             return "CamelMilvusCollectionName";
         }
+        /**
+         * Key Name for Insert/Upsert operation.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code MilvusKeyName}.
+         */
+        public String milvusKeyName() {
+            return "CamelMilvusKeyName";
+        }
+        /**
+         * Key Value for Insert/Upsert operation.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code MilvusKeyValue}.
+         */
+        public String milvusKeyValue() {
+            return "CamelMilvusKeyValue";
+        }
     }
     static MilvusEndpointBuilder endpointBuilder(String componentName, String 
path) {
         class MilvusEndpointBuilderImpl extends AbstractEndpointBuilder 
implements MilvusEndpointBuilder, AdvancedMilvusEndpointBuilder {

Reply via email to