Пример #1
0
 public function testAssemble()
 {
     $predicate = new NotInPredicate();
     $predicate->setField('field');
     $this->assertEquals('field NOT IN NULL', QueryAssembler::stringify($predicate));
     $predicate->setExpression((new NumericExpression())->setValue(1));
     $this->assertEquals('field NOT IN 1', QueryAssembler::stringify($predicate));
     $predicate->setExpression(ArrayExpression::create(['1', 2, 3]));
     $this->assertEquals('field NOT IN ("1",2,3)', QueryAssembler::stringify($predicate));
     $predicate->setExpression(ValueExpression::create([4]));
     $this->assertEquals('field NOT IN (4)', QueryAssembler::stringify($predicate));
 }
Пример #2
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;
 }
Пример #3
0
 public function testAssemble()
 {
     $predicate = new InPredicate();
     $predicate->setField('field');
     $this->assertEquals('field IN NULL', QueryAssembler::stringify($predicate));
     $predicate->setExpression((new NumericExpression())->setValue(1));
     $this->assertEquals('field IN 1', QueryAssembler::stringify($predicate));
     $predicate->setExpression(ArrayExpression::create(['1', 'my "quoted" test', 3]));
     $this->assertEquals('field IN ("1","my \\"quoted\\" test",3)', QueryAssembler::stringify($predicate));
     $predicate->setExpression(ValueExpression::create([4]));
     $this->assertEquals('field IN (4)', QueryAssembler::stringify($predicate));
     $changeExpr = StringExpression::create('my "quoted" test');
     $predicate->setExpression(ArrayExpression::create(['1', $changeExpr, 3]));
     $stmt = QueryBuilder::select(AllSelectExpression::create());
     $stmt->where($predicate);
     $assembler = new QueryAssembler($stmt);
     $this->assertEquals('SELECT * WHERE field IN (?,?,?)', $assembler->getQuery());
     $this->assertEquals(['1', 'my "quoted" test', 3], $assembler->getParameters());
     $changeExpr->setValue('changed text');
     $this->assertEquals(['1', 'changed text', 3], $assembler->getParameters());
 }
Пример #4
0
 public function assembleValueExpression(ValueExpression $expression)
 {
     $value = $expression->getValue();
     if ($value === null) {
         return $this->_assemblePrepared() ?: 'NULL';
     } else {
         if (is_scalar($value)) {
             if (!is_string($value) && is_numeric($value)) {
                 return $this->assembleNumericExpression(NumericExpression::create($value));
             } else {
                 if (is_bool($value)) {
                     return $this->assembleBooleanExpression(BooleanExpression::create($value));
                 }
             }
         } else {
             if (is_array($value)) {
                 return $this->assembleArrayExpression(ArrayExpression::create($value));
             }
         }
     }
     return $this->assembleStringExpression(StringExpression::create($value));
 }