You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/01/17 08:58:37 UTC
cayenne git commit: Update ingres support
Repository: cayenne
Updated Branches:
refs/heads/master c4109dbe1 -> 1a3e8a7a9
Update ingres support
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/1a3e8a7a
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/1a3e8a7a
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/1a3e8a7a
Branch: refs/heads/master
Commit: 1a3e8a7a9291d2510efe5c2da5b16e293cf0d046
Parents: c4109db
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Jan 17 11:57:53 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Jan 17 11:57:53 2017 +0300
----------------------------------------------------------------------
.../cayenne/dba/ingres/IngresAdapter.java | 4 +-
.../dba/ingres/IngresQualifierTranslator.java | 50 +++++++++++++++++++-
.../org/apache/cayenne/dba/ingres/types.xml | 14 +++++-
.../cayenne/unit/IngresUnitDbAdapter.java | 5 ++
4 files changed, 69 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1a3e8a7a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
index 0ac444f..3808bed 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
@@ -112,8 +112,8 @@ public class IngresAdapter extends JdbcAdapter {
public void bindParameter(PreparedStatement statement, ParameterBinding binding)
throws SQLException, Exception {
- if (binding.getValue() == null && (binding.getType() == Types.BOOLEAN || binding.getType() == Types.BIT)) {
- statement.setNull(binding.getStatementPosition(), Types.VARCHAR);
+ if (binding.getValue() == null && (binding.getType() == Types.BIT)) {
+ statement.setNull(binding.getStatementPosition(), Types.SMALLINT);
} else {
super.bindParameter(statement, binding);
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1a3e8a7a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresQualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresQualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresQualifierTranslator.java
index 949155b..222fe96 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresQualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresQualifierTranslator.java
@@ -19,9 +19,13 @@
package org.apache.cayenne.dba.ingres;
+import java.io.IOException;
+
import org.apache.cayenne.access.translator.select.QueryAssembler;
import org.apache.cayenne.access.translator.select.TrimmingQualifierTranslator;
+import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.parser.ASTFunctionCall;
+import org.apache.cayenne.exp.parser.Node;
/**
* @since 4.0
@@ -33,8 +37,29 @@ class IngresQualifierTranslator extends TrimmingQualifierTranslator {
}
@Override
+ public void endNode(Expression node, Expression parentNode) {
+ super.endNode(node, parentNode);
+ if(node.getType() == Expression.FUNCTION_CALL) {
+ if("LOCATE".equals(((ASTFunctionCall)node).getFunctionName())) {
+ // order of args in ingres version of LOCATE is different, so swap them back
+ swapNodeChildren((ASTFunctionCall)node, 0, 1);
+ }
+ }
+ }
+
+ @Override
protected void appendFunction(ASTFunctionCall functionExpression) {
- if(!"CONCAT".equals(functionExpression.getFunctionName())) {
+ if("CONCAT".equals(functionExpression.getFunctionName())) {
+ // noop
+ } else if("LOCATE".equals(functionExpression.getFunctionName())) {
+ // order of args in ingres version of LOCATE is different
+ // LOCATE(substr, str) -> LOCATE(str, substr)
+ out.append("LOCATE");
+ swapNodeChildren(functionExpression, 0, 1);
+ } else if("TRIM".equals(functionExpression.getFunctionName())) {
+ // simple TRIM removes only trailing spaces
+ out.append("LTRIM(RTRIM");
+ } else {
super.appendFunction(functionExpression);
}
}
@@ -49,11 +74,34 @@ class IngresQualifierTranslator extends TrimmingQualifierTranslator {
}
@Override
+ protected void appendFunctionArg(Object value, ASTFunctionCall functionExpression) throws IOException {
+ if("SUBSTRING".equals(functionExpression.getFunctionName())) {
+ out.append("CAST(");
+ super.appendFunctionArg(value, functionExpression);
+ clearLastFunctionArgDivider(functionExpression);
+ out.append(" AS INTEGER)");
+ appendFunctionArgDivider(functionExpression);
+ } else {
+ super.appendFunctionArg(value, functionExpression);
+ }
+ }
+
+ @Override
protected void clearLastFunctionArgDivider(ASTFunctionCall functionExpression) {
if("CONCAT".equals(functionExpression.getFunctionName())) {
out.delete(out.length() - " + ".length(), out.length());
} else {
super.clearLastFunctionArgDivider(functionExpression);
+ if("TRIM".equals(functionExpression.getFunctionName())) {
+ out.append(")");
+ }
}
}
+
+ private void swapNodeChildren(Node node, int i, int j) {
+ Node ni = node.jjtGetChild(i);
+ Node nj = node.jjtGetChild(j);
+ node.jjtAddChild(ni, j);
+ node.jjtAddChild(nj, i);
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1a3e8a7a/cayenne-server/src/main/resources/org/apache/cayenne/dba/ingres/types.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/resources/org/apache/cayenne/dba/ingres/types.xml b/cayenne-server/src/main/resources/org/apache/cayenne/dba/ingres/types.xml
index e09e47e..9cb4a25 100644
--- a/cayenne-server/src/main/resources/org/apache/cayenne/dba/ingres/types.xml
+++ b/cayenne-server/src/main/resources/org/apache/cayenne/dba/ingres/types.xml
@@ -36,14 +36,20 @@
<db-type name="BLOB"/>
</jdbc-type>
<jdbc-type name="BOOLEAN">
- <db-type name="TINYINT"/>
+ <db-type name="BOOLEAN"/>
</jdbc-type>
<jdbc-type name="CHAR">
<db-type name="CHAR"/>
</jdbc-type>
+ <jdbc-type name="NCHAR">
+ <db-type name="NCHAR"/>
+ </jdbc-type>
<jdbc-type name="CLOB">
<db-type name="CLOB"/>
</jdbc-type>
+ <jdbc-type name="NCLOB">
+ <db-type name="LONG NVARCHAR"/>
+ </jdbc-type>
<jdbc-type name="DATALINK">
<db-type name="DATALINK"/>
</jdbc-type>
@@ -71,6 +77,9 @@
<jdbc-type name="LONGVARCHAR">
<db-type name="LONG VARCHAR"/>
</jdbc-type>
+ <jdbc-type name="LONGNVARCHAR">
+ <db-type name="LONG NVARCHAR"/>
+ </jdbc-type>
<jdbc-type name="NUMERIC">
<db-type name="NUMERIC"/>
</jdbc-type>
@@ -102,4 +111,7 @@
<jdbc-type name="VARCHAR">
<db-type name="VARCHAR"/>
</jdbc-type>
+ <jdbc-type name="NVARCHAR">
+ <db-type name="NVARCHAR"/>
+ </jdbc-type>
</types>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/1a3e8a7a/cayenne-server/src/test/java/org/apache/cayenne/unit/IngresUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/IngresUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/IngresUnitDbAdapter.java
index 2c72430..e0f913f 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/IngresUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/IngresUnitDbAdapter.java
@@ -41,4 +41,9 @@ public class IngresUnitDbAdapter extends UnitDbAdapter {
public boolean supportsLobs() {
return true;
}
+
+ @Override
+ public boolean supportsExpressionInHaving() {
+ return false;
+ }
}