You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/01/27 13:06:02 UTC
camel git commit: CAMEL-10499 camel-sql - error in multiple dynamic
IN replacement
Repository: camel
Updated Branches:
refs/heads/camel-2.17.x 306663cce -> 4a83c2ad7
CAMEL-10499 camel-sql - error in multiple dynamic IN replacement
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4a83c2ad
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4a83c2ad
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4a83c2ad
Branch: refs/heads/camel-2.17.x
Commit: 4a83c2ad70f6c6f2fa8f533af44a79feb2c4970b
Parents: 306663c
Author: Tomohisa Igarashi <tm...@gmail.com>
Authored: Mon Nov 21 19:56:19 2016 +0900
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Jan 27 13:57:14 2017 +0100
----------------------------------------------------------------------
.../sql/DefaultSqlPrepareStatementStrategy.java | 4 +-
.../sql/SqlProducerInMultiExpressionTest.java | 38 ++++
.../SqlProducerInMultiQueryEndpointTest.java | 38 ++++
.../component/sql/SqlProducerInMultiTest.java | 172 +++++++++++++++++++
.../sql/createAndPopulateDatabase6.sql | 29 ++++
.../resources/sql/selectProjectsInMulti.sql | 6 +
.../sql/selectProjectsInMultiExpression.sql | 6 +
7 files changed, 292 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
index 755ef21..72f8ac3 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
@@ -75,7 +75,9 @@ public class DefaultSqlPrepareStatementStrategy implements SqlPrepareStatementSt
csb.append("\\?");
}
String replace = csb.toString();
- query = matcher.replaceAll(replace);
+ String foundEscaped = found.replace("$", "\\$").replace("{", "\\{").replace("}", "\\}");
+ Matcher paramMatcher = Pattern.compile("\\:\\?in\\:" + foundEscaped, Pattern.MULTILINE).matcher(query);
+ query = paramMatcher.replaceAll(replace);
}
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiExpressionTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiExpressionTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiExpressionTest.java
new file mode 100644
index 0000000..ecf9b04
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiExpressionTest.java
@@ -0,0 +1,38 @@
+/**
+ * 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 org.apache.camel.builder.RouteBuilder;
+
+public class SqlProducerInMultiExpressionTest extends SqlProducerInMultiTest {
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // required for the sql component
+ getContext().getComponent("sql", SqlComponent.class).setDataSource(db);
+
+ from("direct:query")
+ .to("sql:classpath:sql/selectProjectsInMultiExpression.sql")
+ .to("log:query")
+ .to("mock:query");
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiQueryEndpointTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiQueryEndpointTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiQueryEndpointTest.java
new file mode 100644
index 0000000..710c815
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiQueryEndpointTest.java
@@ -0,0 +1,38 @@
+/**
+ * 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 org.apache.camel.builder.RouteBuilder;
+
+public class SqlProducerInMultiQueryEndpointTest extends SqlProducerInMultiTest {
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // required for the sql component
+ getContext().getComponent("sql", SqlComponent.class).setDataSource(db);
+
+ from("direct:query")
+ .to("sql:select * from projects where project in (:#in:names) and license in (:#in:licenses) order by id")
+ .to("log:query")
+ .to("mock:query");
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiTest.java
new file mode 100644
index 0000000..88098e4
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlProducerInMultiTest.java
@@ -0,0 +1,172 @@
+/**
+ * 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.Arrays;
+import java.util.HashMap;
+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.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+public class SqlProducerInMultiTest extends CamelTestSupport {
+
+ EmbeddedDatabase db;
+
+ @Before
+ public void setUp() throws Exception {
+ db = new EmbeddedDatabaseBuilder()
+ .setType(EmbeddedDatabaseType.DERBY).addScript("sql/createAndPopulateDatabase6.sql").build();
+
+ super.setUp();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+
+ db.shutdown();
+ }
+
+ @Test
+ public void testQueryInArray() throws InterruptedException {
+ MockEndpoint mock = getMockEndpoint("mock:query");
+ mock.expectedMessageCount(1);
+
+ Map<String, Object> headers = new HashMap<>();
+ headers.put("names", new String[]{"Camel", "AMQ"});
+ headers.put("licenses", new String[]{"ASF", "XXX", "YYY"});
+ template.requestBodyAndHeaders("direct:query", "Hi there!", headers);
+
+ assertMockEndpointsSatisfied();
+
+ List list = mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ assertEquals(6, list.size());
+ Map row = (Map) list.get(0);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("ASF", row.get("license"));
+ row = (Map) list.get(1);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("XXX", row.get("license"));
+ row = (Map) list.get(2);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("YYY", row.get("license"));
+ row = (Map) list.get(3);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("ASF", row.get("license"));
+ row = (Map) list.get(4);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("XXX", row.get("license"));
+ row = (Map) list.get(5);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("YYY", row.get("license"));
+ }
+
+ @Test
+ public void testQueryInList() throws InterruptedException {
+ MockEndpoint mock = getMockEndpoint("mock:query");
+ mock.expectedMessageCount(1);
+
+ Map<String, Object> headers = new HashMap<>();
+ headers.put("names", Arrays.asList("Camel", "AMQ"));
+ headers.put("licenses", Arrays.asList("ASF", "XXX", "YYY"));
+
+ template.requestBodyAndHeaders("direct:query", "Hi there!", headers);
+
+ assertMockEndpointsSatisfied();
+
+ List list = mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ assertEquals(6, list.size());
+ Map row = (Map) list.get(0);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("ASF", row.get("license"));
+ row = (Map) list.get(1);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("XXX", row.get("license"));
+ row = (Map) list.get(2);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("YYY", row.get("license"));
+ row = (Map) list.get(3);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("ASF", row.get("license"));
+ row = (Map) list.get(4);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("XXX", row.get("license"));
+ row = (Map) list.get(5);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("YYY", row.get("license"));
+ }
+
+ @Test
+ public void testQueryInString() throws InterruptedException {
+ MockEndpoint mock = getMockEndpoint("mock:query");
+ mock.expectedMessageCount(1);
+
+ HashMap<String, Object> headers = new HashMap<>();
+ headers.put("names", "Camel,AMQ");
+ headers.put("licenses", "ASF,XXX,YYY");
+ template.requestBodyAndHeaders("direct:query", "Hi there!", headers);
+
+ assertMockEndpointsSatisfied();
+
+ List list = mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ assertEquals(6, list.size());
+ Map row = (Map) list.get(0);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("ASF", row.get("license"));
+ row = (Map) list.get(1);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("XXX", row.get("license"));
+ row = (Map) list.get(2);
+ assertEquals("Camel", row.get("PROJECT"));
+ assertEquals("YYY", row.get("license"));
+ row = (Map) list.get(3);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("ASF", row.get("license"));
+ row = (Map) list.get(4);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("XXX", row.get("license"));
+ row = (Map) list.get(5);
+ assertEquals("AMQ", row.get("PROJECT"));
+ assertEquals("YYY", row.get("license"));
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // required for the sql component
+ getContext().getComponent("sql", SqlComponent.class).setDataSource(db);
+
+ from("direct:query")
+ .to("sql:classpath:sql/selectProjectsInMulti.sql")
+ .to("log:query")
+ .to("mock:query");
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase6.sql
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase6.sql b/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase6.sql
new file mode 100644
index 0000000..de487b7
--- /dev/null
+++ b/components/camel-sql/src/test/resources/sql/createAndPopulateDatabase6.sql
@@ -0,0 +1,29 @@
+-- ------------------------------------------------------------------------
+-- 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.
+-- ------------------------------------------------------------------------
+
+-- START SNIPPET: e1
+create table projects (id integer primary key, project varchar(10), license varchar(5));
+insert into projects values (1, 'Camel', 'ASF');
+insert into projects values (2, 'Camel', 'XXX');
+insert into projects values (3, 'Camel', 'YYY');
+insert into projects values (4, 'Camel', 'ZZZ');
+insert into projects values (5, 'AMQ', 'ASF');
+insert into projects values (6, 'AMQ', 'XXX');
+insert into projects values (7, 'AMQ', 'YYY');
+insert into projects values (8, 'AMQ', 'ZZZ');
+insert into projects values (9, 'Linux', 'XXX');
+-- END SNIPPET: e1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/test/resources/sql/selectProjectsInMulti.sql
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/resources/sql/selectProjectsInMulti.sql b/components/camel-sql/src/test/resources/sql/selectProjectsInMulti.sql
new file mode 100644
index 0000000..df2a46d
--- /dev/null
+++ b/components/camel-sql/src/test/resources/sql/selectProjectsInMulti.sql
@@ -0,0 +1,6 @@
+-- this is a comment
+select *
+from projects
+where project in (:#in:names)
+and license in (:#in:licenses)
+order by id
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/4a83c2ad/components/camel-sql/src/test/resources/sql/selectProjectsInMultiExpression.sql
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/resources/sql/selectProjectsInMultiExpression.sql b/components/camel-sql/src/test/resources/sql/selectProjectsInMultiExpression.sql
new file mode 100644
index 0000000..99d20be
--- /dev/null
+++ b/components/camel-sql/src/test/resources/sql/selectProjectsInMultiExpression.sql
@@ -0,0 +1,6 @@
+-- this is a comment
+select *
+from projects
+where project in (:#in:${header.names})
+and license in (:#in:${header.licenses})
+order by id
\ No newline at end of file