/**
  * Appends the list of expressions that will be used when sorting the resulting rows.
  *
  * Multiple arguments implementing OrderBy are accepted.
  *
  * We don't know why OrderBY is not a part of a separate projection, so we follow
  * the default behaviour of nhibernate
  *
  * @param OrderBy ...
  * @return EntityQuery itself
  */
 function orderBy()
 {
     $expressions = func_get_args();
     foreach ($expressions as $expression) {
         $this->order->append($expression);
     }
     return $this;
 }
 /**
  * @return OrderChain
  **/
 public function toOrder()
 {
     $order = OrderChain::create();
     foreach ($this->list as $property) {
         $order->add($property->evaluate($this->parameters));
     }
     return $order;
 }
 public function testOrderBy()
 {
     $query = OQL::select('from TestUser');
     $criteria = Criteria::create(TestUser::dao());
     $this->assertCriteria($query->addOrderBy(OQL::orderBy('id')), $criteria->addOrder(OrderBy::create('id')));
     $this->assertCriteria($query->addOrderBy(OQL::orderBy('name asc, city.id desc')), $criteria->addOrder(OrderBy::create('name')->asc())->addOrder(OrderBy::create('city.id')->desc()));
     $this->assertEquals(OQL::orderBy('id + city.id desc, name')->toOrder(), OrderChain::create()->add(OrderBy::create(Expression::add('id', 'city.id'))->desc())->add(OrderBy::create('name')));
     $order = OQL::orderBy('name ilike $1')->bindNext('%ЙЦуК');
     $this->assertEquals($order->toOrder(), OrderChain::create()->add(OrderBy::create(Expression::ilike('name', '%ЙЦуК'))));
     $this->assertCriteria(OQL::select('from TestUser')->addOrderBy($order)->bindNext('test'), Criteria::create(TestUser::dao())->addOrder(OrderBy::create(Expression::ilike('name', 'test'))));
 }
 function toDialectString(IDialect $dialect)
 {
     $querySlices = array();
     $querySlices[] = 'SELECT';
     if ($this->distinct) {
         $querySlices[] = 'DISTINCT';
     }
     $querySlices[] = $this->get->toDialectString($dialect);
     if (!$this->sources->isEmpty()) {
         $querySlices[] = 'FROM';
         $querySlices[] = $this->sources->toDialectString($dialect);
     }
     // WHERE
     if ($this->condition) {
         $querySlices[] = 'WHERE';
         $querySlices[] = $this->condition->toDialectString($dialect);
     }
     // GROUP BY
     if (!$this->groups->isEmpty()) {
         $querySlices[] = 'GROUP BY';
         $querySlices[] = $this->groups->toDialectString($dialect);
     }
     // HAVING
     if ($this->having) {
         $querySlices[] = 'HAVING';
         $querySlices[] = $this->having->toDialectString($dialect);
     }
     if (!$this->order->isEmpty()) {
         $querySlices[] = $this->order->toDialectString($dialect);
     }
     if ($this->limit) {
         $querySlices[] = 'LIMIT';
         $querySlices[] = $this->limit;
     }
     if ($this->offset) {
         $querySlices[] = 'OFFSET';
         $querySlices[] = $this->offset;
     }
     $queryString = join(' ', $querySlices);
     return $queryString;
 }
 public static function orderDataProvider()
 {
     return array(array(OrderBy::create('id'), 'test_user.id'), array(OrderChain::create()->add(OrderBy::create('id')->asc())->add(OrderBy::create('id')), 'test_user.id ASC, test_user.id'), array(OrderBy::create('id')->asc(), 'test_user.id ASC'), array(OrderBy::create('id')->desc(), 'test_user.id DESC'), array(OrderBy::create('id')->nullsFirst(), 'test_user.id NULLS FIRST'), array(OrderBy::create('id')->nullsLast(), 'test_user.id NULLS LAST'), array(OrderBy::create('id')->asc()->nullsLast(), 'test_user.id ASC NULLS LAST'), array(OrderBy::create('id')->desc()->nullsFirst(), 'test_user.id DESC NULLS FIRST'), array(OrderBy::create(Expression::isNull('id'))->asc()->nullsFirst(), '((test_user.id IS NULL)) ASC NULLS FIRST'));
 }
 /**
  * Appends the expression that will be used when sorting the resulting rows.
  *
  * We don't know why OrderBY is not a part of a separate projection, so we follow
  * the default behaviour of nhibernate
  *
  * @param OrderBy ...
  * @return EntityQuery itself
  */
 function addOrderBy(OrderBy $expression)
 {
     $this->order->append($expression);
     return $this;
 }
 public function testOrderBy()
 {
     $this->assertCriteria('from TestUser order by id', Criteria::create(TestUser::dao())->addOrder(OrderBy::create('id')))->assertCriteria('from TestUser order by id asc, nickname desc', Criteria::create(TestUser::dao())->addOrder(OrderChain::create()->add(OrderBy::create('id')->asc())->add(OrderBy::create('nickname')->desc())))->assertCriteria('from TestUser order by $1, nickname is null, -id/2 + 1 asc ', Criteria::create(TestUser::dao())->addOrder(OrderChain::create()->add(OrderBy::create(SQLFunction::create('rand')))->add(OrderBy::create(Expression::isNull('nickname')))->add(OrderBy::create(Expression::add(Expression::div(Expression::minus('id'), 2), 1))->asc())), array(1 => SQLFunction::create('rand')));
 }