/** * Creates parser */ public function __construct() { parent::__construct([self::STATE_QUERY_ELEMENT, self::STATE_INCLUDED_RANGE_START, self::STATE_INCLUDED_RANGE_FIRST_TERM, self::STATE_INCLUDED_RANGE_TO_TERM, self::STATE_INCLUDED_RANGE_LAST_TERM, self::STATE_INCLUDED_RANGE_END, self::STATE_EXCLUDED_RANGE_START, self::STATE_EXCLUDED_RANGE_FIRST_TERM, self::STATE_EXCLUDED_RANGE_TO_TERM, self::STATE_EXCLUDED_RANGE_LAST_TERM, self::STATE_EXCLUDED_RANGE_END], QueryToken::getTypes()); $this->addTransitions([[self::STATE_QUERY_ELEMENT, QueryToken::TYPE_WORD, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_PHRASE, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_NUMBER, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_DATE, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_OPERATOR, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_AND_OPERATOR, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_OR_OPERATOR, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_NOT_OPERATOR, self::STATE_QUERY_ELEMENT], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_LEFT_SQUARE_BRACKET, self::STATE_INCLUDED_RANGE_START], [self::STATE_QUERY_ELEMENT, QueryToken::TYPE_LEFT_PARENTHESIS, self::STATE_EXCLUDED_RANGE_START]]); $this->addTransitions([[self::STATE_INCLUDED_RANGE_START, QueryToken::TYPE_WORD, self::STATE_INCLUDED_RANGE_FIRST_TERM], [self::STATE_INCLUDED_RANGE_START, QueryToken::TYPE_DATE, self::STATE_INCLUDED_RANGE_FIRST_TERM], [self::STATE_INCLUDED_RANGE_START, QueryToken::TYPE_NUMBER, self::STATE_INCLUDED_RANGE_FIRST_TERM], [self::STATE_INCLUDED_RANGE_FIRST_TERM, QueryToken::TYPE_TO_LEXEME, self::STATE_INCLUDED_RANGE_TO_TERM], [self::STATE_INCLUDED_RANGE_TO_TERM, QueryToken::TYPE_WORD, self::STATE_INCLUDED_RANGE_LAST_TERM], [self::STATE_INCLUDED_RANGE_TO_TERM, QueryToken::TYPE_DATE, self::STATE_INCLUDED_RANGE_LAST_TERM], [self::STATE_INCLUDED_RANGE_TO_TERM, QueryToken::TYPE_NUMBER, self::STATE_INCLUDED_RANGE_LAST_TERM], [self::STATE_INCLUDED_RANGE_LAST_TERM, QueryToken::TYPE_RIGHT_SQUARE_BRACKET, self::STATE_INCLUDED_RANGE_END], [self::STATE_INCLUDED_RANGE_LAST_TERM, QueryToken::TYPE_RIGHT_PARENTHESIS, self::STATE_EXCLUDED_RANGE_END]]); $this->addTransitions([[self::STATE_EXCLUDED_RANGE_START, QueryToken::TYPE_WORD, self::STATE_EXCLUDED_RANGE_FIRST_TERM], [self::STATE_EXCLUDED_RANGE_START, QueryToken::TYPE_DATE, self::STATE_EXCLUDED_RANGE_FIRST_TERM], [self::STATE_EXCLUDED_RANGE_START, QueryToken::TYPE_NUMBER, self::STATE_EXCLUDED_RANGE_FIRST_TERM], [self::STATE_EXCLUDED_RANGE_FIRST_TERM, QueryToken::TYPE_TO_LEXEME, self::STATE_EXCLUDED_RANGE_TO_TERM], [self::STATE_EXCLUDED_RANGE_TO_TERM, QueryToken::TYPE_WORD, self::STATE_EXCLUDED_RANGE_LAST_TERM], [self::STATE_EXCLUDED_RANGE_TO_TERM, QueryToken::TYPE_DATE, self::STATE_EXCLUDED_RANGE_LAST_TERM], [self::STATE_EXCLUDED_RANGE_TO_TERM, QueryToken::TYPE_NUMBER, self::STATE_EXCLUDED_RANGE_LAST_TERM], [self::STATE_EXCLUDED_RANGE_LAST_TERM, QueryToken::TYPE_RIGHT_PARENTHESIS, self::STATE_EXCLUDED_RANGE_END], [self::STATE_EXCLUDED_RANGE_LAST_TERM, QueryToken::TYPE_RIGHT_SQUARE_BRACKET, self::STATE_INCLUDED_RANGE_END]]); $addTermEntryAction = new FSMAction($this, 'addTermEntry'); $addPhraseEntryAction = new FSMAction($this, 'addPhraseEntry'); $operatorAction = new FSMAction($this, 'operator'); $logicalOperatorAction = new FSMAction($this, 'logicalOperator'); $subQueryStartAction = new FSMAction($this, 'subQueryStart'); $subQueryEndAction = new FSMAction($this, 'subQueryEnd'); $includedRangeFirstTermAction = new FSMAction($this, 'includedRangeFirstTerm'); $includedRangeLastTermAction = new FSMAction($this, 'includedRangeLastTerm'); $excludedRangeFirstTermAction = new FSMAction($this, 'excludedRangeFirstTerm'); $excludedRangeLastTermAction = new FSMAction($this, 'excludedRangeLastTerm'); $this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_WORD, $addTermEntryAction); $this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_PHRASE, $addPhraseEntryAction); $this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_OPERATOR, $operatorAction); $this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_AND_OPERATOR, $logicalOperatorAction); $this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_OR_OPERATOR, $logicalOperatorAction); $this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_NOT_OPERATOR, $logicalOperatorAction); //$this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_LEFT_PARENTHESIS, $subQueryStartAction); //$this->addInputAction(self::STATE_QUERY_ELEMENT, QueryToken::TYPE_RIGHT_PARENTHESIS, $subQueryEndAction); $this->addEntryAction(self::STATE_INCLUDED_RANGE_FIRST_TERM, $includedRangeFirstTermAction); $this->addEntryAction(self::STATE_INCLUDED_RANGE_END, $includedRangeLastTermAction); $this->addEntryAction(self::STATE_EXCLUDED_RANGE_FIRST_TERM, $excludedRangeFirstTermAction); $this->addEntryAction(self::STATE_EXCLUDED_RANGE_END, $excludedRangeLastTermAction); if (!$this->lexer instanceof QueryLexerInterface) { $this->lexer = Yii::createObject($this->lexer); } }
/** * @param int $defaultOperator * @param array|int $higherPriorityOperator */ public function __construct($defaultOperator, $higherPriorityOperator = QueryParser::OPERATOR_AND) { $this->_defaultOperator = $defaultOperator; $this->_higherPriorityOperator = $higherPriorityOperator; parent::__construct([self::ST_START, self::ST_LITERAL, self::ST_NOT_OPERATOR, self::ST_AND_OPERATOR, self::ST_OR_OPERATOR], [self::IN_LITERAL, self::IN_NOT_OPERATOR, self::IN_AND_OPERATOR, self::IN_OR_OPERATOR]); $emptyOperatorAction = new FSMAction($this, 'emptyOperatorAction'); $emptyNotOperatorAction = new FSMAction($this, 'emptyNotOperatorAction'); $this->addTransitions([[self::ST_START, self::IN_LITERAL, self::ST_LITERAL], [self::ST_START, self::IN_NOT_OPERATOR, self::ST_NOT_OPERATOR], [self::ST_LITERAL, self::IN_AND_OPERATOR, self::ST_AND_OPERATOR], [self::ST_LITERAL, self::IN_OR_OPERATOR, self::ST_OR_OPERATOR], [self::ST_LITERAL, self::IN_LITERAL, self::ST_LITERAL, $emptyOperatorAction], [self::ST_LITERAL, self::IN_NOT_OPERATOR, self::ST_NOT_OPERATOR, $emptyNotOperatorAction], [self::ST_NOT_OPERATOR, self::IN_LITERAL, self::ST_LITERAL], [self::ST_AND_OPERATOR, self::IN_LITERAL, self::ST_LITERAL], [self::ST_AND_OPERATOR, self::IN_NOT_OPERATOR, self::ST_NOT_OPERATOR], [self::ST_OR_OPERATOR, self::IN_LITERAL, self::ST_LITERAL], [self::ST_OR_OPERATOR, self::IN_NOT_OPERATOR, self::ST_NOT_OPERATOR]]); $notOperatorAction = new FSMAction($this, 'notOperatorAction'); $orOperatorAction = new FSMAction($this, 'orOperatorAction'); $andOperatorAction = new FSMAction($this, 'andOperatorAction'); $literalAction = new FSMAction($this, 'literalAction'); $this->addEntryAction(self::ST_NOT_OPERATOR, $notOperatorAction); $this->addEntryAction(self::ST_LITERAL, $literalAction); //if ($this->_higherPriorityOperator === QueryParser::OPERATOR_AND) { $this->addEntryAction(self::ST_OR_OPERATOR, $orOperatorAction); //} else { $this->addEntryAction(self::ST_AND_OPERATOR, $andOperatorAction); //} }