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