示例#1
0
 protected function preQuery(Query &$query)
 {
     $scriptNameNode = new EqNode('scriptName', $this->scriptName);
     if ($query->getQuery()) {
         $query->setQuery(new AndNode([$scriptNameNode, $query->getQuery()]));
     } else {
         $query->setQuery($scriptNameNode);
     }
 }
示例#2
0
 /**
  * @param AbstractQueryNode $query
  * @return $this
  */
 public function addQuery(AbstractQueryNode $query)
 {
     $current = $this->query->getQuery();
     if ($current === null) {
         $this->query->setQuery($query);
     } elseif ($current instanceof AndNode) {
         $current->addQuery($query);
     } else {
         $this->query->setQuery(new AndNode([$current, $query]));
     }
     return $this;
 }
示例#3
0
 /**
  * Adds limits to query for limiting time range
  *
  * @param Query $query
  * @param $tickId
  * @param $step
  * @return Query
  */
 protected function addTickLimit(Query $query, $tickId, $step)
 {
     $field = $step < 1 ? 'id' : 'timestamp';
     $andNode = new LogicOperator\AndNode([$query->getQuery(), new ScalarOperator\GeNode($field, $tickId), new ScalarOperator\LtNode($field, $tickId + $step)]);
     $query->setQuery($andNode);
     return $query;
 }
示例#4
0
 protected function postQuery(&$result, Query $query)
 {
     if ($query->getQuery()) {
         if (count($result) === 0) {
             $queryStr = urldecode(RqlParser::rqlEncode($query));
             $pattern = '/^and\\(eq\\(tableName\\,([a-zA-Z0-9_]+)\\)\\,eq\\(name\\,_default\\)\\)/';
             $match = [];
             if (preg_match($pattern, $queryStr, $match)) {
                 $requestName = isset($match[1]) ? $match[1] : "";
                 $configuration = $this->configureGeneratorFactory->__invoke($requestName)->getConfiguration();
                 $res = ['table_name' => $requestName, 'name' => '_default', 'preference' => json_encode($configuration)];
                 foreach ($res as $key => $item) {
                     $result[0][$key] = $item;
                 }
             }
         }
     }
 }
示例#5
0
 /**
  * {@inheritdoc}
  *
  * {@inheritdoc}
  */
 public function query(Query $query)
 {
     $limits = $query->getLimit();
     $limit = !$limits ? self::LIMIT_INFINITY : $query->getLimit()->getLimit();
     $offset = !$limits ? 0 : $query->getLimit()->getOffset();
     $sort = $query->getSort();
     $sortFilds = !$sort ? [$this->getIdentifier() => SortNode::SORT_ASC] : $sort->getFields();
     $select = $query->getSelect();
     //What filds will return
     $selectFilds = !$select ? [] : $select->getFields();
     $selectSQL = $this->dbTable->getSql()->select();
     // ***********************   where   ***********************
     $conditionBuilder = $this->conditionBuilder;
     $where = $conditionBuilder($query->getQuery());
     $selectSQL->where($where);
     // ***********************   order   ***********************
     foreach ($sortFilds as $ordKey => $ordVal) {
         if ((int) $ordVal === SortNode::SORT_DESC) {
             $selectSQL->order($ordKey . ' ' . Select::ORDER_DESCENDING);
         } else {
             $selectSQL->order($ordKey . ' ' . Select::ORDER_ASCENDING);
         }
     }
     // *********************  limit, offset   ***********************
     if ($limit != self::LIMIT_INFINITY) {
         $selectSQL->limit($limit);
     }
     if ($offset != 0) {
         $selectSQL->offset($offset);
     }
     // *********************  filds  ***********************
     if (!empty($selectFilds)) {
         $selectSQL->columns($selectFilds);
     }
     // ***********************   return   ***********************
     $rowset = $this->dbTable->selectWith($selectSQL);
     return $rowset->toArray();
 }
示例#6
0
 protected function queryWhere(Query $query, $limit, $offset)
 {
     $conditionBuilder = $this->conditionBuilder;
     $conditioon = $conditionBuilder($query->getQuery());
     $whereFunctionBody = PHP_EOL . '$result = ' . PHP_EOL . rtrim($conditioon, PHP_EOL) . ';' . PHP_EOL . 'return $result;';
     $whereFunction = create_function('$item', $whereFunctionBody);
     $suitableItemsNumber = 0;
     $result = [];
     foreach ($this as $value) {
         switch (true) {
             case !$whereFunction($value):
                 break;
                 // skip!
             // skip!
             case $suitableItemsNumber < $offset:
                 $suitableItemsNumber = $suitableItemsNumber + 1;
                 break;
                 // increment!
             // increment!
             case $limit != self::LIMIT_INFINITY && $suitableItemsNumber >= $limit + $offset:
                 return $result;
                 //enough!
             //enough!
             default:
                 $result[] = $value;
                 // write!
                 $suitableItemsNumber = $suitableItemsNumber + 1;
         }
     }
     return $result;
 }
示例#7
0
 /**
  * Determines step size from rql query finding all time labels and find min weight from them
  * @param Query $query
  * @throws TimelineDataStoreException
  */
 public function determineStep(Query $query)
 {
     // TODO: When Query-class will have a method which will build rql-string from rql-object this vethod will require refactoring
     $timeWeights = $this->collectAllTimeWeights($query->getQuery());
     if (!count($timeWeights)) {
         $step = self::DEFAULT_STEP;
     } else {
         $step = min($timeWeights);
     }
     return $step;
 }
示例#8
0
 public function encode(Query $query)
 {
     $conditionBuilder = $this->conditionBuilder;
     $rqlQueryString = $conditionBuilder($query->getQuery());
     $rqlQueryString = $rqlQueryString . $this->makeLimit($query);
     $rqlQueryString = $rqlQueryString . $this->makeSort($query);
     $rqlQueryString = $rqlQueryString . $this->makeSelect($query);
     return ltrim($rqlQueryString, '&');
 }
 public function visit(Query $query, SqlBuilder $sqlBuilder)
 {
     if ($query->getSelect() !== null) {
         $this->visitSelectNode($query->getSelect(), $sqlBuilder);
     }
     if ($query->getQuery() !== null) {
         $this->visitQueryNode($query->getQuery(), $sqlBuilder);
     }
     if ($query->getSort() !== null) {
         $this->visitSortNode($query->getSort(), $sqlBuilder);
     }
     if ($query->getLimit() !== null) {
         $this->visitLimitNode($query->getLimit(), $sqlBuilder);
     }
 }
示例#10
0
 public function getSqlQuery(Query $query)
 {
     $conditionBuilder = new SqlConditionBuilder($this->dbTable->getAdapter(), $this->dbTable->getTable());
     $selectSQL = $this->dbTable->getSql()->select();
     $selectSQL->where($conditionBuilder($query->getQuery()));
     $selectSQL = $this->setSelectOrder($selectSQL, $query);
     $selectSQL = $this->setSelectLimitOffset($selectSQL, $query);
     $selectSQL = $this->setSelectColumns($selectSQL, $query);
     $selectSQL = $this->setSelectJoin($selectSQL, $query);
     $selectSQL = $this->makeExternalSql($selectSQL);
     //build sql string
     $sql = $this->dbTable->getSql()->buildSqlString($selectSQL);
     //replace double ` char to single.
     $sql = str_replace(["`(", ")`", "``"], ['(', ')', "`"], $sql);
     return $sql;
 }
示例#11
0
 protected function getData($scriptName, Query $query)
 {
     $reqQuery = new Query();
     if ($query->getQuery() !== null) {
         $reqQuery->setQuery(new AndNode([new EqNode('scriptName', $scriptName), $query->getQuery()]));
     } else {
         $reqQuery->setQuery(new EqNode('scriptName', $scriptName));
     }
     return $this->dataStore->query($reqQuery);
 }
 /**
  * build a querybuilder from the AST
  *
  * @param Query|Node $query or node
  * @param bool       $expr  wrap in expr?
  *
  * @return Builder|Expr
  */
 private function recurse($query, $expr = false)
 {
     if ($expr) {
         $node = $query;
     } else {
         $node = $query->getQuery();
     }
     list($node, $this->builder) = $this->dispatchNodeEvent($node);
     if ($query instanceof Query) {
         $this->visitQuery($query);
     }
     if (in_array(get_class($node), array_keys($this->internalMap))) {
         $method = $this->internalMap[get_class($node)];
         return $this->{$method}($node, $expr);
     } elseif ($node instanceof AbstractScalarOperatorNode) {
         return $this->visitScalar($node, $expr);
     } elseif ($node instanceof AbstractArrayOperatorNode) {
         return $this->visitArray($node, $expr);
     } elseif ($node instanceof AbstractLogicOperatorNode) {
         $method = $this->queryMap[get_class($node)];
         return $this->visitLogic($method, $node, $expr);
     }
     return $this->builder;
 }
示例#13
0
 public function getSqlQuery(Query $query)
 {
     $conditionBuilder = new SqlConditionBuilder($this->dbTable->getAdapter(), $this->dbTable->getTable());
     $selectSQL = $this->dbTable->getSql()->select();
     $selectSQL->where($conditionBuilder($query->getQuery()));
     $selectSQL = $this->setSelectOrder($selectSQL, $query);
     $selectSQL = $this->setSelectLimitOffset($selectSQL, $query);
     $selectSQL = $this->setSelectColumns($selectSQL, $query);
     $selectSQL = $this->setSelectJoin($selectSQL, $query);
     $fields = $selectSQL->getRawState(Select::COLUMNS);
     if (isset($fields['.bounds.'])) {
         unset($fields['.bounds.']);
         if (empty($fields)) {
             $fields = [Select::SQL_STAR];
         }
         $selectSQL->columns($fields);
     }
     $selectSQL = $this->makeExternalSql($selectSQL);
     //build sql string
     $sql = $this->dbTable->getSql()->buildSqlString($selectSQL);
     //replace double ` char to single.
     $sql = str_replace(["`(", ")`", "``"], ['(', ')', "`"], $sql);
     return $sql;
 }
示例#14
0
 /**
  * @param \Xiag\Rql\Parser\Query $query
  *
  * @throws \AndreasGlaser\DoctrineRql\Visitor\VisitorException
  * @author Andreas Glaser
  */
 protected function visitQuery(RqlQuery $query)
 {
     if ($selectNode = $query->getSelect()) {
         // todo: Implement this
     }
     if ($abstractQueryNode = $query->getQuery()) {
         $this->qb->andWhere($this->walkNodes($abstractQueryNode));
     }
     if ($query->getSort()) {
         $this->visitSort($query->getSort());
     }
     if ($query->getLimit()) {
         $this->visitLimit($query->getLimit());
     }
 }