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;
+    }
 }