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 2023/03/08 09:55:03 UTC

[camel] branch camel-3.x updated: Adding support to named parameters on queries provided by using the C… (#9480)

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

davsclaus pushed a commit to branch camel-3.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-3.x by this push:
     new a561c7260ae Adding support to named parameters on queries provided by using the C… (#9480)
a561c7260ae is described below

commit a561c7260ae078e9e1ef6e7bbdcb9dc1fc0ddaeb
Author: Adriano Machado <60...@users.noreply.github.com>
AuthorDate: Wed Mar 8 04:54:47 2023 -0500

    Adding support to named parameters on queries provided by using the C… (#9480)
    
    * Adding support to named parameters on queries provided by using the CamelSqlQuery header
    
    * Fixing failing test
    
    ---------
    
    Co-authored-by: Adriano Machado <ad...@redhat.com>
---
 .../org/apache/camel/component/sql/SqlHelper.java  | 30 +++++++++++++---------
 .../apache/camel/component/sql/SqlProducer.java    |  7 ++++-
 .../apache/camel/component/sql/SqlRouteTest.java   | 15 +++++++++++
 3 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java
index 12ff82a0b6d..28df085074f 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlHelper.java
@@ -39,20 +39,26 @@ public final class SqlHelper {
             try (InputStream is = ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, query)) {
                 answer = camelContext.getTypeConverter().mandatoryConvertTo(String.class, is);
             }
-            if (placeholder != null) {
-                answer = answer.replaceAll(placeholder, "?");
-            }
-            // skip lines with comments
-            StringJoiner sj = new StringJoiner("\n");
-            String[] lines = answer.split("\n");
-            for (String line : lines) {
-                String trim = line.trim();
-                if (!trim.isEmpty() && !trim.startsWith("--")) {
-                    sj.add(line);
-                }
+            answer = resolvePlaceholders(answer, placeholder);
+        }
+        return answer;
+    }
+
+    public static String resolvePlaceholders(String query, String placeholder) {
+        String answer = query;
+        if (placeholder != null) {
+            answer = answer.replaceAll(placeholder, "?");
+        }
+        // skip lines with comments
+        StringJoiner sj = new StringJoiner("\n");
+        String[] lines = answer.split("\n");
+        for (String line : lines) {
+            String trim = line.trim();
+            if (!trim.isEmpty() && !trim.startsWith("--")) {
+                sj.add(line);
             }
-            answer = sj.toString();
         }
+        answer = sj.toString();
         return answer;
     }
 }
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
index 7af835a77fb..60ce63382a5 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/SqlProducer.java
@@ -98,7 +98,12 @@ public class SqlProducer extends DefaultProducer {
             sql = exchange.getIn().getBody(String.class);
         } else {
             String queryHeader = exchange.getIn().getHeader(SqlConstants.SQL_QUERY, String.class);
-            sql = queryHeader != null ? queryHeader : resolvedQuery;
+            if (queryHeader != null) {
+                String placeholder = getEndpoint().isUsePlaceholder() ? getEndpoint().getPlaceholder() : null;
+                sql = SqlHelper.resolvePlaceholders(queryHeader, placeholder);
+            } else {
+                sql = resolvedQuery;
+            }
         }
         final String preparedQuery
                 = sqlPrepareStatementStrategy.prepareQuery(sql, getEndpoint().isAllowNamedParameters(), exchange);
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
index 6e2381cbb8b..317c6445c26 100644
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/SqlRouteTest.java
@@ -23,9 +23,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -82,6 +84,19 @@ public class SqlRouteTest extends CamelTestSupport {
         row = assertIsInstanceOf(Map.class, received.get(0));
         assertEquals("Linux", row.get("PROJECT"));
         assertEquals("XXX", row.get("license"));
+        mock.reset();
+
+        mock.expectedMessageCount(1);
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(SqlConstants.SQL_QUERY, "select * from projects where id = :#id order by id");
+        exchange.getMessage().setHeader("id", 1);
+        template.send("direct:simple", exchange);
+        mock.assertIsSatisfied();
+        received = assertIsInstanceOf(List.class, mock.getReceivedExchanges().get(0).getIn().getBody());
+        row = assertIsInstanceOf(Map.class, received.get(0));
+        assertEquals(1, row.get("id"));
+        assertEquals("ASF", row.get("license"));
+        mock.reset();
     }
 
     @Test