0012312: pgsql text filters should be case insensitive
authorPhilipp Schüle <p.schuele@metaways.de>
Fri, 11 Nov 2016 09:43:12 +0000 (10:43 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 14 Nov 2016 09:05:38 +0000 (10:05 +0100)
* use ILIKE in text filter

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

Change-Id: I41d34f08b5feeb28169e1cd99792f2f10d395912
Reviewed-on: http://gerrit.tine20.com/customers/3787
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tests/tine20/Addressbook/JsonTest.php
tine20/Tinebase/Model/Filter/Query.php
tine20/Tinebase/Model/Filter/Text.php

index 2716db2..51f08d5 100644 (file)
@@ -1372,6 +1372,20 @@ class Addressbook_JsonTest extends TestCase
     }
 
     /**
+     * testTextFilterCaseSensitivity
+     */
+    public function testTextFilterCaseSensitivity()
+    {
+        $contact = $this->_addContact();
+        $filter = array(
+            array('field' => 'n_family', 'operator' => 'contains', 'value' => strtolower('PHPUNIT'))
+        );
+        $result = $this->_instance->searchContacts($filter, array());
+
+        $this->assertGreaterThan(0, $result['totalcount'], 'contact not found: ' . print_r($result, true));
+    }
+
+    /**
      * return event organizuer filter
      *
      * @return array
index 5ebb189..3819a4a 100644 (file)
@@ -124,7 +124,7 @@ class Tinebase_Model_Filter_Query extends Tinebase_Model_Filter_Abstract
             case 'notin':
             case 'in':
                 foreach ($this->_options['fields'] as $qField) {
-                    // if field has . in name, then we allready have tablename
+                    // if field has . in name, then we already have tablename
                     if (strpos($qField, '.') !== FALSE) {
                         $whereParts[] = $db->quoteInto($db->quoteIdentifier($qField) . ($not?' NOT':'') . ' IN (?)', (array) $this->_value);
                     }
index 48db0a9..d7c038d 100644 (file)
@@ -68,19 +68,20 @@ class Tinebase_Model_Filter_Text extends Tinebase_Model_Filter_Abstract
     protected function _setOpSqlMap()
     {
         $db = Tinebase_Core::getDb();
+        $sqlCommand = Tinebase_Backend_Sql_Command::factory($db);
         $this->_opSqlMap = array(
-            'equals'            => array('sqlop' => ' LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),          'wildcards' => '?'  ),
-            'contains'          => array('sqlop' => ' LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),          'wildcards' => '%?%'),
-            'notcontains'       => array('sqlop' => ' NOT LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),      'wildcards' => '%?%'),
-            'startswith'        => array('sqlop' => ' LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),          'wildcards' => '?%' ),
-            'endswith'          => array('sqlop' => ' LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),          'wildcards' => '%?' ),
-            'not'               => array('sqlop' => ' NOT LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),      'wildcards' => '?'  ),
+            'equals'            => array('sqlop' => ' ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),          'wildcards' => '?'  ),
+            'contains'          => array('sqlop' => ' ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),          'wildcards' => '%?%'),
+            'notcontains'       => array('sqlop' => ' NOT ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),      'wildcards' => '%?%'),
+            'startswith'        => array('sqlop' => ' ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),          'wildcards' => '?%' ),
+            'endswith'          => array('sqlop' => ' ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),          'wildcards' => '%?' ),
+            'not'               => array('sqlop' => ' NOT ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),      'wildcards' => '?'  ),
             'in'                => array('sqlop' => ' IN (?)',          'wildcards' => '?'  ),
             'notin'             => array('sqlop' => ' NOT IN (?)',      'wildcards' => '?'  ),
             'isnull'            => array('sqlop' => ' IS NULL',         'wildcards' => '?'  ),
             'notnull'           => array('sqlop' => ' IS NOT NULL',     'wildcards' => '?'  ),
-            'group'             => array('sqlop' => " NOT LIKE  ''",    'wildcards' => '?'  ),
-            'equalsspecial'     => array('sqlop' => ' LIKE ' . Tinebase_Backend_Sql_Command::factory($db)->prepareForILike('(?)'),          'wildcards' => '?'  ),
+            'group'             => array('sqlop' => ' NOT ' . $sqlCommand->getLike() . "  ''",    'wildcards' => '?'  ),
+            'equalsspecial'     => array('sqlop' => ' ' .$sqlCommand->getLike() .' ' . $sqlCommand->prepareForILike('(?)'),          'wildcards' => '?'  ),
         );
     }