示例#1
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();
 }
示例#2
0
 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;
 }
示例#3
0
 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;
 }
示例#4
0
 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);
     }
 }
示例#6
0
 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());
     }
 }