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/26 17:27:24 UTC
svn commit: r1561512 - in /cayenne/main/trunk/cayenne-server/src:
main/java/org/apache/cayenne/access/trans/
main/java/org/apache/cayenne/exp/parser/ test/java/org/apache/cayenne/exp/
test/java/org/apache/cayenne/exp/parser/
Author: aadamchik
Date: Sun Jan 26 16:27:23 2014
New Revision: 1561512
URL: http://svn.apache.org/r1561512
Log:
CAY-1796
patch by Oleg Artyukevich of Jan 21, 2014
Modified:
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/trans/QueryAssemblerHelper.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTList.java
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionEvaluateInMemoryTest.java
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/trans/QueryAssemblerHelper.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/trans/QueryAssemblerHelper.java?rev=1561512&r1=1561511&r2=1561512&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/trans/QueryAssemblerHelper.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/access/trans/QueryAssemblerHelper.java Sun Jan 26 16:27:23 2014
@@ -271,6 +271,10 @@ public abstract class QueryAssemblerHelp
if (val == null) {
out.append("NULL");
} else if (val instanceof Persistent) {
+ // TODO: see cay1796
+ // This check is unlikely to happen,
+ // since Expression got ObjectId from Persistent object.
+ // Left for future research.
ObjectId id = ((Persistent) val).getObjectId();
// check if this id is acceptable to be a parameter
@@ -293,6 +297,25 @@ public abstract class QueryAssemblerHelp
// checks have been passed, use id value
appendLiteralDirect(snap.get(snap.keySet().iterator().next()), attr, parentExpression);
+ } else if(val instanceof ObjectId){
+
+ ObjectId id = (ObjectId)val;
+
+ if (id.isTemporary()) {
+ throw new CayenneRuntimeException("Can't use NEW object as a query parameter.");
+ }
+
+ Map<String, Object> snap = id.getIdSnapshot();
+ if (snap.size() != 1) {
+ StringBuilder msg = new StringBuilder();
+ msg.append("Object must have a single primary key column ").append("to serve as a query parameter. ")
+ .append("This object has ").append(snap.size()).append(": ").append(snap);
+
+ throw new CayenneRuntimeException(msg.toString());
+ }
+
+ // checks have been passed, use id value
+ appendLiteralDirect(snap.get(snap.keySet().iterator().next()), attr, parentExpression);
} else {
appendLiteralDirect(val, attr, parentExpression);
}
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTList.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTList.java?rev=1561512&r1=1561511&r2=1561512&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTList.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTList.java Sun Jan 26 16:27:23 2014
@@ -25,6 +25,7 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import org.apache.cayenne.Persistent;
import org.apache.cayenne.exp.Expression;
/**
@@ -174,7 +175,9 @@ public class ASTList extends SimpleNode
if (value == null) {
this.values = null;
} else if (value instanceof Object[]) {
- this.values = (Object[]) value;
+ int size = ((Object[]) value).length;
+ this.values = new Object[size];
+ System.arraycopy((Object[]) value, 0, this.values, 0, size);
} else if (value instanceof Collection) {
this.values = ((Collection) value).toArray();
} else if (value instanceof Iterator) {
@@ -189,8 +192,17 @@ public class ASTList extends SimpleNode
throw new IllegalArgumentException("Invalid value class '" + value.getClass().getName()
+ "', expected null, Object[], Collection, Iterator");
}
+ convertValues();
}
-
+
+ private void convertValues() {
+ for (int i = 0; i < values.length; i++) {
+ if (values[i] instanceof Persistent) {
+ values[i] = ((Persistent)values[i]).getObjectId();
+ }
+ }
+ }
+
@Override
public void jjtClose() {
super.jjtClose();
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java?rev=1561512&r1=1561511&r2=1561512&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTScalar.java Sun Jan 26 16:27:23 2014
@@ -82,13 +82,14 @@ public class ASTScalar extends SimpleNod
// Persistent processing is a hack for a rather special case of a single
// column PK
// object.. full implementation pending...
+ //
+ // cay1796 : change check for Persistent object by check for ObjectId
Object scalar = value;
- if (scalar instanceof Persistent) {
- Persistent persistent = (Persistent) scalar;
- ObjectId id = persistent.getObjectId();
- if (!id.isTemporary() && id.getIdSnapshot().size() == 1) {
- scalar = id.getIdSnapshot().values().iterator().next();
+ if(scalar instanceof ObjectId) {
+ ObjectId temp = (ObjectId)value;
+ if (!temp.isTemporary() && temp.getIdSnapshot().size() == 1) {
+ scalar = temp.getIdSnapshot().values().iterator().next();
}
}
@@ -96,7 +97,11 @@ public class ASTScalar extends SimpleNod
}
public void setValue(Object value) {
- this.value = value;
+ if (value instanceof Persistent){
+ this.value = ((Persistent)value).getObjectId();
+ } else {
+ this.value = value;
+ }
}
public Object getValue() {
Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java?rev=1561512&r1=1561511&r2=1561512&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionFactoryTest.java Sun Jan 26 16:27:23 2014
@@ -252,6 +252,7 @@ public class ExpressionFactoryTest exten
// CAY-416
public void testCollectionMatch() {
Artist artist = context.newObject(Artist.class);
+ artist.setArtistName("artist");
Painting p1 = context.newObject(Painting.class), p2 = context
.newObject(Painting.class), p3 = context.newObject(Painting.class);
p1.setPaintingTitle("p1");
@@ -259,6 +260,8 @@ public class ExpressionFactoryTest exten
p3.setPaintingTitle("p3");
artist.addToPaintingArray(p1);
artist.addToPaintingArray(p2);
+
+ context.commitChanges();
assertTrue(ExpressionFactory.matchExp("paintingArray", p1).match(artist));
assertFalse(ExpressionFactory.matchExp("paintingArray", p3).match(artist));
Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java?rev=1561512&r1=1561511&r2=1561512&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/ExpressionTest.java Sun Jan 26 16:27:23 2014
@@ -237,13 +237,13 @@ public class ExpressionTest extends Serv
Painting p1 = context.newObject(Painting.class);
p1.setToArtist(a1);
p1.setPaintingTitle("painting1");
+
+ context.commitChanges();
SelectQuery query = new SelectQuery(Painting.class);
Expression e = ExpressionFactory.matchExp(Painting.TO_ARTIST_PROPERTY, a1);
query.setQualifier(e);
- context.commitChanges();
-
assertNotSame(context2, context);
List<Artist> objects = context2.performQuery(query);
@@ -263,8 +263,10 @@ public class ExpressionTest extends Serv
assertTrue(ex2.match(objects.get(0)));
Artist a2 = context.newObject(Artist.class);
- a1.setArtistName("Equals");
+ a2.setArtistName("Equals");
+ context.commitChanges();
+
SelectQuery q = new SelectQuery(Painting.class);
Expression ex = ExpressionFactory.matchExp(Painting.TO_ARTIST_PROPERTY, a2);
q.setQualifier(ex);
Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionEvaluateInMemoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionEvaluateInMemoryTest.java?rev=1561512&r1=1561511&r2=1561512&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionEvaluateInMemoryTest.java (original)
+++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ExpressionEvaluateInMemoryTest.java Sun Jan 26 16:27:23 2014
@@ -190,7 +190,15 @@ public class ExpressionEvaluateInMemoryT
Painting p1 = (Painting) context.newObject("Painting");
Painting p2 = (Painting) context.newObject("Painting");
Painting p3 = (Painting) context.newObject("Painting");
-
+
+ a1.setArtistName("a1");
+ a2.setArtistName("a2");
+ p1.setPaintingTitle("p1");
+ p2.setPaintingTitle("p2");
+ p3.setPaintingTitle("p3");
+
+ context.commitChanges();
+
p1.setToArtist(a1);
p2.setToArtist(a2);