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