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 2006/07/31 19:40:03 UTC
svn commit: r427180 - in
/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src:
main/java/org/apache/cayenne/query/ test/java/org/apache/cayenne/query/
Author: aadamchik
Date: Mon Jul 31 10:40:02 2006
New Revision: 427180
URL: http://svn.apache.org/viewvc?rev=427180&view=rev
Log:
CAY-613 - generating cache key automatically for SQLTemaplte and ProcedureQuery
Added:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/ProcedureQueryCacheKeyTst.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateCacheKeyTst.java
Modified:
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQueryMetadata.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplate.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateTst.java
incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQuery.java?rev=427180&r1=427179&r2=427180&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQuery.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQuery.java Mon Jul 31 10:40:02 2006
@@ -151,7 +151,7 @@
metaData.resolve(root, resultClass != null
? (Object) resultClass
- : resultEntityName, resolver, getName());
+ : resultEntityName, resolver, this);
return metaData;
}
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQueryMetadata.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQueryMetadata.java?rev=427180&r1=427179&r2=427180&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQueryMetadata.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/ProcedureQueryMetadata.java Mon Jul 31 10:40:02 2006
@@ -19,6 +19,12 @@
package org.apache.cayenne.query;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.Procedure;
@@ -35,8 +41,12 @@
super.copyFromInfo(info);
}
- void resolve(Object root, Object resultRoot, EntityResolver resolver, String cacheKey) {
- if (super.resolve(resultRoot, resolver, cacheKey)) {
+ void resolve(
+ Object root,
+ Object resultRoot,
+ EntityResolver resolver,
+ ProcedureQuery query) {
+ if (super.resolve(resultRoot, resolver, null)) {
procedure = null;
if (root != null) {
@@ -53,6 +63,40 @@
this.dataMap = procedure.getDataMap();
}
}
+
+ // generate unique cache key...
+ if (QueryMetadata.NO_CACHE.equals(getCachePolicy())) {
+
+ }
+ else if (query.getName() != null) {
+ this.cacheKey = query.getName();
+ }
+ else {
+
+ // create a unique key based on procedure and parameters
+
+ StringBuffer key = new StringBuffer("proc:");
+ if (procedure != null) {
+ key.append(procedure.getName());
+ }
+
+ Map parameters = query.getParameters();
+ if (!parameters.isEmpty()) {
+
+ List keys = new ArrayList(parameters.keySet());
+ Collections.sort(keys);
+
+ Iterator it = keys.iterator();
+ while (it.hasNext()) {
+ Object parameterKey = it.next();
+ key.append('/').append(parameterKey).append('=').append(
+ parameters.get(parameterKey));
+ }
+ }
+
+ this.cacheKey = key.toString();
+ }
+
}
}
}
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplate.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplate.java?rev=427180&r1=427179&r2=427180&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplate.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplate.java Mon Jul 31 10:40:02 2006
@@ -48,7 +48,7 @@
* </p>
*
* <pre>
- * SELECT ID, NAME FROM SOME_TABLE WHERE NAME LIKE $a
+ * SELECT ID, NAME FROM SOME_TABLE WHERE NAME LIKE $a
* </pre>
*
* <p>
@@ -86,7 +86,7 @@
protected Map templates;
protected Map[] parameters;
- BaseQueryMetadata selectInfo = new BaseQueryMetadata();
+ SQLTemplateMetadata selectInfo = new SQLTemplateMetadata();
/**
* Creates an empty SQLTemplate. Note this constructor does not specify the "root" of
@@ -142,7 +142,7 @@
* @since 1.2
*/
public QueryMetadata getMetaData(EntityResolver resolver) {
- selectInfo.resolve(root, resolver, getName());
+ selectInfo.resolve(root, resolver, this);
return selectInfo;
}
Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java?rev=427180&view=auto
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java Mon Jul 31 10:40:02 2006
@@ -0,0 +1,84 @@
+/*****************************************************************
+ * 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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cayenne.map.EntityResolver;
+
+/**
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+public class SQLTemplateMetadata extends BaseQueryMetadata {
+
+ boolean resolve(Object root, EntityResolver resolver, SQLTemplate query) {
+
+ if (super.resolve(root, resolver, null)) {
+
+ // generate unique cache key...
+ if (QueryMetadata.NO_CACHE.equals(getCachePolicy())) {
+
+ }
+ else if (query.getName() != null) {
+ this.cacheKey = query.getName();
+ }
+ else {
+
+ // create a unique key based on entity, SQL, and parameters
+
+ StringBuffer key = new StringBuffer();
+ if (objEntity != null) {
+ key.append(objEntity.getName());
+ }
+ else if (dbEntity != null) {
+ key.append("db:").append(dbEntity.getName());
+ }
+
+ if (query.getDefaultTemplate() != null) {
+ key.append('/').append(query.getDefaultTemplate());
+ }
+
+ Map parameters = query.getParameters();
+ if (!parameters.isEmpty()) {
+
+ List keys = new ArrayList(parameters.keySet());
+ Collections.sort(keys);
+
+ Iterator it = keys.iterator();
+ while (it.hasNext()) {
+ Object parameterKey = it.next();
+ key.append('/').append(parameterKey).append('=').append(
+ parameters.get(parameterKey));
+ }
+ }
+
+ this.cacheKey = key.toString();
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+}
Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/ProcedureQueryCacheKeyTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/ProcedureQueryCacheKeyTst.java?rev=427180&view=auto
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/ProcedureQueryCacheKeyTst.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/ProcedureQueryCacheKeyTst.java Mon Jul 31 10:40:02 2006
@@ -0,0 +1,83 @@
+/*****************************************************************
+ * 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 org.apache.art.Artist;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.unit.CayenneTestCase;
+
+public class ProcedureQueryCacheKeyTst extends CayenneTestCase {
+
+ public void testNoCache() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ ProcedureQuery query = new ProcedureQuery("ABC", Artist.class);
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.NO_CACHE, md1.getCachePolicy());
+ assertNull(md1.getCacheKey());
+
+ query.setName("XYZ");
+ QueryMetadata md2 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.NO_CACHE, md2.getCachePolicy());
+ assertNull(md2.getCacheKey());
+ }
+
+ public void testLocalCache() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ ProcedureQuery query = new ProcedureQuery("ABC", Artist.class);
+
+ query.setCachePolicy(QueryMetadata.LOCAL_CACHE);
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.LOCAL_CACHE, md1.getCachePolicy());
+ assertNotNull(md1.getCacheKey());
+ }
+
+ public void testSharedCache() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ ProcedureQuery query = new ProcedureQuery("ABC", Artist.class);
+
+ query.setCachePolicy(QueryMetadata.SHARED_CACHE);
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.SHARED_CACHE, md1.getCachePolicy());
+ assertNotNull(md1.getCacheKey());
+ }
+
+ public void testNamedQuery() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ ProcedureQuery query = new ProcedureQuery("ABC", Artist.class);
+
+ query.setCachePolicy(QueryMetadata.SHARED_CACHE);
+ query.setName("XYZ");
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.SHARED_CACHE, md1.getCachePolicy());
+ assertEquals("XYZ", md1.getCacheKey());
+ }
+
+}
Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateCacheKeyTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateCacheKeyTst.java?rev=427180&view=auto
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateCacheKeyTst.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateCacheKeyTst.java Mon Jul 31 10:40:02 2006
@@ -0,0 +1,83 @@
+/*****************************************************************
+ * 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 org.apache.art.Artist;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.unit.CayenneTestCase;
+
+public class SQLTemplateCacheKeyTst extends CayenneTestCase {
+
+ public void testNoCache() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ SQLTemplate query = new SQLTemplate(Artist.class, "SELECT ME");
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.NO_CACHE, md1.getCachePolicy());
+ assertNull(md1.getCacheKey());
+
+ query.setName("XYZ");
+ QueryMetadata md2 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.NO_CACHE, md2.getCachePolicy());
+ assertNull(md2.getCacheKey());
+ }
+
+ public void testLocalCache() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ SQLTemplate query = new SQLTemplate(Artist.class, "SELECT ME");
+
+ query.setCachePolicy(QueryMetadata.LOCAL_CACHE);
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.LOCAL_CACHE, md1.getCachePolicy());
+ assertNotNull(md1.getCacheKey());
+ }
+
+ public void testSharedCache() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ SQLTemplate query = new SQLTemplate(Artist.class, "SELECT ME");
+
+ query.setCachePolicy(QueryMetadata.SHARED_CACHE);
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.SHARED_CACHE, md1.getCachePolicy());
+ assertNotNull(md1.getCacheKey());
+ }
+
+ public void testNamedQuery() {
+
+ EntityResolver resolver = getDomain().getEntityResolver();
+
+ SQLTemplate query = new SQLTemplate(Artist.class, "SELECT ME");
+
+ query.setCachePolicy(QueryMetadata.SHARED_CACHE);
+ query.setName("XYZ");
+
+ QueryMetadata md1 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.SHARED_CACHE, md1.getCachePolicy());
+ assertEquals("XYZ", md1.getCacheKey());
+ }
+
+}
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateTst.java?rev=427180&r1=427179&r2=427180&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SQLTemplateTst.java Mon Jul 31 10:40:02 2006
@@ -34,31 +34,28 @@
* @author Andrus Adamchik
*/
public class SQLTemplateTst extends TestCase {
-
+
public void testQueryWithParameters() {
SQLTemplate q1 = new SQLTemplate("E1", "SELECT");
q1.setName("QName");
- EntityResolver resolver = new EntityResolver();
Query q2 = q1.queryWithParameters(Collections.EMPTY_MAP);
assertNotNull(q2);
assertNotSame(q1, q2);
+ assertTrue(q2 instanceof SQLTemplate);
- assertEquals(q1.getName(), q1.getMetaData(resolver).getCacheKey());
- assertEquals(q1.getName(), q2.getMetaData(resolver).getCacheKey());
+ assertEquals(q1.getName(), q2.getName());
Query q3 = q1.queryWithParameters(Collections.singletonMap("a", "b"));
assertNotNull(q3);
assertNotSame(q1, q3);
- assertNotNull(q3.getMetaData(resolver).getCacheKey());
- assertFalse(q1.getName().equals(q3.getMetaData(resolver).getCacheKey()));
+ assertNotNull(q3.getName());
+ assertFalse(q1.getName().equals(q3.getName()));
Query q4 = q1.queryWithParameters(Collections.singletonMap("a", "b"));
assertNotNull(q4);
assertNotSame(q3, q4);
- assertEquals(q3.getMetaData(resolver).getCacheKey(), q4
- .getMetaData(resolver)
- .getCacheKey());
+ assertEquals(q3.getName(), q4.getName());
}
public void testSerializability() throws Exception {
@@ -75,7 +72,9 @@
public void testSerializabilityWithHessian() throws Exception {
SQLTemplate o = new SQLTemplate("Test", "DO SQL");
- Object clone = HessianUtil.cloneViaClientServerSerialization(o, new EntityResolver());
+ Object clone = HessianUtil.cloneViaClientServerSerialization(
+ o,
+ new EntityResolver());
assertTrue(clone instanceof SQLTemplate);
SQLTemplate c1 = (SQLTemplate) clone;
Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java?rev=427180&r1=427179&r2=427180&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java Mon Jul 31 10:40:02 2006
@@ -33,6 +33,11 @@
QueryMetadata md1 = query.getMetaData(resolver);
assertEquals(QueryMetadata.NO_CACHE, md1.getCachePolicy());
assertNull(md1.getCacheKey());
+
+ query.setName("XYZ");
+ QueryMetadata md2 = query.getMetaData(resolver);
+ assertEquals(QueryMetadata.NO_CACHE, md2.getCachePolicy());
+ assertNull(md2.getCacheKey());
}
public void testLocalCache() {