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/01/17 09:05:45 UTC

[3/4] cayenne git commit: CAY-1966 SQLTemplate/SQLSelect positional parameter binding

CAY-1966 SQLTemplate/SQLSelect positional parameter binding

* positional parameters must be included in cache key


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/e2069efe
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/e2069efe
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/e2069efe

Branch: refs/heads/master
Commit: e2069efeb92b1684c548af50aefa508942b5d3b8
Parents: 60f3f15
Author: aadamchik <aa...@apache.org>
Authored: Fri Jan 16 09:19:09 2015 +0300
Committer: aadamchik <aa...@apache.org>
Committed: Fri Jan 16 09:36:29 2015 +0300

----------------------------------------------------------------------
 .../cayenne/query/SQLTemplateMetadata.java      | 117 +++++++++----------
 .../org/apache/cayenne/query/SQLSelectTest.java |  19 +++
 2 files changed, 77 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/e2069efe/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
index 61a3a68..de106d5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
@@ -31,63 +31,62 @@ import org.apache.cayenne.map.ObjEntity;
  */
 class SQLTemplateMetadata extends BaseQueryMetadata {
 
-    boolean resolve(Object root, EntityResolver resolver, SQLTemplate query) {
-
-        if (super.resolve(root, resolver, null)) {
-
-            resultSetMapping = query.getResult() != null ? query
-                    .getResult()
-                    .getResolvedComponents(resolver) : null;
-
-            // generate unique cache key...
-            if (QueryCacheStrategy.NO_CACHE == getCacheStrategy()) {
-
-            }
-            else {
-
-                // create a unique key based on entity, SQL, and parameters
-
-                StringBuilder key = new StringBuilder();
-                ObjEntity entity = getObjEntity();
-                if (entity != null) {
-                    key.append(entity.getName());
-                }
-                else if (dbEntity != null) {
-                    key.append("db:").append(dbEntity.getName());
-                }
-
-                if (query.getDefaultTemplate() != null) {
-                    key.append('/').append(query.getDefaultTemplate());
-                }
-
-                Map<String, ?> parameters = query.getParams();
-                if (!parameters.isEmpty()) {
-
-                    List<String> keys = new ArrayList<String>(parameters.keySet());
-                    Collections.sort(keys);
-
-                    for (String parameterKey : keys) {
-                        key.append('/').append(parameterKey).append('=').append(
-                                parameters.get(parameterKey));
-                    }
-                }
-                
-                if (query.getFetchOffset() > 0 || query.getFetchLimit() > 0) {
-                    key.append('/');
-                    if (query.getFetchOffset() > 0) {
-                        key.append('o').append(query.getFetchOffset());
-                    }
-                    if (query.getFetchLimit() > 0) {
-                        key.append('l').append(query.getFetchLimit());
-                    }
-                }
-
-                this.cacheKey = key.toString();
-            }
-
-            return true;
-        }
-
-        return false;
-    }
+	boolean resolve(Object root, EntityResolver resolver, SQLTemplate query) {
+
+		if (super.resolve(root, resolver, null)) {
+
+			resultSetMapping = query.getResult() != null ? query.getResult().getResolvedComponents(resolver) : null;
+
+			// generate unique cache key...
+			if (QueryCacheStrategy.NO_CACHE == getCacheStrategy()) {
+
+			} else {
+
+				// create a unique key based on entity, SQL, and parameters
+
+				StringBuilder key = new StringBuilder();
+				ObjEntity entity = getObjEntity();
+				if (entity != null) {
+					key.append(entity.getName());
+				} else if (dbEntity != null) {
+					key.append("db:").append(dbEntity.getName());
+				}
+
+				if (query.getDefaultTemplate() != null) {
+					key.append('/').append(query.getDefaultTemplate());
+				}
+
+				Map<String, ?> parameters = query.getParams();
+				if (!parameters.isEmpty()) {
+
+					List<String> keys = new ArrayList<String>(parameters.keySet());
+					Collections.sort(keys);
+
+					for (String parameterKey : keys) {
+						key.append('/').append(parameterKey).append('=').append(parameters.get(parameterKey));
+					}
+				}
+
+				for (Object parameter : query.getPositionalParams()) {
+					key.append("/p:").append(parameter);
+				}
+
+				if (query.getFetchOffset() > 0 || query.getFetchLimit() > 0) {
+					key.append('/');
+					if (query.getFetchOffset() > 0) {
+						key.append('o').append(query.getFetchOffset());
+					}
+					if (query.getFetchLimit() > 0) {
+						key.append('l').append(query.getFetchLimit());
+					}
+				}
+
+				this.cacheKey = key.toString();
+			}
+
+			return true;
+		}
+
+		return false;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/e2069efe/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectTest.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectTest.java
index 439ff44..303d9e4 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/SQLSelectTest.java
@@ -20,6 +20,8 @@ package org.apache.cayenne.query;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertThat;
@@ -116,4 +118,21 @@ public class SQLSelectTest {
 		SQLTemplate replacement = (SQLTemplate) q.createReplacementQuery(mock(EntityResolver.class));
 		assertArrayEquals(new Object[] { "a", "b" }, replacement.getPositionalParams().toArray());
 	}
+
+	@Test
+	public void testGetMetadata_ParamsArray_Multiple_Cache() {
+
+		EntityResolver resolver = mock(EntityResolver.class);
+		QueryMetadata md0 = SQLSelect.dataRowQuery("bla").localCache().getMetaData(resolver);
+		QueryMetadata md1 = SQLSelect.dataRowQuery("bla").localCache().paramsArray("a").getMetaData(resolver);
+		QueryMetadata md2 = SQLSelect.dataRowQuery("bla").localCache().paramsArray("a", "b").getMetaData(resolver);
+
+		assertNotNull(md0.getCacheKey());
+		assertNotNull(md1.getCacheKey());
+		assertNotNull(md2.getCacheKey());
+		
+		assertNotEquals(md0.getCacheKey(), md1.getCacheKey());
+		assertNotEquals(md0.getCacheKey(), md2.getCacheKey());
+		assertNotEquals(md1.getCacheKey(), md2.getCacheKey());
+	}
 }