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 6670c0b5d56 CAMEL-22142 camel-weaviate fixed query by vector (#18272) 6670c0b5d56 is described below commit 6670c0b5d5619b04bc0175c651265cac8d429e60 Author: JiriOndrusek <ondrusek.j...@gmail.com> AuthorDate: Wed Jun 4 16:36:13 2025 +0200 CAMEL-22142 camel-weaviate fixed query by vector (#18272) --- .../weaviate/WeaviateVectorDbProducer.java | 8 +- .../component/weaviate/it/WeaviateComponentIT.java | 179 +-------------------- .../component/weaviate/it/WeaviateContainerIT.java | 118 +++++++------- .../camel/component/rest/RestProducerTest.java | 4 +- 4 files changed, 70 insertions(+), 239 deletions(-) diff --git a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java index 0edb41b2380..fba392a9c19 100644 --- a/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java +++ b/components/camel-ai/camel-weaviate/src/main/java/org/apache/camel/component/weaviate/WeaviateVectorDbProducer.java @@ -16,7 +16,6 @@ */ package org.apache.camel.component.weaviate; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutorService; @@ -249,11 +248,8 @@ public class WeaviateVectorDbProducer extends DefaultProducer { if (in.getHeader(WeaviateVectorDb.Headers.FIELDS, HashMap.class) != null) { HashMap<String, Object> fieldToSearch = in.getHeader(WeaviateVectorDb.Headers.FIELDS, HashMap.class); - List<Field> fieldList = new ArrayList<>(); - for (String key : fieldToSearch.keySet()) { - fieldList.add(Field.builder().name(key).build()); - } - Field[] fieldArray = (Field[]) fieldList.toArray(); + Field[] fieldArray + = fieldToSearch.keySet().stream().map(k -> Field.builder().name(k).build()).toArray(Field[]::new); fields = Fields.builder().fields(fieldArray).build(); } else { diff --git a/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateComponentIT.java b/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateComponentIT.java index d61c6aebde0..7aa46a3e301 100644 --- a/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateComponentIT.java +++ b/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateComponentIT.java @@ -16,191 +16,16 @@ */ package org.apache.camel.component.weaviate.it; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.data.model.WeaviateObject; -import org.apache.camel.Exchange; -import org.apache.camel.component.weaviate.WeaviateVectorDb; -import org.apache.camel.component.weaviate.WeaviateVectorDbAction; -import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.*; import org.junit.jupiter.api.condition.EnabledIfSystemProperties; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; -import static org.assertj.core.api.Assertions.assertThat; - -// Must be manually tested. Provide your own accessKey and secretKey using -Dweaviate.token -// Example : +// Must be manually tested. Provide your own accessKey and secretKey according the example : // mvn -Dweaviate.apikey=YOURAPIKEY -Dweaviate.host=YOURHOST -Dweaviate.scheme=https verify @EnabledIfSystemProperties({ @EnabledIfSystemProperty(named = "weaviate.apikey", matches = ".*", disabledReason = "weaviate API Key not provided"), }) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class WeaviateComponentIT extends CamelTestSupport { - - private static final String COLLECTION = "WeaviateComponentITCollection"; - private static String CREATEID = null; - - @Test - @Order(1) - public void createCollection() { - - Exchange result = fluentTemplate - .to("weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.CREATE_COLLECTION) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .request(Exchange.class); - - assertThat(result).isNotNull(); - Result<Boolean> res = (Result<Boolean>) result.getIn().getBody(); - assertThat(!res.hasErrors()); - assertThat(res.getResult() == true); - assertThat(result.getException()).isNull(); - } - - @Test - @Order(2) - public void create() { - - List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.0f); - - HashMap<String, String> map = new HashMap<String, String>(); - map.put("sky", "blue"); - map.put("age", "34"); - - Exchange result = fluentTemplate.to( - "weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.CREATE) - .withBody(elements) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.PROPERTIES, map) - .request(Exchange.class); - - assertThat(result).isNotNull(); - - Result<WeaviateObject> res = (Result<WeaviateObject>) result.getIn().getBody(); - CREATEID = res.getResult().getId(); - - assertThat(res.hasErrors()).isFalse(); - assertThat(res).isNotNull(); - } - - @Test - @Order(7) - public void queryById() { - - Exchange result = fluentTemplate.to( - "weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY_BY_ID) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID) - .request(Exchange.class); - - assertThat(result).isNotNull(); - assertThat(result.getException()).isNull(); - Result<WeaviateObject> res = (Result<WeaviateObject>) result.getIn().getBody(); - assertThat(res.hasErrors()).isFalse(); - - List<WeaviateObject> list = (List) res.getResult(); - for (WeaviateObject wo : list) { - - Map<String, Object> map = wo.getProperties(); - assertThat(map).containsKey("sky"); - assertThat(map).containsKey("age"); - } - - } - - @Test - @Order(7) - public void updateById() { - - List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.0f); - - HashMap<String, String> map = new HashMap<String, String>(); - map.put("dog", "dachshund"); - - Exchange result = fluentTemplate.to( - "weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.UPDATE_BY_ID) - .withBody(elements) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID) - .withHeader(WeaviateVectorDb.Headers.PROPERTIES, map) - .request(Exchange.class); - - assertThat(result).isNotNull(); - - Result<Boolean> res = (Result<Boolean>) result.getIn().getBody(); - assertThat(res.hasErrors()).isFalse(); - assertThat(res.getResult()).isTrue(); - assertThat(result.getException()).isNull(); - } - - @Test - @Order(8) - public void queryByVector() { - - List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.2f); - - HashMap<String, String> map = new HashMap<String, String>(); - map.put("sky", "blue"); - - Exchange result = fluentTemplate.to( - "weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY) - .withBody( - elements) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.QUERY_TOP_K, 20) - .withHeader(WeaviateVectorDb.Headers.FIELDS, map) - .request(Exchange.class); - - assertThat(result).isNotNull(); - List<Float> vector = (List<Float>) result.getIn().getBody(); - assertThat(vector.get(0)).isEqualTo(1.0f); - assertThat(vector.get(1)).isEqualTo(2.0f); - assertThat(vector.get(2)).isEqualTo(3.2f); - } - - @Test - @Order(9) - public void deleteById() { - - Exchange result = fluentTemplate.to( - "weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.DELETE_BY_ID) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID) - .request(Exchange.class); - - assertThat(result).isNotNull(); - Result<Boolean> res = (Result<Boolean>) result.getIn().getBody(); - - assertThat(res.hasErrors()).isFalse(); - assertThat(res.getResult()).isTrue(); - assertThat(result.getException()).isNull(); - } - - @Test - @Order(10) - public void deleteCollection() { - Exchange result = fluentTemplate - .to("weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.DELETE_COLLECTION) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .request(Exchange.class); - - assertThat(result).isNotNull(); - Result<Boolean> res = (Result<Boolean>) result.getIn().getBody(); - assertThat(res.hasErrors()).isFalse(); - assertThat(res.getResult()).isTrue(); - assertThat(result.getException()).isNull(); - } - +public class WeaviateComponentIT extends WeaviateContainerIT { } diff --git a/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java b/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java index b893109dad9..7c51bb9c4f7 100644 --- a/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java +++ b/components/camel-ai/camel-weaviate/src/test/java/org/apache/camel/component/weaviate/it/WeaviateContainerIT.java @@ -23,11 +23,15 @@ import java.util.Map; import io.weaviate.client.base.Result; import io.weaviate.client.v1.data.model.WeaviateObject; +import io.weaviate.client.v1.graphql.model.GraphQLResponse; import org.apache.camel.Exchange; import org.apache.camel.component.weaviate.WeaviateTestSupport; import org.apache.camel.component.weaviate.WeaviateVectorDb; import org.apache.camel.component.weaviate.WeaviateVectorDbAction; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.condition.DisabledIfSystemProperties; import org.junit.jupiter.api.condition.DisabledIfSystemProperty; @@ -42,7 +46,7 @@ import static org.assertj.core.api.Assertions.assertThat; }) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class WeaviateContainerIT extends WeaviateTestSupport { - private static final String COLLECTION = "WeaviateComponentITCollection"; + private static final String COLLECTION = "WeaviateITCollection"; private static String CREATEID = null; @Test @@ -50,7 +54,7 @@ public class WeaviateContainerIT extends WeaviateTestSupport { public void createCollection() { Exchange result = fluentTemplate - .to("weaviate:test-collection") + .to(getUri()) .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.CREATE_COLLECTION) .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) .request(Exchange.class); @@ -73,7 +77,7 @@ public class WeaviateContainerIT extends WeaviateTestSupport { map.put("age", "34"); Exchange result = fluentTemplate - .to("weaviate:test-collection") + .to(getUri()) .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.CREATE) .withBody(elements) .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) @@ -89,51 +93,6 @@ public class WeaviateContainerIT extends WeaviateTestSupport { assertThat(res).isNotNull(); } - @Test - @Order(8) - public void queryByVector() { - - List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.2f); - - HashMap<String, String> map = new HashMap<String, String>(); - map.put("sky", "blue"); - - Exchange result = fluentTemplate - .to("weaviate:test-collection") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY) - .withBody( - elements) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.QUERY_TOP_K, 20) - .withHeader(WeaviateVectorDb.Headers.FIELDS, map) - .request(Exchange.class); - - assertThat(result).isNotNull(); - List<Float> vector = (List<Float>) result.getIn().getBody(); - assertThat(vector.get(0)).isEqualTo(1.0f); - assertThat(vector.get(1)).isEqualTo(2.0f); - assertThat(vector.get(2)).isEqualTo(3.2f); - } - - @Test - @Order(9) - public void deleteById() { - - Exchange result = fluentTemplate - .to("weaviate:test-collection") - .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.DELETE_BY_ID) - .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) - .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID) - .request(Exchange.class); - - assertThat(result).isNotNull(); - Result<Boolean> res = (Result<Boolean>) result.getIn().getBody(); - - assertThat(res.hasErrors()).isFalse(); - assertThat(res.getResult()).isTrue(); - assertThat(result.getException()).isNull(); - } - @Test @Order(7) public void updateById() { @@ -143,8 +102,7 @@ public class WeaviateContainerIT extends WeaviateTestSupport { HashMap<String, String> map = new HashMap<String, String>(); map.put("dog", "dachshund"); - Exchange result = fluentTemplate.to( - "weaviate:test-collection") + Exchange result = fluentTemplate.to(getUri()) .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.UPDATE_BY_ID) .withBody(elements) .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) @@ -164,8 +122,7 @@ public class WeaviateContainerIT extends WeaviateTestSupport { @Order(8) public void queryById() { - Exchange result = fluentTemplate.to( - "weaviate:test-collection") + Exchange result = fluentTemplate.to(getUri()) .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY_BY_ID) .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID) @@ -187,11 +144,56 @@ public class WeaviateContainerIT extends WeaviateTestSupport { } + @SuppressWarnings("unchecked") + @Test + @Order(8) + public void queryByVector() { + + List<Float> elements = Arrays.asList(1.0f, 2.0f, 3.2f); + + HashMap<String, String> map = new HashMap<String, String>(); + map.put("sky", "blue"); + + Exchange result = fluentTemplate + .to(getUri()) + .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.QUERY) + .withBody( + elements) + .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) + .withHeader(WeaviateVectorDb.Headers.QUERY_TOP_K, 20) + .withHeader(WeaviateVectorDb.Headers.FIELDS, map) + .request(Exchange.class); + + assertThat(result).isNotNull(); + GraphQLResponse<?> qlResponse = (GraphQLResponse<?>) result.getIn().getBody(Result.class).getResult(); + var dataMap = (Map<String, Map<String, List<Map<String, String>>>>) qlResponse.getData(); + assertThat(dataMap.get("Get").get(COLLECTION).get(0)).containsEntry("sky", "blue"); + } + + @Test + @Order(9) + public void deleteById() { + + Exchange result = fluentTemplate + .to(getUri()) + .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.DELETE_BY_ID) + .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) + .withHeader(WeaviateVectorDb.Headers.INDEX_ID, CREATEID) + .request(Exchange.class); + + assertThat(result).isNotNull(); + Result<Boolean> res = (Result<Boolean>) result.getIn().getBody(); + + assertThat(res.hasErrors()).isFalse(); + assertThat(res.getResult()).isTrue(); + assertThat(result.getException()).isNull(); + } + @Test @Order(10) public void deleteCollection() { Exchange result = fluentTemplate - .to("weaviate:test-collection") + .to(getUri()) .withHeader(WeaviateVectorDb.Headers.ACTION, WeaviateVectorDbAction.DELETE_COLLECTION) .withHeader(WeaviateVectorDb.Headers.COLLECTION_NAME, COLLECTION) .request(Exchange.class); @@ -203,4 +205,12 @@ public class WeaviateContainerIT extends WeaviateTestSupport { assertThat(result.getException()).isNull(); } + private String getUri() { + if (System.getProperties().containsKey("weaviate.apikey")) { + return "weaviate:test-collection?scheme={{weaviate.scheme}}&host={{weaviate.host}}&apiKey={{weaviate.apikey}}"; + } + + return "weaviate:test-collection"; + } + } diff --git a/core/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java b/core/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java index bb1a5866ed9..16b2c4ce84f 100644 --- a/core/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/component/rest/RestProducerTest.java @@ -24,7 +24,6 @@ import java.util.Collections; import org.apache.camel.CamelContext; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.support.DefaultExchange; -import org.apache.camel.support.DefaultMessage; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -39,7 +38,8 @@ public class RestProducerTest { DefaultExchange exchange = new DefaultExchange(camelContext); exchange.getMessage().setHeader("multiple", Arrays.asList("value1", "value2", "value3")); - assertEquals("param=value1¶m=value2¶m=value3", RestProducer.createQueryParameters("param={multiple}", exchange)); + assertEquals("param=value1¶m=value2¶m=value3", + RestProducer.createQueryParameters("param={multiple}", exchange)); } @Test