You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/01/28 11:44:12 UTC

svn commit: r1562030 - in /cayenne/main/trunk/cayenne-server/src: main/java/org/apache/cayenne/dba/derby/ test/java/org/apache/cayenne/access/

Author: aadamchik
Date: Tue Jan 28 10:44:11 2014
New Revision: 1562030

URL: http://svn.apache.org/r1562030
Log:
CAY-1480 Implement cross-db functional expressions

Added:
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLConditionTranslator.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressions.java
      - copied, changed from r1561514, cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsTemp.java
Removed:
    cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsTemp.java
Modified:
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java?rev=1562030&r1=1562029&r2=1562030&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java Tue Jan 28 10:44:11 2014
@@ -25,6 +25,8 @@ import java.sql.Types;
 import java.util.List;
 
 import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.jdbc.EJBQLTranslatorFactory;
+import org.apache.cayenne.access.jdbc.JdbcEJBQLTranslatorFactory;
 import org.apache.cayenne.access.trans.QualifierTranslator;
 import org.apache.cayenne.access.trans.QueryAssembler;
 import org.apache.cayenne.access.types.ByteType;
@@ -196,6 +198,16 @@ public class DerbyAdapter extends JdbcAd
         translator.setCaseInsensitive(caseInsensitiveCollations);
         return translator;
     }
+    
+    /**
+     * @since 3.1
+     */
+    @Override
+    protected EJBQLTranslatorFactory createEJBQLTranslatorFactory() {
+        JdbcEJBQLTranslatorFactory translatorFactory = new DerbyEJBQLTranslatorFactory();
+        translatorFactory.setCaseInsensitive(caseInsensitiveCollations);
+        return translatorFactory;
+    }
 
     @Override
     public MergerFactory mergerFactory() {

Added: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLConditionTranslator.java?rev=1562030&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLConditionTranslator.java (added)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLConditionTranslator.java Tue Jan 28 10:44:11 2014
@@ -0,0 +1,55 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.dba.derby;
+
+import org.apache.cayenne.access.jdbc.EJBQLConditionTranslator;
+import org.apache.cayenne.access.jdbc.EJBQLTranslationContext;
+import org.apache.cayenne.ejbql.EJBQLExpression;
+
+/**
+ * @since 3.1
+ */
+public class DerbyEJBQLConditionTranslator extends EJBQLConditionTranslator {
+
+    public DerbyEJBQLConditionTranslator(EJBQLTranslationContext context) {
+        super(context);
+    }
+
+    @Override
+    public boolean visitCurrentTimestamp(EJBQLExpression expression) {
+        context.append(" CURRENT_TIMESTAMP");
+        return false;
+    }
+
+    @Override
+    public boolean visitConcat(EJBQLExpression expression, int finishedChildIndex) {
+
+        // note that for CHAR columns, CONCAT would include padding ... Should
+        // we use TRIM here?
+        if (finishedChildIndex < 0) {
+            context.append(" (");
+        } else if (finishedChildIndex + 1 == expression.getChildrenCount()) {
+            context.append(")");
+        } else {
+            context.append(" ||");
+        }
+
+        return true;
+    }
+}

Added: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java?rev=1562030&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java (added)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyEJBQLTranslatorFactory.java Tue Jan 28 10:44:11 2014
@@ -0,0 +1,36 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.dba.derby;
+
+import org.apache.cayenne.access.jdbc.EJBQLTranslationContext;
+import org.apache.cayenne.access.jdbc.JdbcEJBQLTranslatorFactory;
+import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
+
+/**
+ * @since 3.1
+ */
+public class DerbyEJBQLTranslatorFactory extends JdbcEJBQLTranslatorFactory {
+
+    @Override
+    public EJBQLExpressionVisitor getConditionTranslator(EJBQLTranslationContext context) {
+        context.setCaseInsensitive(caseInsensitive);
+        return new DerbyEJBQLConditionTranslator(context);
+    }
+
+}

Copied: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressions.java (from r1561514, cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsTemp.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressions.java?p2=cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressions.java&p1=cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsTemp.java&r1=1561514&r2=1562030&rev=1562030&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressionsTemp.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLFunctionalExpressions.java Tue Jan 28 10:44:11 2014
@@ -41,7 +41,7 @@ import org.apache.cayenne.unit.di.server
 
 // TODO: renamed as it fails on DB's like Derby. See CAY-1480. 
 @UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextEJBQLFunctionalExpressionsTemp extends ServerCase {
+public class DataContextEJBQLFunctionalExpressions extends ServerCase {
 
     @Inject
     protected DBHelper dbHelper;
@@ -217,15 +217,15 @@ public class DataContextEJBQLFunctionalE
 
     public void testCONCAT() {
 
-        Artist a1 = context.newObject(Artist.class);
-        a1.setArtistName("a1");
+        Painting a1 = context.newObject(Painting.class);
+        a1.setPaintingTitle("a1");
 
-        Artist a2 = context.newObject(Artist.class);
-        a2.setArtistName("a2");
+        Painting a2 = context.newObject(Painting.class);
+        a2.setPaintingTitle("a2");
         context.commitChanges();
 
         EJBQLQuery query = new EJBQLQuery(
-                "SELECT a FROM Artist a WHERE CONCAT(a.artistName, a.artistName) = 'a1a1'");
+                "SELECT a FROM Painting a WHERE CONCAT(a.paintingTitle, a.paintingTitle) = 'a1a1'");
         List<?> objects = context.performQuery(query);
         assertEquals(1, objects.size());
         assertTrue(objects.contains(a1));