addClause($this->getCriterionForCondition($target, $value, $comparison, $searchQueryWriter)); } /** * Static create method provided so that you can perform method chaining. * * @param $target * @param null $value * @param null $comparison * @param AbstractSearchQueryWriter $searchQueryWriter * @return SearchCriteria */ public static function create( $target, $value = null, $comparison = null, AbstractSearchQueryWriter $searchQueryWriter = null ) { return new SearchCriteria($target, $value, $comparison, $searchQueryWriter); } /** * @return null|SearchAdapterInterface */ public function getAdapter() { return $this->adapter; } /** * @param SearchAdapterInterface $adapter * @return $this */ public function setAdapter(SearchAdapterInterface $adapter) { $this->adapter = $adapter; return $this; } /** * @param string $ps Current prepared statement. * @return void * @throws \Exception */ public function appendPreparedStatementTo(&$ps) { $adapter = $this->getAdapter(); if (!$adapter instanceof SearchAdapterInterface) { throw new \Exception('No adapter has been applied to SearchCriteria'); } $ps .= $adapter->getOpenComparisonContainer(); foreach ($this->getClauses() as $key => $clause) { $clause->setAdapter($adapter); $clause->appendPreparedStatementTo($ps); // There's always one less conjunction then there are clauses. if ($this->getConjunction($key) !== null) { $ps .= $adapter->getConjunctionFor($this->getConjunction($key)); } } $ps .= $adapter->getCloseComparisonContainer(); } /** * @param string|SearchCriteriaInterface $target * @param mixed $value * @param string|null $comparison * @param AbstractSearchQueryWriter $searchQueryWriter * @return $this */ public function addAnd( $target, $value = null, $comparison = null, AbstractSearchQueryWriter $searchQueryWriter = null ) { $criterion = $this->getCriterionForCondition($target, $value, $comparison, $searchQueryWriter); $this->addConjunction(SearchCriteria::CONJUNCTION_AND); $this->addClause($criterion); return $this; } /** * @param string|SearchCriteriaInterface $target * @param mixed $value * @param string|null $comparison * @param AbstractSearchQueryWriter $searchQueryWriter * @return $this */ public function addOr( $target, $value = null, $comparison = null, AbstractSearchQueryWriter $searchQueryWriter = null ) { $criterion = $this->getCriterionForCondition($target, $value, $comparison, $searchQueryWriter); $this->addConjunction(SearchCriteria::CONJUNCTION_OR); $this->addClause($criterion); return $this; } /** * @param string|SearchCriteriaInterface $target * @param mixed $value * @param string $comparison * @param AbstractSearchQueryWriter $searchQueryWriter * @return SearchCriteriaInterface */ protected function getCriterionForCondition( $target, $value, $comparison, AbstractSearchQueryWriter $searchQueryWriter = null ) { if ($target instanceof SearchCriteriaInterface) { return $target; } return new SearchCriterion($target, $value, $comparison, $searchQueryWriter); } /** * @return SearchCriteriaInterface[] */ protected function getClauses() { return $this->clauses; } /** * @param SearchCriteriaInterface $criterion */ protected function addClause($criterion) { $this->clauses[] = $criterion; } /** * @return string[] */ protected function getConjunctions() { return $this->conjunctions; } /** * @param int $key * @return string|null */ protected function getConjunction($key) { $conjunctions = $this->getConjunctions(); if (!array_key_exists($key, $conjunctions ?? [])) { return null; } return $conjunctions[$key]; } /** * @param string $conjunction */ protected function addConjunction($conjunction) { $this->conjunctions[] = $conjunction; } }