Example #1
0
 public function setUp()
 {
     $this->queryObject = new Query();
     $this->queryObject->setQuery(new AndNode([new AndNode([new EqNode('q', null), new NeNode('q', null), new LeNode('q', 'r'), new GeNode('q', 'u')]), new OrNode([new LtNode('q', 't'), new GtNode('q', 'y'), new InNode('q', ['a', 's', 'd', 'f', 'g'])])]));
     $this->queryObject->setSelect(new XSelectNode(['q', new AggregateFunctionNode('max', 'q'), new AggregateFunctionNode('min', 'q'), new AggregateFunctionNode('count', 'q')]));
     $this->queryObject->setSort(new SortNode(['q' => -1, 'w' => 1, 'e' => 1]));
     $this->queryObject->setLimit(new LimitNode(20, 30));
     $this->rqlString = "and(and(eq(q,null()),ne(q,null()),le(q,r),ge(q,u)),or(lt(q,t),gt(q,y),in(q,(a,s,d,f,g))))";
     $this->rqlString .= "&limit(20,30)";
     $this->rqlString .= "&sort(-q,+w,e)";
     $this->rqlString .= "&select(q,max(q),min(q),count(q))";
 }
 /**
  * Test RqlAllowedOperatorRequestListener::onKernelRequest() with non-matched route
  *
  * @return void
  */
 public function testOnKernelRequestWithNonMatchedRoute()
 {
     $query = new Query();
     $query->setLimit(new LimitNode(1, 1));
     $request = new Request();
     $request->attributes->set('rqlQuery', $query);
     $request->attributes->set('_route', 'model.all');
     $event = new RestEvent();
     $event->setRequest($request);
     $listener = new RqlAllowedOperatorRequestListener();
     $listener->onKernelRequest($event);
 }
Example #3
0
 public function getConfiguration()
 {
     if ($this->dataStore instanceof ConfigurableInterface) {
         return $this->dataStore->getConfiguration();
     }
     $query = new Query();
     $query->setLimit(new LimitNode(1));
     $data = $this->dataStore->query($query);
     $config = [];
     if (count($data) > 0 and isset($data[0])) {
         foreach ($data[0] as $key => $value) {
             $config[] = ['label' => $key, 'field' => $key];
         }
     }
     return $config;
 }
Example #4
0
 public function testSelectAggregateFunction_Combo_True()
 {
     $this->_initObject();
     $query = new Query();
     $aggregateCount = new AggregateFunctionNode('count', 'id');
     $aggregateMaxId = new AggregateFunctionNode('max', 'id');
     $aggregateMinId = new AggregateFunctionNode('min', 'id');
     $query->setLimit(new Node\LimitNode(2, 1));
     $query->setQuery(new ScalarOperator\EqNode('fString', 'val2'));
     $query->setSelect(new XSelectNode([$aggregateCount, $aggregateMaxId, $aggregateMinId, "anotherId"]));
     $resp = $this->object->query($query);
     $this->assertEquals(1, count($resp));
     $this->assertEquals(2, $resp[0]['id->count']);
     //$this->assertEquals(2, $resp[0]['count(id)']);
     $this->assertEquals(4, $resp[0]['id->max']);
     //$this->assertEquals(4, $resp[0]['max(id)']);
     $this->assertEquals(3, $resp[0]['id->min']);
     //$this->assertEquals(3, $resp[0]['min(id)']);
     $this->assertEquals(40, $resp[0]['anotherId']);
     //$this->assertEquals(40, $resp[0]['anotherId']);
 }
Example #5
0
 /**
  *
  * @see Iterator
  * @return array
  */
 public function next()
 {
     $identifier = $this->dataStore->getIdentifier();
     $query = new Query();
     $selectNode = new Node\SelectNode([$identifier]);
     $query->setSelect($selectNode);
     $sortNode = new Node\SortNode([$identifier => 1]);
     $query->setSort($sortNode);
     $limitNode = new Node\LimitNode(1, 0);
     $query->setLimit($limitNode);
     $gtNode = new ScalarOperator\GtNode($identifier, $this->index);
     $query->setQuery($gtNode);
     $queryArray = $this->dataStore->query($query);
     $this->index = $queryArray === [] ? null : $queryArray[0][$identifier];
 }
Example #6
0
 public function testQuery_limitOffsetCombo()
 {
     $this->_initObject();
     $query = new Query();
     $eqNode1 = new ScalarOperator\EqNode('fString', 'val2');
     $query->setQuery($eqNode1);
     $sortNode = new Node\SortNode(['id' => '1']);
     $query->setSort($sortNode);
     $selectNode = new Node\SelectNode(['fFloat']);
     $query->setSelect($selectNode);
     $limitNode = new Node\LimitNode(2, 1);
     $query->setLimit($limitNode);
     $queryArray = $this->object->query($query);
     $this->assertEquals(array('fFloat' => $this->_itemsArrayDelault[3 - 1]['fFloat']), $queryArray[1 - 1]);
     $this->assertEquals(array('fFloat' => $this->_itemsArrayDelault[4 - 1]['fFloat']), $queryArray[2 - 1]);
     $this->assertEquals(2, count($queryArray));
 }
Example #7
0
 /**
  * @param LimitNode $limit
  * @return $this
  */
 public function addLimit(LimitNode $limit)
 {
     $this->query->setLimit($limit);
     return $this;
 }
Example #8
0
 /**
  * @param ServerRequestInterface $request
  * @param ResponseInterface $response
  * @return ResponseInterface
  * @throws \zaboy\rest\RestException
  * @internal param callable|null $next
  */
 public function methodGetWithoutId(ServerRequestInterface $request, ResponseInterface $response)
 {
     /** @var Query $rqlQueryObject */
     $rqlQueryObject = $request->getAttribute('Rql-Query-Object');
     $rqlLimitNode = $rqlQueryObject->getLimit();
     $headerLimit = $request->getAttribute('Limit');
     if (!is_null($rqlLimitNode)) {
         if (isset($headerLimit)) {
             $limit = $rqlLimitNode->getLimit() > $headerLimit['limit'] ? $headerLimit['limit'] : $rqlLimitNode->getLimit();
             if (isset($headerLimit['offset'])) {
                 $offset = $headerLimit['offset'];
                 $rqlOffset = $rqlLimitNode->getOffset();
                 if (!is_null($rqlOffset)) {
                     $offset += $rqlOffset;
                 }
                 $newLimitNode = new LimitNode($limit, $offset);
             } else {
                 $newLimitNode = new LimitNode($limit);
             }
             $rqlQueryObject->setLimit($newLimitNode);
         }
     } else {
         if ($headerLimit) {
             $limit = (int) $headerLimit['limit'];
             if (isset($headerLimit['offset'])) {
                 $offset = (int) $headerLimit['offset'];
                 $newLimitNode = new LimitNode($limit, $offset);
             } else {
                 $newLimitNode = new LimitNode($limit);
             }
             $rqlQueryObject->setLimit($newLimitNode);
         }
     }
     $rowCountQuery = new Query();
     $aggregate = new AggregateFunctionNode('count', $this->dataStore->getIdentifier());
     $rowCountQuery->setSelect(new XSelectNode([$aggregate]));
     if ($rqlQueryObject->getQuery()) {
         $rowCountQuery->setQuery($rqlQueryObject->getQuery());
     }
     if ($rqlLimitNode) {
         $rowCountQuery->setLimit($rqlLimitNode);
     }
     //TODO: count aggregate fn can't work with limit and offset. Bug!!!
     $rowset = $this->dataStore->query($rqlQueryObject);
     $this->request = $request->withAttribute('Response-Body', $rowset);
     $rowCountQuery = new Query();
     $rowCountQuery->setSelect(new XSelectNode([new AggregateFunctionNode('count', $this->dataStore->getIdentifier())]));
     $rowCount = $this->dataStore->query($rowCountQuery);
     if (isset($rowCount[0][$this->dataStore->getIdentifier() . '->count'])) {
         //throw new RestException('Can not make Content-Range header in response');
         $limitObject = $rqlQueryObject->getLimit();
         $offset = !$limitObject ? 0 : $limitObject->getOffset();
         $contentRange = 'items ' . $offset . '-' . ($offset + count($rowset) - 1) . '/' . $rowCount[0][$this->dataStore->getIdentifier() . '->count'];
         $response = $response->withHeader('Content-Range', $contentRange);
     }
     $response = $response->withStatus(200);
     return $response;
 }