Ability to substitute (SQL) IN lists with binds.
Change-Id: Ie2a525ce406c5c50988d69dbbfd8fd44f44dee7a
Reviewed-on: https://git.eclipse.org/r/42740
Tested-by: Hudson CI
Reviewed-by: Oli Schmid <oliver.schmid@bsiag.com>
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/ArrayInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/ArrayInput.java
index 054205d..f0fe563 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/ArrayInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/ArrayInput.java
@@ -76,7 +76,7 @@
}
@Override
- public boolean isJdbcBind() {
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
if (isBatch()) {
if (m_target.isPlainValue()) {
return false;
@@ -89,7 +89,7 @@
}
}
else {
- return false;
+ return m_target.getParsedAttribute() != null && sqlStyle.isCreatingInListGeneratingBind(m_array);
}
}
@@ -125,23 +125,30 @@
}
}
else {
- if (m_target.getParsedAttribute() != null) {
- String att = m_target.getParsedAttribute();
- String op = m_target.getParsedOp();
- m_target.setParsedAttribute(null);
- m_target.setParsedOp(null);
- if (op.equalsIgnoreCase("IN") || op.equalsIgnoreCase("=")) {
- m_target.setReplaceToken(sqlStyle.createInList(att, m_array));
- }
- else {
- m_target.setReplaceToken(sqlStyle.createNotInList(att, m_array));
- }
+ return applyMultiValued(sqlStyle);
+ }
+ }
+
+ private SqlBind applyMultiValued(ISqlStyle sqlStyle) throws ProcessingException {
+ if (m_target.getParsedAttribute() != null) {
+ String att = m_target.getParsedAttribute();
+ String op = m_target.getParsedOp();
+ m_target.setParsedAttribute(null);
+ m_target.setParsedOp(null);
+ if (op.equalsIgnoreCase("IN") || op.equalsIgnoreCase("=")) {
+ m_target.setReplaceToken(sqlStyle.createInList(att, m_array));
}
else {
- m_target.setReplaceToken(sqlStyle.toPlainText(m_array));
+ m_target.setReplaceToken(sqlStyle.createNotInList(att, m_array));
}
- return null;
+ if (sqlStyle.isCreatingInListGeneratingBind(m_array)) {
+ return sqlStyle.buildBindFor(m_array, null);
+ }
}
+ else {
+ m_target.setReplaceToken(sqlStyle.toPlainText(m_array));
+ }
+ return null;
}
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanArrayHolderInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanArrayHolderInput.java
index 7c90c22..293cfde 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanArrayHolderInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanArrayHolderInput.java
@@ -50,8 +50,8 @@
}
@Override
- public boolean isJdbcBind() {
- return m_delegate.isJdbcBind();
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
+ return m_delegate.isJdbcBind(sqlStyle);
}
@Override
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanPropertyInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanPropertyInput.java
index eb1ea18..8bf4852 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanPropertyInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/BeanPropertyInput.java
@@ -95,7 +95,7 @@
}
@Override
- public boolean isJdbcBind() {
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
if (isBatch()) {
if (m_target.isPlainValue()) {
return false;
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/FunctionInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/FunctionInput.java
index 8feb07c..d1d32bb 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/FunctionInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/FunctionInput.java
@@ -56,7 +56,7 @@
}
@Override
- public boolean isJdbcBind() {
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
if (m_target.isPlainToken()) {
return false;
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/IBindInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/IBindInput.java
index a08bca7..cd77d15 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/IBindInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/IBindInput.java
@@ -22,7 +22,7 @@
/**
* @return true if this bind corresponds to a jdbc "?" bind
*/
- boolean isJdbcBind();
+ boolean isJdbcBind(ISqlStyle sqlStyle);
int getJdbcBindIndex();
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/SingleInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/SingleInput.java
index f51d1a4..fcef823 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/SingleInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/SingleInput.java
@@ -50,7 +50,7 @@
}
@Override
- public boolean isJdbcBind() {
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
if (m_target.isPlainValue()) {
return false;
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/StatementProcessor.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/StatementProcessor.java
index 9b1b2d8..19ba3d4 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/StatementProcessor.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/StatementProcessor.java
@@ -135,12 +135,13 @@
m_ioTokens = m_bindModel.getIOTokens();
//
int jdbcBindIndex = 1;
+ ISqlStyle sqlStyle = m_callerService.getSqlStyle();
for (IToken t : m_ioTokens) {
IBindInput in = null;
IBindOutput out = null;
if (t.isInput()) {
in = createInput(t, m_bindBases);
- if (in.isJdbcBind()) {
+ if (in.isJdbcBind(sqlStyle)) {
in.setJdbcBindIndex(jdbcBindIndex);
}
m_inputList.add(in);
@@ -153,7 +154,7 @@
m_outputList.add(out);
}
//
- if ((in != null && in.isJdbcBind()) || (out != null && out.isJdbcBind())) {
+ if ((in != null && in.isJdbcBind(sqlStyle)) || (out != null && out.isJdbcBind())) {
jdbcBindIndex++;
}
}
@@ -619,16 +620,17 @@
private void prepareInputStatementAndBinds() throws ProcessingException {
// bind inputs and set replace token on inputs
m_currentInputBindMap = new TreeMap<Integer, SqlBind>();
+ ISqlStyle sqlStyle = m_callerService.getSqlStyle();
for (IBindInput in : m_inputList) {
- SqlBind bind = in.produceSqlBindAndSetReplaceToken(m_callerService.getSqlStyle());
- assert (bind != null) == in.isJdbcBind();
+ SqlBind bind = in.produceSqlBindAndSetReplaceToken(sqlStyle);
+ assert (bind != null) == in.isJdbcBind(sqlStyle);
if (bind != null) {
m_currentInputBindMap.put(in.getJdbcBindIndex(), bind);
}
}
// set replace token on outputs
for (IBindOutput out : m_outputList) {
- out.setReplaceToken(m_callerService.getSqlStyle());
+ out.setReplaceToken(sqlStyle);
}
m_currentInputStm = m_bindModel.getFilteredStatement();
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableBeanHolderInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableBeanHolderInput.java
index c19b473..b5266c4 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableBeanHolderInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableBeanHolderInput.java
@@ -67,7 +67,7 @@
}
@Override
- public boolean isJdbcBind() {
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
if (m_target.isPlainValue()) {
return false;
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableHolderInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableHolderInput.java
index 3774058..e04382e 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableHolderInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TableHolderInput.java
@@ -66,7 +66,7 @@
}
@Override
- public boolean isJdbcBind() {
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
if (m_target.isPlainValue()) {
return false;
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TriStateInput.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TriStateInput.java
index 1333c8f..9908a41 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TriStateInput.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/internal/exec/TriStateInput.java
@@ -50,8 +50,8 @@
}
@Override
- public boolean isJdbcBind() {
- return m_delegate.isJdbcBind();
+ public boolean isJdbcBind(ISqlStyle sqlStyle) {
+ return m_delegate.isJdbcBind(sqlStyle);
}
@Override
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/AbstractSqlStyle.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/AbstractSqlStyle.java
index 3d2d896..b17fd06 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/AbstractSqlStyle.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/AbstractSqlStyle.java
@@ -992,6 +992,11 @@
}
@Override
+ public boolean isCreatingInListGeneratingBind(Object array) {
+ return false;
+ }
+
+ @Override
public String getSysdateToken() {
return "SYSDATE";
}
diff --git a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/ISqlStyle.java b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/ISqlStyle.java
index e37b578..e5bfd66 100644
--- a/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/ISqlStyle.java
+++ b/org.eclipse.scout.rt.server/src/org/eclipse/scout/rt/server/services/common/jdbc/style/ISqlStyle.java
@@ -454,6 +454,14 @@
String createNotInList(String attribute, Object array);
/**
+ * Style can handle arrays as bind or as literal replacement.
+ *
+ * @return true if calls to {@link ISqlStyle.createInList(String attribute, Object array)} or {@link
+ * ISqlStyle.createNotInList(String attribute, Object array)} produce SQL binds.
+ */
+ boolean isCreatingInListGeneratingBind(Object array);
+
+ /**
* <code>P.NAME dateIsToday</code>
* <p>
* In an Oracle implementation this could be represented as