/**
  * @test
  */
 public function testLaravelTransformer()
 {
     $selectQuery = new SelectQueryParameters();
     $selectQuery->where((new WhereParameter('foo', Operator::EQ, 'bar'))->or((new WhereParameter('bar', Operator::LT, 15))->and(new WhereParameter('cat', Operator::NEQ, 'catlab'))));
     $builder = $this->getQueryBuilder();
     SelectQueryTransformer::toLaravel($builder, $selectQuery);
     $this->assertEquals('select * from "table" where "foo" = ? or ("bar" < ? and ("cat" != ?))', $builder->toSql());
 }
 /**
  * @param $request
  * @param $resourceDefinition
  * @param ContextContract $context
  * @param int $records
  * @return SelectQueryParameters
  */
 public function getFilters($request, $resourceDefinition, Context $context, int $records = 10)
 {
     $definition = ResourceDefinitionLibrary::make($resourceDefinition);
     $queryBuilder = new SelectQueryParameters();
     // Now check for query parameters
     foreach ($definition->getFields() as $field) {
         if ($field instanceof ResourceField && $field->isFilterable()) {
             $parameter = $this->propertyResolver->getParameterFromRequest($request, $field->getDisplayName());
             if ($parameter) {
                 $queryBuilder->where(new WhereParameter($field->getName(), Operator::EQ, $parameter));
             }
         }
     }
     // Processors
     $context->getProcessors()->processFilters($this, $queryBuilder, $request, $definition, $context, $records);
     return $queryBuilder;
 }
 /**
  * @param SelectQueryParameters $queryBuilder
  * @return SelectQueryParameters
  */
 public function build(SelectQueryParameters $queryBuilder = null)
 {
     if (!isset($queryBuilder)) {
         $queryBuilder = new SelectQueryParameters();
     }
     if ($this->records) {
         $queryBuilder->limit(new LimitParameter($this->records));
     }
     if (isset($this->after)) {
         $where = $this->processCursor($this->after, self::REQUEST_PARAM_AFTER);
         $queryBuilder->where($where);
     }
     if (isset($this->before)) {
         $this->invertOrder = true;
         $where = $this->processCursor($this->before, self::REQUEST_PARAM_BEFORE);
         $queryBuilder->where($where);
     }
     foreach ($this->sort as $sort) {
         $dir = $sort->getDirection();
         if ($this->invertOrder) {
             $dir = OrderParameter::invertDirection($dir);
         }
         $queryBuilder->orderBy(new OrderParameter($sort->getColumn(), $dir));
     }
     $queryBuilder->reverse($this->invertOrder);
     return $queryBuilder;
 }