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/06/11 15:09:38 UTC
camel git commit: CAMEL-11393: sql-stored - Add support for typeNames
and scale in grammar * Added docs and output parameter scale and type name
Repository: camel
Updated Branches:
refs/heads/master b5341150a -> 54adc7ee9
CAMEL-11393: sql-stored - Add support for typeNames and scale in grammar
* Added docs and output parameter scale and type name
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/54adc7ee
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/54adc7ee
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/54adc7ee
Branch: refs/heads/master
Commit: 54adc7ee9afcf3c49d696c843c0e48d23cc9e005
Parents: b534115
Author: Sami Nurminen <sn...@gmail.com>
Authored: Sat Jun 10 21:33:49 2017 +0300
Committer: Sami Nurminen <sn...@gmail.com>
Committed: Sat Jun 10 21:38:11 2017 +0300
----------------------------------------------------------------------
.../src/main/docs/sql-stored-component.adoc | 56 ++++++++++++++++++++
.../BatchCallableStatementCreatorFactory.java | 12 ++++-
.../sql/stored/TemplateStoredProcedure.java | 11 +++-
.../sql/stored/template/ast/OutParameter.java | 20 ++++---
.../stored/template/generated/SSPTParser.java | 43 +++++++++------
.../sql/stored/template/grammar/sspt.jj | 7 +--
.../camel/component/sql/stored/ParserTest.java | 28 ++++++++--
7 files changed, 145 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/main/docs/sql-stored-component.adoc
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/docs/sql-stored-component.adoc b/components/camel-sql/src/main/docs/sql-stored-component.adoc
index 453afd9..a22d715 100644
--- a/components/camel-sql/src/main/docs/sql-stored-component.adoc
+++ b/components/camel-sql/src/main/docs/sql-stored-component.adoc
@@ -132,6 +132,62 @@ In SQL term the stored procedure could be declared as:
CREATE PROCEDURE SUBNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER)
------------------------------------------------------------------------------
+IN parameters take four parts separated by a space: parameter name, SQL type(with scale), type name and value source.
+
+Parameter name is optional and will be auto generated if not provided. It must be given between quotes(').
+
+SQL type is required and can be a integer(positive or negative) or reference to integer field in some class.
+If SQL type contains a dot then component tries resolve that class and read the given field. For example
+SQL type com.Foo.INTEGER is read from the field INTEGER of class com.Foo. If the type doesn't
+contain comma then class to resolve the integer value will be java.sql.Types.
+Type can be postfixed by scale for example DECIMAL(10) would mean java.sql.Types.DECIMAL with scale 10.
+
+Type name is optional and must be given between quotes(').
+
+Value source is required. Value source populates parameter value from the Exchange.
+It can be either a Simple expression or header location i.e. :#<header name>. For example
+Simple expression ${header.val} would mean that parameter value will be read from the header "val".
+Header location expression :#val would have identical effect.
+
+[source,java]
+----------------------------------------------------------------------------------------------------------
+<to uri="sql-stored:MYFUNC('param1' org.example.Types.INTEGER(10) ${header.srcValue})"/>
+----------------------------------------------------------------------------------------------------------
+URI means that the stored procedure will be called with parameter name "param1",
+it's SQL type is read from field INTEGER of class org.example.Types and scale will be set to 10.
+Input value for the parameter is passed from the header "srcValue".
+
+[source,java]
+----------------------------------------------------------------------------------------------------------
+<to uri="sql-stored:MYFUNC('param1' 100 'mytypename' ${header.srcValue})"/>
+----------------------------------------------------------------------------------------------------------
+URI is identical to previous on except SQL-type is 100 and type name is "mytypename".
+
+Actual call will be done using org.springframework.jdbc.core.SqlParameter.
+
+OUT parameters work same way as IN parameters and they they contain three parts: SQL type(with scale), type name and output parameter name.
+
+SQL type works as in IN parameters.
+
+Type name is optional and work as in IN parameters.
+
+Output parameter name is used for the e OUT parameter name and header where the result will be stored there also.
+
+[source,java]
+----------------------------------------------------------------------------------------------------------
+<to uri="sql-stored:MYFUNC(OUT org.example.Types.DECIMAL(10) outheader1)"/>
+----------------------------------------------------------------------------------------------------------
+URI means that OUT parameter's name is "outheader1" and result will be but into header "outheader1".
+
+[source,java]
+----------------------------------------------------------------------------------------------------------
+<to uri="sql-stored:MYFUNC(OUT org.example.Types.NUMERIC(10) 'mytype' outheader1)"/>
+----------------------------------------------------------------------------------------------------------
+This is identical to previous one but type name will be "mytype".
+
+Actual call will be done using org.springframework.jdbc.core.SqlOutParameter.
+
+
### Camel Sql Starter
A starter module is available to spring-boot users. When using the starter,
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
index 6654007..24d087a 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
@@ -75,7 +75,17 @@ public class BatchCallableStatementCreatorFactory {
for (Object parameter : template.getParameterList()) {
if (parameter instanceof InputParameter) {
InputParameter inputParameter = (InputParameter) parameter;
- params.add(new SqlParameter(inputParameter.getName(), inputParameter.getSqlType()));
+
+ SqlParameter sqlParameter;
+ if (inputParameter.getScale() != null) {
+ sqlParameter = new SqlParameter(inputParameter.getName(), inputParameter.getSqlType(), inputParameter.getScale());
+ } else if (inputParameter.getTypeName() != null) {
+ sqlParameter = new SqlParameter(inputParameter.getName(), inputParameter.getSqlType(), inputParameter.getTypeName());
+ } else {
+ sqlParameter = new SqlParameter(inputParameter.getName(), inputParameter.getSqlType());
+ }
+
+ params.add(sqlParameter);
} else {
throw new UnsupportedOperationException("Only IN parameters supported by batch!");
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
index 6113d35..7f38f95 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
@@ -64,7 +64,16 @@ public class TemplateStoredProcedure extends StoredProcedure {
} else if (parameter instanceof OutParameter) {
OutParameter outParameter = (OutParameter) parameter;
- declareParameter(new SqlOutParameter(outParameter.getOutValueMapKey(), outParameter.getSqlType()));
+ SqlOutParameter sqlOutParameter;
+ if (outParameter.getScale() != null) {
+ sqlOutParameter = new SqlOutParameter(outParameter.getOutValueMapKey(), outParameter.getSqlType(), outParameter.getScale());
+ } else if (outParameter.getTypeName() != null) {
+ sqlOutParameter = new SqlOutParameter(outParameter.getOutValueMapKey(), outParameter.getSqlType(), outParameter.getTypeName());
+ } else {
+ sqlOutParameter = new SqlOutParameter(outParameter.getOutValueMapKey(), outParameter.getSqlType());
+ }
+
+ declareParameter(sqlOutParameter);
setFunction(false);
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
index 82b67a1..f48ac10 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
@@ -18,18 +18,16 @@ package org.apache.camel.component.sql.stored.template.ast;
public class OutParameter {
- private String name;
private int sqlType;
private String outValueMapKey;
+ private Integer scale;
+ private String typeName;
- public OutParameter(String name, int sqlType, String outValueMapKey) {
- this.name = name;
+ public OutParameter(int sqlType, String outValueMapKey, Integer scale, String typeName) {
this.sqlType = sqlType;
this.outValueMapKey = outValueMapKey;
- }
-
- public String getName() {
- return name;
+ this.scale = scale;
+ this.typeName = typeName;
}
public int getSqlType() {
@@ -39,4 +37,12 @@ public class OutParameter {
public String getOutValueMapKey() {
return outValueMapKey;
}
+
+ public Integer getScale() {
+ return scale;
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
index f48fbac..92bbf21 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
@@ -123,22 +123,31 @@ public class SSPTParser implements SSPTParserConstants {
final public OutParameter OutParameter() throws ParseException {
Token sqlTypeToken;
- String name = null;
String outValueMapKey;
+ Integer scale = null;
+ String typeName = null;
jj_consume_token(2);
+ sqlTypeToken = ParameterSqlType();
switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
- case PARAMETER_NAME:
- name = ParameterName();
- jj_consume_token(1);
+ case SCALE:
+ scale = Scale();
break;
default:
jj_la1[6] = jj_gen;
;
}
- sqlTypeToken = ParameterSqlType();
jj_consume_token(1);
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case PARAMETER_NAME:
+ typeName = ParameterName();
+ jj_consume_token(1);
+ break;
+ default:
+ jj_la1[7] = jj_gen;
+ ;
+ }
outValueMapKey = OutHeader();
- {if (true) return new OutParameter(name == null ? createNextParameterName() : name, ParseHelper.parseSqlType(sqlTypeToken, classResolver), outValueMapKey);}
+ {if (true) return new OutParameter(ParseHelper.parseSqlType(sqlTypeToken, classResolver), outValueMapKey, scale, typeName);}
throw new Error("Missing return statement in function");
}
@@ -167,7 +176,7 @@ public class SSPTParser implements SSPTParserConstants {
t = jj_consume_token(IDENTIFIER);
break;
default:
- jj_la1[7] = jj_gen;
+ jj_la1[8] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -194,7 +203,7 @@ public class SSPTParser implements SSPTParserConstants {
{if (true) return ret;}
break;
default:
- jj_la1[8] = jj_gen;
+ jj_la1[9] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
@@ -210,13 +219,13 @@ public class SSPTParser implements SSPTParserConstants {
public Token jj_nt;
private int jj_ntk;
private int jj_gen;
- final private int[] jj_la1 = new int[9];
+ final private int[] jj_la1 = new int[10];
static private int[] jj_la1_0;
static {
jj_la1_init_0();
}
private static void jj_la1_init_0() {
- jj_la1_0 = new int[] {0x400,0x18014,0x18014,0x8000,0x8,0x8000,0x8000,0x10010,0x6000,};
+ jj_la1_0 = new int[] {0x400,0x18014,0x18014,0x8000,0x8,0x8000,0x8,0x8000,0x10010,0x6000,};
}
/** Constructor with InputStream. */
@@ -230,7 +239,7 @@ public class SSPTParser implements SSPTParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 9; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 10; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
@@ -244,7 +253,7 @@ public class SSPTParser implements SSPTParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 9; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 10; i++) jj_la1[i] = -1;
}
/** Constructor. */
@@ -254,7 +263,7 @@ public class SSPTParser implements SSPTParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 9; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 10; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
@@ -264,7 +273,7 @@ public class SSPTParser implements SSPTParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 9; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 10; i++) jj_la1[i] = -1;
}
/** Constructor with generated Token Manager. */
@@ -273,7 +282,7 @@ public class SSPTParser implements SSPTParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 9; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 10; i++) jj_la1[i] = -1;
}
/** Reinitialise. */
@@ -282,7 +291,7 @@ public class SSPTParser implements SSPTParserConstants {
token = new Token();
jj_ntk = -1;
jj_gen = 0;
- for (int i = 0; i < 9; i++) jj_la1[i] = -1;
+ for (int i = 0; i < 10; i++) jj_la1[i] = -1;
}
private Token jj_consume_token(int kind) throws ParseException {
@@ -338,7 +347,7 @@ public class SSPTParser implements SSPTParserConstants {
la1tokens[jj_kind] = true;
jj_kind = -1;
}
- for (int i = 0; i < 9; i++) {
+ for (int i = 0; i < 10; i++) {
if (jj_la1[i] == jj_gen) {
for (int j = 0; j < 32; j++) {
if ((jj_la1_0[i] & (1<<j)) != 0) {
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
index ee43e42..96256ee 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
@@ -93,14 +93,15 @@ InputParameter InputParameter() :
OutParameter OutParameter() :
{
Token sqlTypeToken;
- String name = null;
String outValueMapKey;
+ Integer scale = null;
+ String typeName = null;
}
{
- ("OUT " (name = ParameterName() " ")? sqlTypeToken = ParameterSqlType() " " outValueMapKey =
+ ("OUT " sqlTypeToken = ParameterSqlType() (scale = Scale())? " " (typeName = ParameterName() " ")? outValueMapKey =
OutHeader())
{
- return new OutParameter(name == null ? createNextParameterName() : name, ParseHelper.parseSqlType(sqlTypeToken, classResolver), outValueMapKey);
+ return new OutParameter(ParseHelper.parseSqlType(sqlTypeToken, classResolver), outValueMapKey, scale, typeName);
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/54adc7ee/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
index 9c15e18..d55c8eb 100644
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
@@ -75,7 +75,6 @@ public class ParserTest extends CamelTestSupport {
Assert.assertEquals(BigInteger.valueOf(2L), param3.getValueExtractor().eval(exchange, null));
OutParameter sptpOutputNode = (OutParameter) template.getParameterList().get(3);
- Assert.assertEquals("_3", sptpOutputNode.getName());
Assert.assertEquals(Types.INTEGER, sptpOutputNode.getSqlType());
Assert.assertEquals("header1", sptpOutputNode.getOutValueMapKey());
}
@@ -194,16 +193,30 @@ public class ParserTest extends CamelTestSupport {
@Test
public void testOracleTypesOut() {
- Template template = parser.parseTemplate("FOO(OUT 'p_error_cd' 1 header1)");
+ Template template = parser.parseTemplate("FOO(OUT 1 p_error_cd)");
assertEquals(1, ((OutParameter) template.getParameterList().get(0)).getSqlType());
}
@Test
public void testOracleTypesOutParameterVendor() {
- Template template = parser.parseTemplate("FOO(OUT 'p_error_cd' org.apache.camel.component.sql.stored.CustomType.INTEGER header1)");
+ Template template = parser.parseTemplate("FOO(OUT org.apache.camel.component.sql.stored.CustomType.INTEGER p_error_cd)");
assertEquals(1, ((OutParameter) template.getParameterList().get(0)).getSqlType());
}
+ @Test
+ public void testOracleTypesOutParameterVendorWithScale() {
+ Template template = parser.parseTemplate("FOO(OUT org.apache.camel.component.sql.stored.CustomType.INTEGER(11) p_error_cd)");
+ assertEquals(Integer.valueOf(11), ((OutParameter) template.getParameterList().get(0)).getScale());
+ }
+
+ @Test
+ public void testOracleTypesOutParameterVendorWithTypeName() {
+ Template template = parser.parseTemplate("FOO(OUT org.apache.camel.component.sql.stored.CustomType.INTEGER 'mytype' p_error_cd)");
+ assertEquals("mytype", ((OutParameter) template.getParameterList().get(0)).getTypeName());
+ assertEquals("p_error_cd", ((OutParameter) template.getParameterList().get(0)).getOutValueMapKey());
+
+ }
+
@Test
public void testOracleTypesNumeric() {
@@ -211,5 +224,14 @@ public class ParserTest extends CamelTestSupport {
assertEquals(Integer.valueOf(10), ((InputParameter) template.getParameterList().get(0)).getScale());
}
+ @Test
+ public void examplesSyntaxTest() {
+ parser.parseTemplate("SUBNUMBERS(INTEGER ${headers.num1},INTEGER ${headers.num2},OUT INTEGER resultofsub)");
+ parser.parseTemplate("MYFUNC('param1' java.sql.Types.INTEGER(10) ${header.srcValue})");
+ parser.parseTemplate("MYFUNC('param1' 100 'mytypename' ${header.srcValue})");
+ parser.parseTemplate("MYFUNC(OUT java.sql.Types.DECIMAL(10) outheader1)");
+ parser.parseTemplate("MYFUNC(OUT java.sql.Types.NUMERIC(10) 'mytype' outheader1)");
+ }
+
}