#9812: mark folder as read does not work with pgsql
authorPhilipp Schüle <p.schuele@metaways.de>
Wed, 26 Mar 2014 17:11:46 +0000 (18:11 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Tue, 8 Apr 2014 08:34:07 +0000 (10:34 +0200)
- fixes HAVING column for pgsql by using the getAggregate fn
- adds a test

https://forge.tine20.org/mantisbt/view.php?id=9812

Change-Id: I6bb67ee158b3d36c1115fdbac6735654b47a969e
Reviewed-on: http://gerrit.tine20.com/customers/478
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
Tested-by: Philipp Schüle <p.schuele@metaways.de>
tests/tine20/Felamimail/JsonTest.php
tine20/Felamimail/Model/MessageFilter.php

index bb1c947..bf34632 100644 (file)
@@ -7,7 +7,7 @@ use Sabre\DAV;
  * 
  * @package     Felamimail
  * @license     http://www.gnu.org/licenses/agpl.html
  * 
  * @package     Felamimail
  * @license     http://www.gnu.org/licenses/agpl.html
- * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2009-2014 Metaways Infosystems GmbH (http://www.metaways.de)
  * @author      Philipp Schüle <p.schuele@metaways.de>
  * 
  */
  * @author      Philipp Schüle <p.schuele@metaways.de>
  * 
  */
@@ -669,7 +669,6 @@ class Felamimail_JsonTest extends PHPUnit_Framework_TestCase
     
     /**
      * test flags (add + clear + deleted)
     
     /**
      * test flags (add + clear + deleted)
-     * 
      */
     public function testAddAndClearFlags()
     {
      */
     public function testAddAndClearFlags()
     {
@@ -698,7 +697,26 @@ class Felamimail_JsonTest extends PHPUnit_Framework_TestCase
         $this->_json->addFlags(array($message['id']), Zend_Mail_Storage::FLAG_DELETED);
         $this->_json->getMessage($message['id']);
     }
         $this->_json->addFlags(array($message['id']), Zend_Mail_Storage::FLAG_DELETED);
         $this->_json->getMessage($message['id']);
     }
-
+    
+    /**
+     * testMarkFolderRead
+     * 
+     * @see 0009812: mark folder as read does not work with pgsql
+     */
+    public function testMarkFolderRead()
+    {
+        $inboxBefore = $this->_getFolder('INBOX');
+        $filter = array(array(
+            'field' => 'folder_id', 'operator' => 'equals', 'value' => $inboxBefore->getId()
+        ), array(
+            'field' => 'flags', 'operator' => 'notin', 'value' => array(Zend_Mail_Storage::FLAG_SEEN)
+        ));
+        $this->_json->addFlags($filter, Zend_Mail_Storage::FLAG_SEEN);
+        
+        $inboxAfter = $this->_getFolder('INBOX');
+        $this->assertEquals(0, $inboxAfter->cache_unreadcount);
+    }
+    
     /**
      * test delete from trash
      */
     /**
      * test delete from trash
      */
index 3240569..32906d1 100644 (file)
@@ -212,8 +212,11 @@ class Felamimail_Model_MessageFilter extends Tinebase_Model_Filter_FilterGroup
         }
         
         if ($_filterData['field'] == 'flags') {
         }
         
         if ($_filterData['field'] == 'flags') {
+            $havingColumn = ($db instanceof Zend_Db_Adapter_Pdo_Pgsql)
+                ? Tinebase_Backend_Sql_Command::factory($db)->getAggregate('felamimail_cache_msg_flag.flag')
+                : 'flags';
             if ($_filterData['operator'] == 'equals' || $_filterData['operator'] == 'contains') {
             if ($_filterData['operator'] == 'equals' || $_filterData['operator'] == 'contains') {
-                $_select->having($db->quoteInto('flags LIKE ?', $value));
+                $_select->having($db->quoteInto($havingColumn . ' LIKE ?', $value));
             } else if ($_filterData['operator'] == 'in' || $_filterData['operator'] == 'notin') {
                 if (empty($value)) {
                     $whereString = 'flags IS NULL';
             } else if ($_filterData['operator'] == 'in' || $_filterData['operator'] == 'notin') {
                 if (empty($value)) {
                     $whereString = 'flags IS NULL';
@@ -230,9 +233,9 @@ class Felamimail_Model_MessageFilter extends Tinebase_Model_Filter_FilterGroup
                         $whereString = '(' . $whereString . ') OR flags IS NULL';
                     }
                 }
                         $whereString = '(' . $whereString . ') OR flags IS NULL';
                     }
                 }
-                $_select->having($whereString);
+                $_select->having(str_replace('flags', $havingColumn, $whereString));
             } else {
             } else {
-                $_select->having($db->quoteInto('flags NOT LIKE ? OR flags IS NULL', $value));
+                $_select->having($db->quoteInto($havingColumn . ' NOT LIKE ? OR ' . $havingColumn . ' IS NULL', $value));
             }
         } else {
             $_select->where(
             }
         } else {
             $_select->where(