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); }
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; }
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']); }
/** * * @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]; }
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)); }
/** * @param LimitNode $limit * @return $this */ public function addLimit(LimitNode $limit) { $this->query->setLimit($limit); return $this; }
/** * @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; }