Forráskód Böngészése

Fixed #ZF-6746, reviewed Paginator caching system

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15883 44c647ce-9c0f-0410-b52a-842ac1e357ba
doctorrock83 16 éve
szülő
commit
0bbc09412b
2 módosított fájl, 56 hozzáadás és 37 törlés
  1. 23 14
      library/Zend/Paginator.php
  2. 33 23
      tests/Zend/PaginatorTest.php

+ 23 - 14
library/Zend/Paginator.php

@@ -471,11 +471,9 @@ class Zend_Paginator implements Countable, IteratorAggregate
 
         if (null === $pageNumber) {
             $cleanTags = self::CACHE_TAG_PREFIX;
-            foreach (self::$_cache->getIds() as $id) {
-                if (strpos($id, self::CACHE_TAG_PREFIX) !== false) {
-                    if (preg_match('|'.self::CACHE_TAG_PREFIX."(\d+)_.*|", $id, $page)) {
-                        self::$_cache->remove($this->_getCacheId($page[1]));
-                    }
+            foreach (self::$_cache->getIdsMatchingTags(array($this->_getCacheInternalId())) as $id) {
+                if (preg_match('|'.self::CACHE_TAG_PREFIX."(\d+)_.*|", $id, $page)) {
+                    self::$_cache->remove($this->_getCacheId($page[1]));
                 }
             }
         } else {
@@ -655,9 +653,6 @@ class Zend_Paginator implements Countable, IteratorAggregate
             $this->_itemCountPerPage = 1;
         }
         $this->_pageCount        = $this->_calculatePageCount();
-        if ($this->_cacheEnabled()) {
-            $this->clearPageItemCache();
-        }
         $this->_currentItems     = null;
         $this->_currentItemCount = null;
 
@@ -714,7 +709,7 @@ class Zend_Paginator implements Countable, IteratorAggregate
         }
 
         if ($this->_cacheEnabled()) {
-            self::$_cache->save($items, $this->_getCacheId($pageNumber));
+            self::$_cache->save($items, $this->_getCacheId($pageNumber), array($this->_getCacheInternalId()));
         }
 
         return $items;
@@ -798,12 +793,10 @@ class Zend_Paginator implements Countable, IteratorAggregate
     {
         $data = array();
         if ($this->_cacheEnabled()) {
-            foreach (self::$_cache->getIds() as $id) {
-                if (strpos($id, self::CACHE_TAG_PREFIX) !== false) {
+            foreach (self::$_cache->getIdsMatchingTags(array($this->_getCacheInternalId())) as $id) {
                     if (preg_match('|'.self::CACHE_TAG_PREFIX."(\d+)_.*|", $id, $page)) {
                         $data[$page[1]] = self::$_cache->load($this->_getCacheId($page[1]));
                     }
-                }
             }
         }
         return $data;
@@ -932,7 +925,10 @@ class Zend_Paginator implements Countable, IteratorAggregate
 
     /**
      * Makes an Id for the cache
-     * Depends on the object and the page number
+     * Depends on the adapter object and the page number
+     * 
+     * Used to store item in cache from that Paginator instance
+     *  and that current page
      *
      * @param int $page
      * @return string
@@ -942,7 +938,20 @@ class Zend_Paginator implements Countable, IteratorAggregate
         if ($page === null) {
             $page = $this->getCurrentPageNumber();
         }
-        return self::CACHE_TAG_PREFIX . $page . '_' . spl_object_hash($this);
+        return self::CACHE_TAG_PREFIX . $page . '_' . $this->_getCacheInternalId();
+    }
+    
+    /**
+     * Get the internal cache id
+     * Depends on the adapter and the item count per page
+     * 
+     * Used to tag that unique Paginator instance in cache
+     *
+     * @return string
+     */
+    protected function _getCacheInternalId()
+    {
+        return md5(serialize($this->_adapter).$this->_itemCountPerPage);
     }
 
     /**

+ 33 - 23
tests/Zend/PaginatorTest.php

@@ -700,35 +700,39 @@ class Zend_PaginatorTest extends PHPUnit_Framework_TestCase
         $this->assertType('ArrayObject', $paginator->getCurrentItems());
     }
 
+    public function testCachedItem()
+    {
+        $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
+        $this->_paginator->setCurrentPageNumber(2)->getCurrentItems();
+        $this->_paginator->setCurrentPageNumber(3)->getCurrentItems();
+
+        $pageItems = $this->_paginator->getPageItemCache();
+        $expected = array(
+           1 => new ArrayIterator(range(1, 10)),
+           2 => new ArrayIterator(range(11, 20)),
+           3 => new ArrayIterator(range(21, 30))
+        );
+        $this->assertEquals($expected, $pageItems);
+    }
+    
     public function testClearPageItemCache()
     {
         $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
     	$this->_paginator->setCurrentPageNumber(2)->getCurrentItems();
     	$this->_paginator->setCurrentPageNumber(3)->getCurrentItems();
 
-    	$pageItems = $this->_paginator->getPageItemCache();
-
-    	$expected = array(
-    	   1 => new ArrayIterator(range(1, 10)),
-    	   2 => new ArrayIterator(range(11, 20)),
-    	   3 => new ArrayIterator(range(21, 30))
-    	);
-
-    	$this->assertEquals($expected, $pageItems);
-
-    	$this->_paginator->clearPageItemCache(2);
-    	$pageItems = $this->_paginator->getPageItemCache();
-
+        // clear only page 2 items
+        $this->_paginator->clearPageItemCache(2);
+        $pageItems = $this->_paginator->getPageItemCache();
     	$expected = array(
            1 => new ArrayIterator(range(1, 10)),
            3 => new ArrayIterator(range(21, 30))
         );
-
         $this->assertEquals($expected, $pageItems);
 
+        // clear all
         $this->_paginator->clearPageItemCache();
         $pageItems = $this->_paginator->getPageItemCache();
-
         $this->assertEquals(array(), $pageItems);
     }
 
@@ -749,22 +753,28 @@ class Zend_PaginatorTest extends PHPUnit_Framework_TestCase
 
     public function testCacheDoesNotDisturbResultsWhenChangingParam()
     {
-        $pageItems = $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
-        $expected = new ArrayIterator(range(1, 10));
-        $this->assertEquals($expected, $pageItems);
-
+        $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
         $pageItems = $this->_paginator->setItemCountPerPage(5)->getCurrentItems();
+        
         $expected = new ArrayIterator(range(1, 5));
         $this->assertEquals($expected, $pageItems);
 
         $pageItems = $this->_paginator->getItemsByPage(2);
         $expected = new ArrayIterator(range(6, 10));
         $this->assertEquals($expected, $pageItems);
-
-        $this->_paginator->setItemCountPerPage(2)->getCurrentItems();
+        
+        // change the inside Paginator scale
+        $pageItems = $this->_paginator->setItemCountPerPage(8)->setCurrentPageNumber(3)->getCurrentItems();
+        
         $pageItems = $this->_paginator->getPageItemCache();
-        $expected = array(1 =>new ArrayIterator(range(1, 2)));
-
+        $expected = array(3 => new ArrayIterator(range(17, 24)));
+        $this->assertEquals($expected, $pageItems);
+        
+        // get back to already cached data
+        $this->_paginator->setItemCountPerPage(5);
+        $pageItems = $this->_paginator->getPageItemCache();
+        $expected =array(1 => new ArrayIterator(range(1, 5)), 
+                         2 => new ArrayIterator(range(6, 10)));
         $this->assertEquals($expected, $pageItems);
     }