processQuery($query); } /** * Process query * * @param QueryInterface $query * @return bool * @throws \InvalidArgumentException */ private function processQuery(QueryInterface $query) { switch ($query->getType()) { case QueryInterface::TYPE_MATCH: return true; break; case QueryInterface::TYPE_BOOL: return $this->processBoolQuery($query); break; case QueryInterface::TYPE_FILTER: return $this->processFilterQuery($query); break; default: throw new \InvalidArgumentException(sprintf('Unknown query type \'%s\'', $query->getType())); } } /** * Process boolean query * * @param BoolExpression $query * @return bool * @throws \InvalidArgumentException */ private function processBoolQuery(BoolExpression $query) { foreach ($query->getShould() as $shouldQuery) { if ($this->processQuery($shouldQuery)) { return true; } } foreach ($query->getMust() as $mustQuery) { if ($this->processQuery($mustQuery)) { return true; } } foreach ($query->getMustNot() as $mustNotQuery) { if ($this->processQuery($mustNotQuery)) { return true; } } return false; } /** * Process filter query * * @param Filter $query * @return bool * @throws \InvalidArgumentException */ private function processFilterQuery(Filter $query) { switch ($query->getReferenceType()) { case Filter::REFERENCE_QUERY: return $this->processQuery($query->getReference()); break; case Filter::REFERENCE_FILTER: return false; break; default: throw new \InvalidArgumentException( sprintf( 'Unknown reference type \'%s\'', $query->getReferenceType() ) ); } } }