private function filterIsOrIsNot($operator, Select $select, $conditionSetName, $value) { // Don't attempt to filter if no value is available if (!$value) { return $select; } $quotedAlias = $select->quoteWithAlias($this->tableName, $this->columnName); $operator = self::OP_IS === $operator ? '=' : '!='; return $select->whereConditionSet($conditionSetName, "{$quotedAlias} {$operator} ?", $value); }
private function filter($operator, Select $select, $conditionSetName, $value) { $quotedAlias = $select->quoteWithAlias($this->relationship->getSourceTable()->getTableName(), $this->relationship->getSourceColumnName()); switch ($operator) { case self::OP_NOT_EMPTY: case self::OP_CONTAINS: $operator = 'IN'; break; case self::OP_NOT_CONTAINS: case self::OP_EMPTY: $operator = 'NOT IN'; break; } return $select->whereConditionSet($conditionSetName, "{$quotedAlias} {$operator} (?)", new Expr($this->relationship->getFilterSubquery($value))); }
/** * Apply the filter to the supplied Select object. * * @param Select $select * @param string $conditionSetName * @param array $queryVars * @return Select * @throws InvalidOperator */ public function apply(Select $select, $conditionSetName, array $queryVars) { $this->ensurePresenceOfRequiredQueryVars($queryVars); if ($this->isExpr()) { $expression = (string) $this->expr; } else { $expression = $select->quoteWithAlias($this->tableName, $this->columnName); } $op1 = trim($queryVars['operand1']); $op2 = trim($queryVars['operand2']); switch ($queryVars['comp']) { case static::OP_IS: if ('' === $op1) { return $select; } return $select->whereConditionSet($conditionSetName, "{$expression} = ?", $op1); case static::OP_IS_BETWEEN: if ('' === $op1 && '' === $op2) { return $select; } elseif ('' === $op1) { return $select->whereConditionSet($conditionSetName, "{$expression} <= ?", $op2); } elseif ('' === $op2) { return $select->whereConditionSet($conditionSetName, "{$expression} >= ?", $op1); } else { if ($op1 > $op2) { $op1Temp = $op1; $op1 = $op2; $op2 = $op1Temp; } $db = $select->getAdapter(); return $select->whereConditionSet($conditionSetName, sprintf("{$expression} BETWEEN %s AND %s", $db->quote($op1), $db->quote($op2))); } case static::OP_IS_LESS_THAN: if ('' === $op1) { return $select; } return $select->whereConditionSet($conditionSetName, "{$expression} < ?", $op1); case static::OP_IS_MORE_THAN: if ('' === $op1) { return $select; } return $select->whereConditionSet($conditionSetName, "{$expression} > ?", $op1); default: throw new InvalidOperator("{$queryVars['comp']} is not a valid operator for numeric filters."); } }
/** * @todo Could use REVERSE() trick here, but we'd need to require at least PG 9.1. */ private function filterEndsWith(Select $select, $conditionSetName, $value) { $quotedAlias = $select->quoteWithAlias($this->tableName, $this->columnName); $operator = $select->getAdapter()->getDriver()->getCaseInsensitiveLikeOperator(); return $select->whereConditionSet($conditionSetName, "{$quotedAlias} {$operator} ?", '%' . $value); }