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 47fc4aec108 camel-sql - Add test based on user forum issue
47fc4aec108 is described below

commit 47fc4aec108eedd1ec1d715effc4a42eb8321d2d
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Mon Jun 10 17:28:08 2024 +0200

    camel-sql - Add test based on user forum issue
---
 .../camel-sql/src/main/docs/sql-component.adoc     |  12 ++
 .../camel/component/sql/SqlProducerInBodyTest.java | 130 +++++++++++++++++++++
 .../test/resources/sql/selectProjectsInBody.sql    |  22 ++++
 3 files changed, 164 insertions(+)

diff --git a/components/camel-sql/src/main/docs/sql-component.adoc 
b/components/camel-sql/src/main/docs/sql-component.adoc
index d2016b0d357..9ba92b2f717 100644
--- a/components/camel-sql/src/main/docs/sql-component.adoc
+++ b/components/camel-sql/src/main/docs/sql-component.adoc
@@ -357,6 +357,18 @@ from("direct:query")
     .to("mock:query");
 ----
 
+If the dynamic list of values is stored in the message body, you can use 
`(:#in:$+{body}+)` to
+refer to the message body, such as:
+
+[source,sql]
+----
+-- this is a comment
+select *
+from projects
+where project in (:#in:${body})
+order by id
+----
+
 == Using the JDBC-based idempotent repository
 
 In this section, we will use the JDBC-based idempotent repository.
diff --git 
a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInBodyTest.java
 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInBodyTest.java
new file mode 100644
index 00000000000..899aedaf8a2
--- /dev/null
+++ 
b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInBodyTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.camel.component.sql;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class SqlProducerInBodyTest extends CamelTestSupport {
+
+    EmbeddedDatabase db;
+
+    @Override
+    @BeforeEach
+    public void setUp() throws Exception {
+        db = new EmbeddedDatabaseBuilder()
+                .setName(getClass().getSimpleName())
+                .setType(EmbeddedDatabaseType.H2)
+                .addScript("sql/createAndPopulateDatabase.sql").build();
+
+        super.setUp();
+    }
+
+    @Override
+    @AfterEach
+    public void tearDown() throws Exception {
+        super.tearDown();
+
+        if (db != null) {
+            db.shutdown();
+        }
+    }
+
+    @Test
+    public void testQueryInArray() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+        template.requestBody("direct:query", new String[] { "Camel", "AMQ" });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        List list = 
mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+        assertEquals(2, list.size());
+        Map row = (Map) list.get(0);
+        assertEquals("Camel", row.get("PROJECT"));
+        row = (Map) list.get(1);
+        assertEquals("AMQ", row.get("PROJECT"));
+    }
+
+    @Test
+    public void testQueryInList() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+        List<String> names = new ArrayList<>();
+        names.add("Camel");
+        names.add("AMQ");
+
+        template.requestBody("direct:query", names);
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        List list = 
mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+        assertEquals(2, list.size());
+        Map row = (Map) list.get(0);
+        assertEquals("Camel", row.get("PROJECT"));
+        row = (Map) list.get(1);
+        assertEquals("AMQ", row.get("PROJECT"));
+    }
+
+    @Test
+    public void testQueryInString() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+        template.requestBody("direct:query", "Camel,AMQ");
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        List list = 
mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+        assertEquals(2, list.size());
+        Map row = (Map) list.get(0);
+        assertEquals("Camel", row.get("PROJECT"));
+        row = (Map) list.get(1);
+        assertEquals("AMQ", row.get("PROJECT"));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                // required for the sql component
+                getContext().getComponent("sql", 
SqlComponent.class).setDataSource(db);
+
+                from("direct:query")
+                        .to("sql:classpath:sql/selectProjectsInBody.sql")
+                        .to("log:query")
+                        .to("mock:query");
+            }
+        };
+    }
+}
diff --git 
a/components/camel-sql/src/test/resources/sql/selectProjectsInBody.sql 
b/components/camel-sql/src/test/resources/sql/selectProjectsInBody.sql
new file mode 100644
index 00000000000..eefe797bd5f
--- /dev/null
+++ b/components/camel-sql/src/test/resources/sql/selectProjectsInBody.sql
@@ -0,0 +1,22 @@
+--
+-- 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.
+--
+
+-- this is a comment
+select *
+from projects
+where project in (:#in:${body})
+order by id
\ No newline at end of file

Reply via email to