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 2008/01/06 17:18:48 UTC

svn commit: r609339 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/exp/ main/java/org/apache/cayenne/exp/parser/ test/java/org/apache/cayenne/exp/

Author: aadamchik
Date: Sun Jan  6 08:18:47 2008
New Revision: 609339

URL: http://svn.apache.org/viewvc?rev=609339&view=rev
Log:
CAY-956 Converter between Expression and EJBQL Expression
(everything but DB path)

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTFalse.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNamedParameter.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNegate.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNot.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTTrue.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/Expression.java Sun Jan  6 08:18:47 2008
@@ -545,10 +545,27 @@
      */
     public abstract void encodeAsString(PrintWriter pw);
 
+    /**
+     * Stores a String representation of Expression as EJBQL using a provided PrintWriter.
+     * DB path expressions produce non-standard EJBQL path expressions.
+     * 
+     * @since 3.0
+     */
+    public abstract void encodeAsEJBQL(PrintWriter pw, String rootId);
+
     public String toString() {
         StringWriter buffer = new StringWriter();
         PrintWriter pw = new PrintWriter(buffer);
         encodeAsString(pw);
+        pw.close();
+        buffer.flush();
+        return buffer.toString();
+    }
+    
+    public String toEJBQL(String rootId) {
+        StringWriter buffer = new StringWriter();
+        PrintWriter pw = new PrintWriter(buffer);
+        encodeAsEJBQL(pw, rootId);
         pw.close();
         buffer.flush();
         return buffer.toString();

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java Sun Jan  6 08:18:47 2008
@@ -88,8 +88,20 @@
         return copy;
     }
 
+    @Override
     public void encodeAsString(PrintWriter pw) {
         pw.print("db:");
+        pw.print(path);
+    }
+    
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        // warning: non-standard EJBQL...
+        pw.print(rootId);
+        pw.print(".db:");
         pw.print(path);
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTFalse.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTFalse.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTFalse.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTFalse.java Sun Jan  6 08:18:47 2008
@@ -68,5 +68,12 @@
     public void encodeAsString(PrintWriter pw) {
         pw.print("false");
     }
-
+    
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        encodeAsString(pw);
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNamedParameter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNamedParameter.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNamedParameter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNamedParameter.java Sun Jan  6 08:18:47 2008
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.exp.parser;
 
+import java.io.PrintWriter;
+
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.ExpressionParameter;
@@ -68,5 +70,22 @@
         }
 
         super.setValue(new ExpressionParameter(name));
+    }
+    
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        if(value != null) {
+            String valueString = value.toString();
+            if(valueString.length() > 1 && valueString.charAt(0) == '$') {
+                pw.print(':');
+                pw.print(valueString.substring(1));
+                return;
+            }
+        }
+        
+        super.encodeAsEJBQL(pw, rootId);
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNegate.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNegate.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNegate.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNegate.java Sun Jan  6 08:18:47 2008
@@ -17,7 +17,6 @@
  *  under the License.
  ****************************************************************/
 
-
 package org.apache.cayenne.exp.parser;
 
 import java.io.PrintWriter;
@@ -33,6 +32,7 @@
  * @author Andrus Adamchik
  */
 public class ASTNegate extends SimpleNode {
+
     ASTNegate(int id) {
         super(id);
     }
@@ -70,9 +70,8 @@
 
             SimpleNode child = (SimpleNode) children[0];
 
-            // don't call super - we have our own parenthesis policy 
-            boolean useParen =
-                parent != null
+            // don't call super - we have our own parenthesis policy
+            boolean useParen = parent != null
                     && !((child instanceof ASTScalar) || (child instanceof ASTPath));
             if (useParen) {
                 pw.print("(");
@@ -86,9 +85,35 @@
         }
     }
 
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        if ((children != null) && (children.length > 0)) {
+            pw.print("-");
+
+            SimpleNode child = (SimpleNode) children[0];
+
+            // don't call super - we have our own parenthesis policy
+            boolean useParen = parent != null
+                    && !((child instanceof ASTScalar) || (child instanceof ASTPath));
+            if (useParen) {
+                pw.print("(");
+            }
+
+            child.encodeAsEJBQL(pw, rootId);
+
+            if (useParen) {
+                pw.print(')');
+            }
+        }
+    }
+
     protected String getExpressionOperator(int index) {
-        throw new UnsupportedOperationException(
-            "No operator for '" + ExpressionParserTreeConstants.jjtNodeName[id] + "'");
+        throw new UnsupportedOperationException("No operator for '"
+                + ExpressionParserTreeConstants.jjtNodeName[id]
+                + "'");
     }
 
     public int getType() {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNot.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNot.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNot.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTNot.java Sun Jan  6 08:18:47 2008
@@ -53,8 +53,8 @@
         }
 
         return ConversionUtil.toBoolean(evaluateChild(0, o))
-            ? Boolean.FALSE
-            : Boolean.TRUE;
+                ? Boolean.FALSE
+                : Boolean.TRUE;
     }
 
     /**
@@ -73,8 +73,17 @@
         super.encodeAsString(pw);
     }
 
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        encodeAsString(pw);
+    }
+
     protected String getExpressionOperator(int index) {
-        throw new UnsupportedOperationException(
-            "No operator for '" + ExpressionParserTreeConstants.jjtNodeName[id] + "'");
+        throw new UnsupportedOperationException("No operator for '"
+                + ExpressionParserTreeConstants.jjtNodeName[id]
+                + "'");
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java Sun Jan  6 08:18:47 2008
@@ -17,7 +17,6 @@
  *  under the License.
  ****************************************************************/
 
-
 package org.apache.cayenne.exp.parser;
 
 import java.io.PrintWriter;
@@ -47,10 +46,9 @@
 
     protected Object evaluateNode(Object o) throws Exception {
         return (o instanceof DataObject)
-            ? ((DataObject) o).readNestedProperty(path)
-            : (o instanceof Entity)
-            ? evaluateEntityNode((Entity) o)
-            : PropertyUtils.getProperty(o, path);
+                ? ((DataObject) o).readNestedProperty(path)
+                : (o instanceof Entity) ? evaluateEntityNode((Entity) o) : PropertyUtils
+                        .getProperty(o, path);
     }
 
     /**
@@ -63,6 +61,16 @@
     }
 
     public void encodeAsString(PrintWriter pw) {
+        pw.print(path);
+    }
+
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        pw.print(rootId);
+        pw.print('.');
         pw.print(path);
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java Sun Jan  6 08:18:47 2008
@@ -64,6 +64,14 @@
     public void encodeAsString(PrintWriter pw) {
         SimpleNode.encodeScalarAsString(pw, value);
     }
+    
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        SimpleNode.encodeScalarAsString(pw, value);
+    }
 
     public void setValue(Object value) {
         this.value = value;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTTrue.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTTrue.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTTrue.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/ASTTrue.java Sun Jan  6 08:18:47 2008
@@ -23,12 +23,10 @@
 import org.apache.cayenne.exp.Expression;
 
 /**
- * Boolean true expression element
- * 
- * Notice that there is one ASTTrue and one ASTFalse instead of a ASTBoolean with a
- * Boolean value. The main reason for doing this is that a common ASTBoolean will have
- * operand count of 1 and that will default to a prepared statmenet like " where ? and
- * (...)", but we only need " where true and (...)".
+ * Boolean true expression element Notice that there is one ASTTrue and one ASTFalse
+ * instead of a ASTBoolean with a Boolean value. The main reason for doing this is that a
+ * common ASTBoolean will have operand count of 1 and that will default to a prepared
+ * statmenet like " where ? and (...)", but we only need " where true and (...)".
  * 
  * @see ASTFalse
  * @author halset
@@ -64,9 +62,16 @@
     public int getType() {
         return Expression.TRUE;
     }
-    
+
     public void encodeAsString(PrintWriter pw) {
         pw.print("true");
     }
 
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        pw.print("true");
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/exp/parser/SimpleNode.java Sun Jan  6 08:18:47 2008
@@ -59,7 +59,7 @@
         // predictable....
         if (scalar instanceof Persistent) {
             ObjectId id = ((Persistent) scalar).getObjectId();
-            if(id != null) {
+            if (id != null) {
                 scalar = id;
             }
         }
@@ -168,6 +168,7 @@
         }
     }
 
+    @Override
     public void encodeAsString(PrintWriter pw) {
         if (parent != null) {
             pw.print("(");
@@ -271,11 +272,11 @@
      * Evaluates itself with object, pushing result on the stack.
      */
     protected abstract Object evaluateNode(Object o) throws Exception;
-    
-    /** 
+
+    /**
      * Sets the parent to this for all children.
      * 
-     * @since 3.0 
+     * @since 3.0
      */
     protected void connectChildren() {
         if (children != null) {
@@ -308,6 +309,37 @@
                     "Error evaluating expression '" + string + "'",
                     string,
                     Util.unwindException(th));
+        }
+    }
+
+    /**
+     * @since 3.0
+     */
+    @Override
+    public void encodeAsEJBQL(PrintWriter pw, String rootId) {
+        if (parent != null) {
+            pw.print("(");
+        }
+
+        if ((children != null) && (children.length > 0)) {
+            for (int i = 0; i < children.length; ++i) {
+                if (i > 0) {
+                    pw.print(' ');
+                    pw.print(getExpressionOperator(i));
+                    pw.print(' ');
+                }
+
+                if (children[i] == null) {
+                    pw.print("null");
+                }
+                else {
+                    ((SimpleNode) children[i]).encodeAsEJBQL(pw, rootId);
+                }
+            }
+        }
+
+        if (parent != null) {
+            pw.print(')');
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java?rev=609339&r1=609338&r2=609339&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/exp/ExpressionTest.java Sun Jan  6 08:18:47 2008
@@ -19,6 +19,8 @@
 
 package org.apache.cayenne.exp;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.Collections;
 
 import junit.framework.TestCase;
@@ -38,5 +40,39 @@
 
         e = e.expWithParameters(Collections.singletonMap("x", null));
         assertEquals("X = null", e.toString());
+    }
+
+    public void testToEJBQL1() {
+
+        Expression e = Expression.fromString("artistName = 'bla'");
+        assertEquals("x.artistName = \"bla\"", e.toEJBQL("x"));
+    }
+
+    public void testEncodeAsEJBQL1() {
+
+        Expression e = Expression.fromString("artistName = 'bla'");
+
+        StringWriter buffer = new StringWriter();
+        PrintWriter pw = new PrintWriter(buffer);
+        e.encodeAsEJBQL(pw, "x");
+        pw.close();
+        buffer.flush();
+        String ejbql = buffer.toString();
+
+        assertEquals("x.artistName = \"bla\"", ejbql);
+    }
+
+    public void testEncodeAsEJBQL2() {
+
+        Expression e = Expression.fromString("artistName.stuff = $name");
+
+        StringWriter buffer = new StringWriter();
+        PrintWriter pw = new PrintWriter(buffer);
+        e.encodeAsEJBQL(pw, "x");
+        pw.close();
+        buffer.flush();
+        String ejbql = buffer.toString();
+
+        assertEquals("x.artistName.stuff = :name", ejbql);
     }
 }