/** * {@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(); }
protected function querySort($data, Query $query) { if (empty($query->getSort())) { return $data; } $nextCompareLevel = ''; $sortFields = $query->getSort()->getFields(); foreach ($sortFields as $ordKey => $ordVal) { if ((int) $ordVal != SortNode::SORT_ASC && (int) $ordVal != SortNode::SORT_DESC) { throw new DataStoreException('Invalid condition: ' . $ordVal); } $cond = $ordVal == SortNode::SORT_DESC ? '<' : '>'; $notCond = $ordVal == SortNode::SORT_ASC ? '<' : '>'; $prevCompareLevel = "if (\$a['{$ordKey}'] {$cond} \$b['{$ordKey}']) {return 1;};" . PHP_EOL . "if (\$a['{$ordKey}'] {$notCond} \$b['{$ordKey}']) {return -1;};" . PHP_EOL; $nextCompareLevel = $nextCompareLevel . $prevCompareLevel; } $sortFunctionBody = $nextCompareLevel . 'return 0;'; $sortFunction = create_function('$a,$b', $sortFunctionBody); usort($data, $sortFunction); return $data; }
protected function setSelectOrder(Select $selectSQL, Query $query) { $sort = $query->getSort(); $sortFields = !$sort ? [$this->dbTable->table . '.' . $this->getIdentifier() => SortNode::SORT_ASC] : $sort->getFields(); /** @var Adapter $adapter */ $adapter = $this->dbTable->getAdapter(); $metadata = Factory::createSourceFromAdapter($adapter); foreach ($sortFields as $ordKey => $ordVal) { if (!preg_match('/[\\w]+\\.[\\w]+/', $ordKey)) { $fined = false; /** @var DbTable $entity */ foreach ($this->joinedEntities as $entity) { if (is_object($entity)) { $entityTable = $metadata->getTable($entity->dbTable->table); /** @var Column $column */ foreach ($entityTable->getColumns() as $column) { if ($column->getName() == $ordKey) { $ordKey = $entity->dbTable->table . '.' . $ordKey; $fined = true; break; } } } if ($fined) { break; } } if (!$fined) { $ordKey = $this->dbTable->table . '.' . $ordKey; } } if ((int) $ordVal === SortNode::SORT_DESC) { $selectSQL->order($ordKey . ' ' . Select::ORDER_DESCENDING); } else { $selectSQL->order($ordKey . ' ' . Select::ORDER_ASCENDING); } } return $selectSQL; }
protected function makeSort(Query $query) { $sortNode = $query->getSort(); $sortFields = !$sortNode ? [] : $sortNode->getFields(); if (empty($sortFields)) { return ''; } else { $strSort = ''; foreach ($sortFields as $key => $value) { $prefix = $value == SortNode::SORT_DESC ? '-' : '+'; $strSort = $strSort . $prefix . $key . ','; } return '&sort(' . rtrim($strSort, ',') . ')'; } }
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); } }
protected function setSelectOrder(Select $selectSQL, Query $query) { $sort = $query->getSort(); $sortFields = !$sort ? [$this->dbTable->table . '.' . $this->getIdentifier() => SortNode::SORT_ASC] : $sort->getFields(); foreach ($sortFields as $ordKey => $ordVal) { if (!preg_match('/[\\w]+\\.[\\w]+/', $ordKey)) { $ordKey = $this->dbTable->table . '.' . $ordKey; } if ((int) $ordVal === SortNode::SORT_DESC) { $selectSQL->order($ordKey . ' ' . Select::ORDER_DESCENDING); } else { $selectSQL->order($ordKey . ' ' . Select::ORDER_ASCENDING); } } return $selectSQL; }
/** * @param Query $query top level query that needs visiting * * @return void */ public function visitQuery(Query $query) { if ($query->getSort()) { $this->visitSort($query->getSort()); } if ($query->getLimit()) { $this->visitLimit($query->getLimit()); } }
/** * @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()); } }