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