do not match in pre/postfix of empty fields

Empty fields where pre and postfixed just as any other field. When
searching for a string that matched a pre/postfix all empty fields where
returned because the pre/postfix matched.
This commit is contained in:
Andreas Gohr
2017-01-24 15:55:12 +01:00
parent db9b87454b
commit dc7d8d082c
2 changed files with 17 additions and 13 deletions

View File

@ -21,7 +21,7 @@ class Type_Text_struct_test extends StructTest {
'', // postfix
'=', // comp
'val', // value
'(T.col = ?)', // expect sql
'((T.col != \'\' AND T.col = ?))', // expect sql
array('val'), // expect opts
),
array(
@ -29,7 +29,7 @@ class Type_Text_struct_test extends StructTest {
'', // postfix
'=', // comp
'val', // value
'(? || T.col = ?)', // expect sql
'((T.col != \'\' AND ? || T.col = ?))', // expect sql
array('before', 'val'), // expect opts
),
array(
@ -37,7 +37,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'=', // comp
'val', // value
'(T.col || ? = ?)', // expect sql
'((T.col != \'\' AND T.col || ? = ?))', // expect sql
array('after', 'val'), // expect opts
),
array(
@ -45,7 +45,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'=', // comp
'val', // value
'(? || T.col || ? = ?)', // expect sql
'((T.col != \'\' AND ? || T.col || ? = ?))', // expect sql
array('before', 'after', 'val'), // expect opts
),
// LIKE
@ -54,7 +54,7 @@ class Type_Text_struct_test extends StructTest {
'', // postfix
'LIKE', // comp
'%val%', // value
'(T.col LIKE ?)', // expect sql
'((T.col != \'\' AND T.col LIKE ?))', // expect sql
array('%val%'), // expect opts
),
array(
@ -62,7 +62,7 @@ class Type_Text_struct_test extends StructTest {
'', // postfix
'LIKE', // comp
'%val%', // value
'(? || T.col LIKE ?)', // expect sql
'((T.col != \'\' AND ? || T.col LIKE ?))', // expect sql
array('before','%val%'), // expect opts
),
array(
@ -70,7 +70,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'LIKE', // comp
'%val%', // value
'(T.col || ? LIKE ?)', // expect sql
'((T.col != \'\' AND T.col || ? LIKE ?))', // expect sql
array('after','%val%'), // expect opts
),
array(
@ -78,7 +78,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'LIKE', // comp
'%val%', // value
'(? || T.col || ? LIKE ?)', // expect sql
'((T.col != \'\' AND ? || T.col || ? LIKE ?))', // expect sql
array('before','after','%val%'), // expect opts
),
// NOT LIKE
@ -87,7 +87,7 @@ class Type_Text_struct_test extends StructTest {
'', // postfix
'NOT LIKE', // comp
'%val%', // value
'(T.col NOT LIKE ?)', // expect sql
'((T.col != \'\' AND T.col NOT LIKE ?))', // expect sql
array('%val%'), // expect opts
),
array(
@ -95,7 +95,7 @@ class Type_Text_struct_test extends StructTest {
'', // postfix
'NOT LIKE', // comp
'%val%', // value
'(? || T.col NOT LIKE ?)', // expect sql
'((T.col != \'\' AND ? || T.col NOT LIKE ?))', // expect sql
array('before','%val%'), // expect opts
),
array(
@ -103,7 +103,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'NOT LIKE', // comp
'%val%', // value
'(T.col || ? NOT LIKE ?)', // expect sql
'((T.col != \'\' AND T.col || ? NOT LIKE ?))', // expect sql
array('after','%val%'), // expect opts
),
array(
@ -111,7 +111,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'NOT LIKE', // comp
'%val%', // value
'(? || T.col || ? NOT LIKE ?)', // expect sql
'((T.col != \'\' AND ? || T.col || ? NOT LIKE ?))', // expect sql
array('before','after','%val%'), // expect opts
),
@ -121,7 +121,7 @@ class Type_Text_struct_test extends StructTest {
'after', // postfix
'NOT LIKE', // comp
array('%val1%', '%val2%'), // multiple values
'((? || T.col || ? NOT LIKE ? OR ? || T.col || ? NOT LIKE ?))', // expect sql
'((T.col != \'\' AND (? || T.col || ? NOT LIKE ? OR ? || T.col || ? NOT LIKE ?)))', // expect sql
array('before','after','%val1%', 'before','after','%val2%',), // expect opts
),
);

View File

@ -35,6 +35,10 @@ class Text extends AbstractMultiBaseType {
* @param string $op
*/
public function filter(QueryBuilderWhere $add, $tablealias, $colname, $comp, $value, $op) {
$add = $add->where($op); // open a subgroup
$add->where('AND', "$tablealias.$colname != ''"); // make sure the field isn't empty
$op = 'AND';
/** @var QueryBuilderWhere $add Where additionional queries are added to */
if(is_array($value)) {
$add = $add->where($op); // sub where group