parser = new BaseQueryParser(); } /** * @throws FireflyException */ public function parse(string $query): NodeGroup { try { $result = $this->parser->parse($query); $nodes = array_map( fn (GdbotsNode\Node $node) => $this->convertNode($node), $result->getNodes() ); return new NodeGroup($nodes); } catch (\LogicException|\TypeError $e) { fwrite(STDERR, "Setting up GdbotsQueryParserTest\n"); app('log')->error($e->getMessage()); app('log')->error(sprintf('Could not parse search: "%s".', $query)); throw new FireflyException(sprintf('Invalid search value "%s". See the logs.', e($query)), 0, $e); } } private function convertNode(GdbotsNode\Node $node): Node { switch (true) { case $node instanceof GdbotsNode\Word: return new StringNode($node->getValue(), BoolOperator::PROHIBITED === $node->getBoolOperator()); case $node instanceof GdbotsNode\Field: return new FieldNode( $node->getValue(), (string) $node->getNode()->getValue(), BoolOperator::PROHIBITED === $node->getBoolOperator() ); case $node instanceof GdbotsNode\Subquery: Log::debug('Subquery'); return new NodeGroup( array_map( fn (GdbotsNode\Node $subNode) => $this->convertNode($subNode), $node->getNodes() ) ); case $node instanceof GdbotsNode\Phrase: case $node instanceof GdbotsNode\Numbr: case $node instanceof GdbotsNode\Date: case $node instanceof GdbotsNode\Url: case $node instanceof GdbotsNode\Hashtag: case $node instanceof GdbotsNode\Mention: case $node instanceof GdbotsNode\Emoticon: case $node instanceof GdbotsNode\Emoji: return new StringNode((string) $node->getValue(), BoolOperator::PROHIBITED === $node->getBoolOperator()); default: throw new FireflyException( sprintf('Unsupported node type: %s', get_class($node)) ); } } }