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 2015/11/16 20:42:33 UTC
[1/2] cayenne git commit: CAY-2037 EJBQL: COUNT(DISTINCT .. ) doesn't
properly translate paths ending with relationship
Repository: cayenne
Updated Branches:
refs/heads/master bdd8d903a -> 80de06e8f
CAY-2037 EJBQL: COUNT(DISTINCT .. ) doesn't properly translate paths ending with relationship
* unit tests; commented test fails
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/e0caeacb
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/e0caeacb
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/e0caeacb
Branch: refs/heads/master
Commit: e0caeacb1db20ead138ff7bad08cc48b40417ee6
Parents: bdd8d90
Author: aadamchik <aa...@apache.org>
Authored: Mon Nov 9 10:34:14 2015 +0100
Committer: aadamchik <aa...@apache.org>
Committed: Mon Nov 16 14:37:25 2015 -0500
----------------------------------------------------------------------
.../apache/cayenne/query/EJBQLQueryCountIT.java | 103 +++++++++++++++++++
.../org/apache/cayenne/query/EJBQLQueryIT.java | 26 ++---
2 files changed, 116 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e0caeacb/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryCountIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryCountIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryCountIT.java
new file mode 100644
index 0000000..9dd7ace
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryCountIT.java
@@ -0,0 +1,103 @@
+/*****************************************************************
+ * 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.query;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Collections;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.unit.di.server.CayenneProjects;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Before;
+import org.junit.Test;
+
+@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
+public class EJBQLQueryCountIT extends ServerCase {
+
+ @Inject
+ private ObjectContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ protected TableHelper tArtist;
+ protected TableHelper tPainting;
+ protected TableHelper tGallery;
+
+ @Before
+ public void before() throws Exception {
+ tArtist = new TableHelper(dbHelper, "ARTIST");
+ tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
+
+ tPainting = new TableHelper(dbHelper, "PAINTING");
+ tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE");
+ }
+
+ @Test
+ public void test_ToOne() throws Exception {
+ tArtist.insert(1, "A1");
+ tArtist.insert(2, "A2");
+ tArtist.insert(3, "A3");
+
+ tPainting.insert(1, 1, "P1");
+ tPainting.insert(2, 1, "P2");
+ tPainting.insert(4, 2, "P1");
+
+ EJBQLQuery query = new EJBQLQuery("SELECT COUNT(p.toArtist) FROM Painting p");
+
+ // this should be simply a count of painting/artist joins
+ assertEquals(Collections.singletonList(3l), context.performQuery(query));
+ }
+
+// @Test
+// public void test_DistinctToOne() throws Exception {
+// tArtist.insert(1, "A1");
+// tArtist.insert(2, "A2");
+// tArtist.insert(3, "A3");
+//
+// tPainting.insert(1, 1, "P1");
+// tPainting.insert(2, 1, "P2");
+// tPainting.insert(4, 2, "P1");
+//
+// EJBQLQuery query = new EJBQLQuery("SELECT COUNT(DISTINCT p.toArtist) FROM Painting p");
+// // this should be a count of artists that have paintings
+// assertEquals(Collections.singletonList(2l), context.performQuery(query));
+// }
+
+ @Test
+ public void test_DistinctToOneAttribute() throws Exception {
+ tArtist.insert(1, "A1");
+ tArtist.insert(2, "A1");
+ tArtist.insert(3, "A1");
+
+ tPainting.insert(1, 1, "P1");
+ tPainting.insert(2, 1, "P2");
+ tPainting.insert(4, 2, "P1");
+
+ EJBQLQuery query = new EJBQLQuery("SELECT COUNT(DISTINCT p.toArtist.artistName) FROM Painting p");
+ // this should be a count of artists that have paintings
+ assertEquals(Collections.singletonList(1l), context.performQuery(query));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e0caeacb/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
index 56b2054..45e156a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
@@ -18,6 +18,19 @@
****************************************************************/
package org.apache.cayenne.query;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.Map;
+
import org.apache.cayenne.DataRow;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.configuration.server.ServerRuntime;
@@ -40,19 +53,6 @@ import org.apache.cayenne.util.XMLEncoder;
import org.junit.Before;
import org.junit.Test;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
public class EJBQLQueryIT extends ServerCase {
[2/2] cayenne git commit: modernizing syntax, no change
Posted by aa...@apache.org.
modernizing syntax, no change
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/80de06e8
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/80de06e8
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/80de06e8
Branch: refs/heads/master
Commit: 80de06e8f0424daf7145ddbd95c3dd7a0cfeca2d
Parents: e0caeac
Author: aadamchik <aa...@apache.org>
Authored: Mon Nov 16 14:33:40 2015 -0500
Committer: aadamchik <aa...@apache.org>
Committed: Mon Nov 16 14:37:26 2015 -0500
----------------------------------------------------------------------
.../cayenne/ashwood/AshwoodEntitySorter.java | 41 +++++++++++---------
.../cayenne/ashwood/AshwoodEntitySorterIT.java | 2 +-
2 files changed, 24 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/80de06e8/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
index 6eeae5e..9337955 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
@@ -117,7 +117,7 @@ public class AshwoodEntitySorter implements EntitySorter {
for (DbEntity destination : tableMap.values()) {
for (DbRelationship candidate : destination.getRelationships()) {
if ((!candidate.isToMany() && !candidate.isToDependentPK()) || candidate.isToMasterPK()) {
- DbEntity origin = (DbEntity) candidate.getTargetEntity();
+ DbEntity origin = candidate.getTargetEntity();
boolean newReflexive = destination.equals(origin);
for (DbJoin join : candidate.getJoins()) {
@@ -127,7 +127,7 @@ public class AshwoodEntitySorter implements EntitySorter {
if (newReflexive) {
List<DbRelationship> reflexiveRels = reflexiveDbEntities.get(destination);
if (reflexiveRels == null) {
- reflexiveRels = new ArrayList<DbRelationship>(1);
+ reflexiveRels = new ArrayList<>(1);
reflexiveDbEntities.put(destination, reflexiveRels);
}
reflexiveRels.add(candidate);
@@ -136,7 +136,7 @@ public class AshwoodEntitySorter implements EntitySorter {
List<DbAttribute> fks = referentialDigraph.getArc(origin, destination);
if (fks == null) {
- fks = new ArrayList<DbAttribute>();
+ fks = new ArrayList<>();
referentialDigraph.putArc(origin, destination, fks);
}
@@ -148,17 +148,15 @@ public class AshwoodEntitySorter implements EntitySorter {
}
- StrongConnection<DbEntity, List<DbAttribute>> contractor = new StrongConnection<DbEntity, List<DbAttribute>>(
- referentialDigraph);
+ StrongConnection<DbEntity, List<DbAttribute>> contractor = new StrongConnection<>(referentialDigraph);
- Digraph<Collection<DbEntity>, Collection<List<DbAttribute>>> contractedReferentialDigraph = new MapDigraph<Collection<DbEntity>, Collection<List<DbAttribute>>>();
+ Digraph<Collection<DbEntity>, Collection<List<DbAttribute>>> contractedReferentialDigraph = new MapDigraph<>();
contractor.contract(contractedReferentialDigraph);
- IndegreeTopologicalSort<Collection<DbEntity>> sorter = new IndegreeTopologicalSort<Collection<DbEntity>>(
+ IndegreeTopologicalSort<Collection<DbEntity>> sorter = new IndegreeTopologicalSort<>(
contractedReferentialDigraph);
- Map<DbEntity, ComponentRecord> components = new HashMap<DbEntity, ComponentRecord>(
- contractedReferentialDigraph.order());
+ Map<DbEntity, ComponentRecord> components = new HashMap<>(contractedReferentialDigraph.order());
int componentIndex = 0;
while (sorter.hasNext()) {
Collection<DbEntity> component = sorter.next();
@@ -176,21 +174,25 @@ public class AshwoodEntitySorter implements EntitySorter {
/**
* @since 3.1
*/
+ @Override
public void setEntityResolver(EntityResolver entityResolver) {
this.entityResolver = entityResolver;
this.dirty = true;
}
+ @Override
public void sortDbEntities(List<DbEntity> dbEntities, boolean deleteOrder) {
indexSorter();
Collections.sort(dbEntities, getDbEntityComparator(deleteOrder));
}
+ @Override
public void sortObjEntities(List<ObjEntity> objEntities, boolean deleteOrder) {
indexSorter();
Collections.sort(objEntities, getObjEntityComparator(deleteOrder));
}
+ @Override
public void sortObjectsForEntity(ObjEntity objEntity, List<?> objects, boolean deleteOrder) {
indexSorter();
@@ -222,7 +224,7 @@ public class AshwoodEntitySorter implements EntitySorter {
List<Persistent> sorted = new ArrayList<Persistent>(size);
- Digraph<Persistent, Boolean> objectDependencyGraph = new MapDigraph<Persistent, Boolean>();
+ Digraph<Persistent, Boolean> objectDependencyGraph = new MapDigraph<>();
Object[] masters = new Object[reflexiveRelNames.length];
for (int i = 0; i < size; i++) {
Persistent current = (Persistent) objects.get(i);
@@ -256,7 +258,6 @@ public class AshwoodEntitySorter implements EntitySorter {
Persistent masterCandidate = persistent.get(j);
for (Object master : masters) {
- // if (masterCandidate.equals(master)) {
if (masterCandidate == master) {
objectDependencyGraph.putArc(masterCandidate, current, Boolean.TRUE);
mastersFound++;
@@ -265,7 +266,7 @@ public class AshwoodEntitySorter implements EntitySorter {
}
}
- IndegreeTopologicalSort<Persistent> sorter = new IndegreeTopologicalSort<Persistent>(objectDependencyGraph);
+ IndegreeTopologicalSort<Persistent> sorter = new IndegreeTopologicalSort<>(objectDependencyGraph);
while (sorter.hasNext()) {
Persistent o = sorter.next();
@@ -354,24 +355,28 @@ public class AshwoodEntitySorter implements EntitySorter {
private final class DbEntityComparator implements Comparator<DbEntity> {
public int compare(DbEntity t1, DbEntity t2) {
- int result = 0;
if (t1 == t2)
return 0;
if (t1 == null)
- result = -1;
+ return -1;
else if (t2 == null)
- result = 1;
+ return 1;
else {
ComponentRecord rec1 = components.get(t1);
ComponentRecord rec2 = components.get(t2);
int index1 = rec1.index;
int index2 = rec2.index;
- result = (index1 > index2 ? 1 : (index1 < index2 ? -1 : 0));
- if (result != 0 && rec1.component == rec2.component)
+
+ int result = index1 > index2 ? 1 : (index1 < index2 ? -1 : 0);
+
+ // TODO: is this check really needed?
+ if (result != 0 && rec1.component == rec2.component) {
result = 0;
+ }
+
+ return result;
}
- return result;
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/80de06e8/cayenne-server/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterIT.java b/cayenne-server/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterIT.java
index f90cc54..0e74d66 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterIT.java
@@ -73,7 +73,7 @@ public class AshwoodEntitySorterIT extends ServerCase {
ObjEntity entity = context.getEntityResolver().getObjEntity(ReflexiveAndToOne.class);
- List<?> objects = context.performQuery(new SelectQuery(ReflexiveAndToOne.class));
+ List<?> objects = context.performQuery(new SelectQuery<>(ReflexiveAndToOne.class));
Collections.shuffle(objects);
assertEquals(3, objects.size());