Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 final class OqlSelectQuery extends OqlQuery
00016 {
00017 private $distinct = false;
00018 private $properties = array();
00019 private $where = array();
00020 private $whereLogic = array();
00021 private $groupChain = array();
00022 private $orderChain = array();
00023 private $havingChain = array();
00024 private $limit = null;
00025 private $offset = null;
00026
00030 public static function create()
00031 {
00032 return new self;
00033 }
00034
00035 public function isDistinct()
00036 {
00037 return $this->distinct;
00038 }
00039
00043 public function setDistinct($orly = true)
00044 {
00045 $this->distinct = ($orly === true);
00046
00047 return $this;
00048 }
00049
00050 public function getProperties()
00051 {
00052 return $this->properties;
00053 }
00054
00058 public function addProperties(OqlSelectPropertiesClause $clause)
00059 {
00060 $this->properties[] = $clause;
00061
00062 return $this;
00063 }
00064
00068 public function setProperties(OqlSelectPropertiesClause $clause)
00069 {
00070 $this->properties = array();
00071 $this->properties[] = $clause;
00072
00073 return $this;
00074 }
00075
00079 public function dropProperties()
00080 {
00081 $this->properties = array();
00082
00083 return $this;
00084 }
00085
00086 public function getWhere()
00087 {
00088 return $this->where;
00089 }
00090
00091 public function getWhereLogic()
00092 {
00093 return $this->whereLogic;
00094 }
00095
00099 public function where(OqlWhereClause $clause, $logic = null)
00100 {
00101 if ($this->where && !$logic) {
00102 throw new WrongArgumentException(
00103 'you have to specify expression logic'
00104 );
00105
00106 } else {
00107 if (!$this->where && $logic)
00108 $logic = null;
00109
00110 $this->where[] = $clause;
00111 $this->whereLogic[] = $logic;
00112 }
00113
00114 return $this;
00115 }
00116
00120 public function andWhere(OqlWhereClause $clause)
00121 {
00122 $this->where($clause, BinaryExpression::EXPRESSION_AND);
00123
00124 return $this;
00125 }
00126
00130 public function orWhere(OqlWhereClause $clause)
00131 {
00132 $this->where($clause, BinaryExpression::EXPRESSION_OR);
00133
00134 return $this;
00135 }
00136
00140 public function setWhere(OqlWhereClause $clause)
00141 {
00142 $this->where = array();
00143 $this->whereLogic = array();
00144 $this->where($clause);
00145
00146 return $this;
00147 }
00148
00152 public function dropWhere()
00153 {
00154 $this->where = array();
00155 $this->whereLogic = array();
00156
00157 return $this;
00158 }
00159
00160 public function getGroupBy()
00161 {
00162 return $this->groupChain;
00163 }
00164
00168 public function addGroupBy(OqlProjectionClause $clause)
00169 {
00170 $this->groupChain[] = $clause;
00171
00172 return $this;
00173 }
00174
00178 public function setGroupBy(OqlProjectionClause $clause)
00179 {
00180 $this->groupChain = array();
00181 $this->groupChain[] = $clause;
00182
00183 return $this;
00184 }
00185
00189 public function dropGroupBy()
00190 {
00191 $this->groupChain = array();
00192
00193 return $this;
00194 }
00195
00196 public function getOrderBy()
00197 {
00198 return $this->orderChain;
00199 }
00200
00204 public function addOrderBy(OqlOrderByClause $clause)
00205 {
00206 $this->orderChain[] = $clause;
00207
00208 return $this;
00209 }
00210
00214 public function setOrderBy(OqlOrderByClause $clause)
00215 {
00216 $this->orderChain = array();
00217 $this->orderChain[] = $clause;
00218
00219 return $this;
00220 }
00221
00225 public function dropOrderBy()
00226 {
00227 $this->orderChain = array();
00228
00229 return $this;
00230 }
00231
00232 public function getHaving()
00233 {
00234 return $this->havingChain;
00235 }
00236
00240 public function addHaving(OqlHavingClause $clause)
00241 {
00242 $this->havingChain[] = $clause;
00243
00244 return $this;
00245 }
00246
00250 public function setHaving(OqlHavingClause $clause)
00251 {
00252 $this->havingChain = array();
00253 $this->havingChain[] = $clause;
00254
00255 return $this;
00256 }
00257
00261 public function dropHaving()
00262 {
00263 $this->havingChain = array();
00264
00265 return $this;
00266 }
00270 public function getLimit()
00271 {
00272 return $this->limit;
00273 }
00274
00278 public function setLimit(OqlQueryParameter $limit)
00279 {
00280 $this->limit = $limit;
00281
00282 return $this;
00283 }
00284
00288 public function getOffset()
00289 {
00290 return $this->offset;
00291 }
00292
00296 public function setOffset(OqlQueryParameter $offset)
00297 {
00298 $this->offset = $offset;
00299
00300 return $this;
00301 }
00302
00306 public function toCriteria()
00307 {
00308 $criteria = Criteria::create($this->dao)->
00309 setDistinct($this->distinct);
00310
00311 $projections = array_merge(
00312 $this->properties,
00313 $this->groupChain,
00314 $this->havingChain
00315 );
00316 foreach ($projections as $clause) {
00317 $criteria->addProjection(
00318 $clause->
00319 bindAll($this->parameters)->
00320 toProjection()
00321 );
00322 }
00323
00324 if ($this->where) {
00325 if (count($this->where) == 1) {
00326 $clause = reset($this->where);
00327
00328 $criteria->add(
00329 $clause->
00330 bindAll($this->parameters)->
00331 toLogic()
00332 );
00333
00334 } else {
00335 $logic = Expression::chain();
00336 foreach ($this->where as $key => $clause) {
00337 $expression = $clause->
00338 bindAll($this->parameters)->
00339 toLogic();
00340
00341 if (
00342 $this->whereLogic[$key]
00343 == BinaryExpression::EXPRESSION_AND
00344 ) {
00345 $logic->expAnd($expression);
00346 } else {
00347 $logic->expOr($expression);
00348 }
00349 }
00350
00351 $criteria->add($logic);
00352 }
00353 }
00354
00355 foreach ($this->orderChain as $clause) {
00356 $criteria->addOrder(
00357 $clause->
00358 bindAll($this->parameters)->
00359 toOrder()
00360 );
00361 }
00362
00363 if ($this->limit)
00364 $criteria->setLimit(
00365 $this->limit->evaluate($this->parameters)
00366 );
00367
00368 if ($this->offset)
00369 $criteria->setOffset(
00370 $this->offset->evaluate($this->parameters)
00371 );
00372
00373 return $criteria;
00374 }
00375 }
00376 ?>