예제 #1
0
 public function assemblePredicateSet(PredicateSet $predicate)
 {
     if (!$predicate->hasPredicates()) {
         return '';
     }
     return '(' . implode($predicate->getGlue(), $this->assembleSegments($predicate->getPredicates())) . ')';
 }
예제 #2
0
 public function predicateData()
 {
     $nameEq = (new EqualPredicate())->setField('name')->setExpression(ValueExpression::create('test'));
     $set = new PredicateSet();
     $set->addPredicate($nameEq);
     return [[['name' => 'test'], [$nameEq]], [[$nameEq], [$nameEq]], [['AND' => ['name' => 'test']], [$set]]];
 }
예제 #3
0
 /**
  * @expectedException \Exception
  * @expectedExceptionMessage Cannot have multiple predicate sets in CQL
  */
 public function testMultiplePredicatesFail()
 {
     $where = WhereClause::create();
     $set = new PredicateSet();
     $set->addPredicate(new PredicateSet());
     $where->addPredicate($set);
     CqlAssembler::stringify($where);
 }
예제 #4
0
 private function _getNewSet(...$expressions)
 {
     $newPredicates = WhereClause::buildPredicates($expressions);
     if (count($newPredicates) === 1) {
         $newSet = Arrays::first($newPredicates);
     } else {
         $newSet = new PredicateSet();
         $newSet->setPredicates($newPredicates);
     }
     return $newSet;
 }
예제 #5
0
 public static function buildPredicates(array $input, $table = null, $inverse = false)
 {
     $predicates = [];
     foreach ($input as $key => $value) {
         if ($value === null || is_scalar($value) || $value instanceof ValueExpression) {
             $pred = $inverse ? new NotEqualPredicate() : new EqualPredicate();
             $pred->setField(FieldExpression::createWithTable($key, $table));
             if (!$value instanceof ValueExpression) {
                 $value = ValueExpression::create($value);
             }
             $pred->setExpression($value);
             $predicates[] = $pred;
         } else {
             if ($value instanceof IPredicate) {
                 $predicates[] = $value;
             } else {
                 if (is_array($value)) {
                     if (is_int($key)) {
                         $predicates = array_merge($predicates, static::buildPredicates($value, $table, $inverse));
                     } else {
                         if (static::_isControlKeyword($key)) {
                             switch ($key) {
                                 case 'NOT':
                                     $predicates = array_merge($predicates, static::buildPredicates($value, $table, true));
                                     break;
                                 case 'OR':
                                     $pred = new OrPredicateSet();
                                     $pred->setPredicates(static::buildPredicates($value, $table, $inverse));
                                     $predicates[] = $pred;
                                     break;
                                 case 'AND':
                                     $pred = new PredicateSet();
                                     $pred->setPredicates(static::buildPredicates($value, $table, $inverse));
                                     $predicates[] = $pred;
                                     break;
                             }
                         } else {
                             $pred = $inverse ? new NotInPredicate() : new InPredicate();
                             $pred->setField(FieldExpression::createWithTable($key, $table));
                             $pred->setExpression(ArrayExpression::create($value));
                             $predicates[] = $pred;
                         }
                     }
                 }
             }
         }
     }
     return $predicates;
 }
예제 #6
0
 public function testAssemble()
 {
     $this->assertEquals('', QueryAssembler::stringify(PredicateSet::create()));
     $eq = new EqualPredicate();
     $eq->setField("first")->setExpression(ValueExpression::create('val1'));
     $neq = new NotEqualPredicate();
     $neq->setField("second")->setExpression(ValueExpression::create('val1'));
     $set = PredicateSet::create($eq, $neq);
     $this->assertEquals('(first = "val1" AND second <> "val1")', QueryAssembler::stringify($set));
 }
예제 #7
0
 public function assembleBetween(BetweenPredicate $betweenPredicate)
 {
     $gte = new GreaterThanOrEqualPredicate();
     $gte->setField($betweenPredicate->getField());
     $lte = new LessThanOrEqualPredicate();
     $lte->setField($betweenPredicate->getField());
     $set = new PredicateSet();
     if ($betweenPredicate instanceof NotBetweenPredicate) {
         $gte->setExpression($betweenPredicate->getRangeEnd());
         $lte->setExpression($betweenPredicate->getRangeStart());
         $set->addPredicate($lte);
         $set->addPredicate($gte);
     } else {
         $gte->setExpression($betweenPredicate->getRangeStart());
         $lte->setExpression($betweenPredicate->getRangeEnd());
         $set->addPredicate($gte);
         $set->addPredicate($lte);
     }
     return $this->assembleSegment($set);
 }