protected function resetSearchColumns(Filter &$filter) { if ($filter->isChain()) { $filters =& $filter->filters(); if (!($empty = empty($filters))) { foreach ($filters as $k => &$f) { if (false === $this->resetSearchColumns($f)) { unset($filters[$k]); } } } return $empty || !empty($filters); } return $filter->isExpression() ? !(in_array($filter->getColumn(), $this->searchColumns) && $filter->getSign() === '=') : true; }
/** * Render and return the given filter expression * * @param Filter $filter * * @return string */ protected function renderFilterExpression(Filter $filter) { $column = $filter->getColumn(); $sign = $filter->getSign(); $value = $filter->getExpression(); if (is_array($value) && $sign === '=') { // TODO: Should we support this? Doesn't work for blub* return $column . ' IN (' . $this->dbAdapter->quote($value) . ')'; } elseif ($sign === '=' && strpos($value, '*') !== false) { return $column . ' LIKE ' . $this->dbAdapter->quote(preg_replace('~\\*~', '%', $value)); } elseif ($sign === '!=' && strpos($value, '*') !== false) { return $column . ' NOT LIKE ' . $this->dbAdapter->quote(preg_replace('~\\*~', '%', $value)); } else { return $column . ' ' . $sign . ' ' . $this->dbAdapter->quote($value); } }
/** * Render and return the given filter expression * * @param Filter $filter * * @return string */ protected function renderFilterExpression(Filter $filter) { $column = $filter->getColumn(); $sign = $filter->getSign(); $value = $filter->getExpression(); if (is_array($value)) { if ($sign === '=') { return $column . ' IN (' . $this->dbAdapter->quote($value) . ')'; } elseif ($sign === '!=') { return $column . ' NOT IN (' . $this->dbAdapter->quote($value) . ')'; } throw new ProgrammingError('Unable to render array expressions with operators other than equal or not equal'); } elseif ($sign === '=' && strpos($value, '*') !== false) { if ($value === '*') { // We'll ignore such filters as it prevents index usage and because "*" means anything, anything means // all whereas all means that whether we use a filter to match anything or no filter at all makes no // difference, except for performance reasons... return ''; } return $column . ' LIKE ' . $this->dbAdapter->quote(preg_replace('~\\*~', '%', $value)); } elseif ($sign === '!=' && strpos($value, '*') !== false) { if ($value === '*') { // We'll ignore such filters as it prevents index usage and because "*" means nothing, so whether we're // using a real column with a valid comparison here or just an expression which cannot be evaluated to // true makes no difference, except for performance reasons... return $this->dbAdapter->quote(0); } return $column . ' NOT LIKE ' . $this->dbAdapter->quote(preg_replace('~\\*~', '%', $value)); } else { return $column . ' ' . $sign . ' ' . $this->dbAdapter->quote($value); } }
/** * Render and return the given filter expression * * @param Filter $filter * * @return string */ protected function renderFilterExpression(Filter $filter) { $column = $filter->getColumn(); $sign = $filter->getSign(); $value = $filter->getExpression(); if (is_array($value)) { if ($sign === '=') { return $column . ' IN (' . $this->dbAdapter->quote($value) . ')'; } elseif ($sign === '!=') { return sprintf('(%1$s NOT IN (%2$s) OR %1$s IS NULL)', $column, $this->dbAdapter->quote($value)); } throw new ProgrammingError('Unable to render array expressions with operators other than equal or not equal'); } elseif ($sign === '=' && strpos($value, '*') !== false) { if ($value === '*') { // We'll ignore such filters as it prevents index usage and because "*" means anything, so whether we're // using a real column with a valid comparison here or just an expression which can only be evaluated to // true makes no difference, except for performance reasons... return new Zend_Db_Expr('TRUE'); } return $column . ' LIKE ' . $this->dbAdapter->quote(preg_replace('~\\*~', '%', $value)); } elseif ($sign === '!=' && strpos($value, '*') !== false) { if ($value === '*') { // We'll ignore such filters as it prevents index usage and because "*" means nothing, so whether we're // using a real column with a valid comparison here or just an expression which cannot be evaluated to // true makes no difference, except for performance reasons... return new Zend_Db_Expr('FALSE'); } return sprintf('(%1$s NOT LIKE %2$s OR %1$s IS NULL)', $column, $this->dbAdapter->quote(preg_replace('~\\*~', '%', $value))); } elseif ($sign === '!=') { return sprintf('(%1$s != %2$s OR %1$s IS NULL)', $column, $this->dbAdapter->quote($value)); } else { return sprintf('%s %s %s', $column, $sign, $this->dbAdapter->quote($value)); } }
/** * Render and return the given filter expression. * * This handles non-chain parts of the Filter. * * @param Filter $filter * @return string * @throws ProgrammingError */ protected function renderFilterExpression(Filter $filter) { /** @var FilterMatch $filter (just for resolving) */ $column = $filter->getColumn(); $sign = $filter->getSign(); $value = $filter->getExpression(); // array or lists if (is_array($value)) { if ($sign === '=' || $sign === '!=') { return array('query_string' => array('default_field' => $column, 'query' => '"' . join('" "', $value) . '"')); } throw new ProgrammingError('Unable to render array expressions with operators other than equal or not equal'); } elseif (strpos($value, '*') !== false) { if ($value === '*') { // (sign =) We'll ignore such filters as it prevents index usage and because "*" means anything, anything means // all whereas all means that whether we use a filter to match anything or no filter at all makes no // difference, except for performance reasons... // (sign !=) We'll ignore such filters as it prevents index usage and because "*" means nothing, so whether we're // using a real column with a valid comparison here or just an expression which cannot be evaluated to // true makes no difference, except for performance reasons... return null; } if ($sign === '=' || $sign === '!=') { return array('query_string' => array('default_field' => $column, 'query' => $value, 'analyze_wildcard' => true)); } throw new ProgrammingError('Unable to render expressions wildcards other than equal or not equal'); } else { // simple comparison via match if ($sign === '=' || $sign === '!=') { return array('match' => array($column => $value)); } elseif (preg_match('/^[<>]=?$/', $sign)) { $param_map = array('>' => 'gt', '<' => 'lt', '>=' => 'gte', '<=' => 'lte'); return array('range' => array($column => array($param_map[$sign] => $value))); } throw new ProgrammingError('Unable to render string expressions with operators other than equality and range'); } }