You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/02/14 13:33:44 UTC
[5/5] cayenne git commit: CAY-2406 Add prefetch-related API to
SQLSelect minor refactor additional tests
CAY-2406 Add prefetch-related API to SQLSelect
minor refactor
additional tests
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/0ca73a17
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/0ca73a17
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/0ca73a17
Branch: refs/heads/master
Commit: 0ca73a17a6972e66a384e436dcccba11ff943183
Parents: 9d4f6a4
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Feb 14 16:33:29 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Feb 14 16:33:29 2018 +0300
----------------------------------------------------------------------
.../org/apache/cayenne/query/SQLSelect.java | 2 +-
.../org/apache/cayenne/query/SQLTemplate.java | 25 ++++++-----
.../org/apache/cayenne/query/SQLTemplateIT.java | 45 ++++++++++++++++++--
3 files changed, 54 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ca73a17/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
index dafc362..2bd0943 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLSelect.java
@@ -240,7 +240,7 @@ public class SQLSelect<T> extends IndirectQuery implements Select<T> {
}
@Override
- public Query createReplacementQuery(EntityResolver resolver) {
+ protected Query createReplacementQuery(EntityResolver resolver) {
Object root;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ca73a17/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
index c86bb00..acdacfd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
@@ -109,7 +109,7 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
public void setRoot(Object value) {
// allow null root...
if (value == null) {
- this.root = value;
+ this.root = null;
} else {
super.setRoot(value);
}
@@ -431,7 +431,7 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
* Returns a collection of configured template keys.
*/
public synchronized Collection<String> getTemplateKeys() {
- return (templates != null) ? templates.keySet() : Collections.<String> emptyList();
+ return (templates != null) ? templates.keySet() : Collections.emptyList();
}
/**
@@ -441,7 +441,7 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
*/
public Map<String, ?> getParams() {
Map<String, ?> map = (parameters != null && parameters.length > 0) ? parameters[0] : null;
- return (map != null) ? map : Collections.<String, Object> emptyMap();
+ return (map != null) ? map : Collections.emptyMap();
}
/**
@@ -474,7 +474,7 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
// are not serializable with Hessian...
this.parameters = new Map[parameters.length];
for (int i = 0; i < parameters.length; i++) {
- this.parameters[i] = parameters[i] != null ? new HashMap<>(parameters[i]) : new HashMap<String, Object>();
+ this.parameters[i] = parameters[i] != null ? new HashMap<>(parameters[i]) : new HashMap<>();
}
}
}
@@ -502,22 +502,21 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
* @since 4.0
*/
public void addPrefetch(PrefetchTreeNode prefetchElement) {
- if (hasDisjointNode(prefetchElement)) {
- throw new CayenneRuntimeException("This query supports only 'joint' and 'disjointById' prefetching semantics.");
- }
+ checkForDisjointNode(prefetchElement);
metaData.mergePrefetch(prefetchElement);
}
- private boolean hasDisjointNode(PrefetchTreeNode prefetchElement) {
+ /**
+ * Check for disjoint element and throw if it's found.
+ * @param prefetchElement to check
+ */
+ private void checkForDisjointNode(PrefetchTreeNode prefetchElement) {
if (prefetchElement.isDisjointPrefetch()) {
- return true;
+ throw new CayenneRuntimeException("This query supports only 'joint' and 'disjointById' prefetching semantics.");
}
for (PrefetchTreeNode child : prefetchElement.getChildren()) {
- if (hasDisjointNode(child)) {
- return true;
- }
+ checkForDisjointNode(child);
}
- return false;
}
/**
http://git-wip-us.apache.org/repos/asf/cayenne/blob/0ca73a17/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
index 30f4151..2fcbda0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLTemplateIT.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.query;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataRow;
+import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DataMap;
@@ -28,15 +29,14 @@ import org.apache.cayenne.test.jdbc.DBHelper;
import org.apache.cayenne.test.jdbc.TableHelper;
import org.apache.cayenne.testdo.testmap.Gallery;
import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
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;
-import java.math.BigInteger;
import java.sql.SQLException;
-import java.sql.Types;
import java.util.List;
import static org.junit.Assert.assertEquals;
@@ -53,13 +53,20 @@ public class SQLTemplateIT extends ServerCase {
@Inject
private DBHelper dbHelper;
+ @Inject
+ protected DataChannelInterceptor queryInterceptor;
+
private TableHelper tPainting;
+ private TableHelper tArtist;
+
@Before
public void setUp() 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", "ESTIMATED_PRICE").setColumnTypes(
- Types.INTEGER, Types.BIGINT, Types.VARCHAR, Types.DECIMAL);
+ tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE", "ESTIMATED_PRICE");
}
@Test
@@ -184,4 +191,34 @@ public class SQLTemplateIT extends ServerCase {
// this should fail as result can't be converted to Gallery class
context.performQuery(q1);
}
+
+ @Test
+ public void testSQLTemplateWithDisjointByIdPrefetch() throws Exception {
+ tArtist.insert(1, "artist1");
+ tArtist.insert(2, "artist2");
+
+ tPainting.insert(1, 1, "p1", 10);
+ tPainting.insert(2, 2, "p2", 20);
+
+ String sql = "SELECT p.* FROM PAINTING p";
+ SQLTemplate q1 = new SQLTemplate(Painting.class, sql);
+ q1.addPrefetch(Painting.TO_ARTIST.disjointById());
+ q1.setColumnNamesCapitalization(CapsStrategy.UPPER);
+
+ @SuppressWarnings("unchecked")
+ List<Painting> paintings = context.performQuery(q1);
+
+ queryInterceptor.runWithQueriesBlocked(() -> {
+ for(Painting painting : paintings) {
+ assertEquals(PersistenceState.COMMITTED, painting.getToArtist().getPersistenceState());
+ }
+ });
+ }
+
+ @Test(expected = CayenneRuntimeException.class)
+ public void testSQLTemplateWithDisjointPrefetch() throws Exception {
+ String sql = "SELECT p.* FROM PAINTING p";
+ SQLTemplate q1 = new SQLTemplate(Painting.class, sql);
+ q1.addPrefetch(Painting.TO_ARTIST.disjoint());
+ }
}