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 18:31:50 UTC

svn commit: r427157 - 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 09:31:49 2006
New Revision: 427157

URL: http://svn.apache.org/viewvc?rev=427157&view=rev
Log:
CAY-613 - genertaing cache key automatically for select queries

Added:
    incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.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/SelectQuery.java

Modified: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQuery.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQuery.java?rev=427157&r1=427156&r2=427157&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQuery.java (original)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQuery.java Mon Jul 31 09:31:49 2006
@@ -57,7 +57,7 @@
     protected Expression parentQualifier;
     protected String parentObjEntityName;
 
-    BaseQueryMetadata selectInfo = new BaseQueryMetadata();
+    SelectQueryMetadata selectInfo = new SelectQueryMetadata();
 
     /** Creates an empty SelectQuery. */
     public SelectQuery() {
@@ -148,7 +148,7 @@
      * @since 1.2
      */
     public QueryMetadata getMetaData(EntityResolver resolver) {
-        selectInfo.resolve(root, resolver, getName());
+        selectInfo.resolve(root, resolver, this);
 
         // must force DataRows if custom attributes are fetched
         if (isFetchingCustomAttributes()) {

Added: incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java?rev=427157&view=auto
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java Mon Jul 31 09:31:49 2006
@@ -0,0 +1,81 @@
+/*****************************************************************
+ *   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.Iterator;
+
+import org.apache.cayenne.map.EntityResolver;
+
+/**
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class SelectQueryMetadata extends BaseQueryMetadata {
+
+    boolean resolve(Object root, EntityResolver resolver, SelectQuery 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, qualifier and ordering
+
+                StringBuffer key = new StringBuffer();
+                if (objEntity != null) {
+                    key.append(objEntity.getName());
+                }
+                else if (dbEntity != null) {
+                    key.append("db:").append(dbEntity.getName());
+                }
+
+                if (query.getQualifier() != null) {
+                    key.append('/').append(query.getQualifier());
+                }
+
+                if (!query.getOrderings().isEmpty()) {
+                    Iterator it = query.getOrderings().iterator();
+                    while (it.hasNext()) {
+
+                        Ordering o = (Ordering) it.next();
+                        key.append('/').append(o.getSortSpecString());
+                        if (!o.isAscending()) {
+                            key.append(":d");
+                        }
+
+                        if (o.isCaseInsensitive()) {
+                            key.append(":i");
+                        }
+                    }
+                }
+                
+                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/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=427157&view=auto
==============================================================================
--- incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java (added)
+++ incubator/cayenne/main/trunk/core/cayenne-jdk1.4-core/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyTst.java Mon Jul 31 09:31:49 2006
@@ -0,0 +1,77 @@
+/*****************************************************************
+ *   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 SelectQueryCacheKeyTst extends CayenneTestCase {
+
+    public void testNoCache() {
+
+        EntityResolver resolver = getDomain().getEntityResolver();
+        
+        SelectQuery query = new SelectQuery(Artist.class);
+        
+        QueryMetadata md1 = query.getMetaData(resolver);
+        assertEquals(QueryMetadata.NO_CACHE, md1.getCachePolicy());
+        assertNull(md1.getCacheKey());
+    }
+    
+    public void testLocalCache() {
+
+        EntityResolver resolver = getDomain().getEntityResolver();
+        
+        SelectQuery query = new SelectQuery(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();
+        
+        SelectQuery query = new SelectQuery(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();
+        
+        SelectQuery query = new SelectQuery(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());
+    }
+}