コード例 #1
0
 /**
  * @param \obo\Carriers\QueryCarrier $queryCarrier
  * @param boolean $asArray
  * @return string
  */
 public function constructQuery(\obo\Carriers\QueryCarrier $queryCarrier, $asArray = false)
 {
     if ($queryCarrier->getDefaultEntityClassName() === null) {
         throw new \obo\Exceptions\Exception("Default entity hasn't been set for QueryCarrier");
     }
     $query = "";
     $data = [];
     $queryCarrier = clone $queryCarrier;
     $joins = array();
     $needDistinct = false;
     $entityInformation = $queryCarrier->getDefaultEntityEntityInformation();
     $repositoryName = $entityInformation->repositoryName;
     $primaryPropertyColumn = $entityInformation->informationForPropertyWithName($entityInformation->primaryPropertyName)->columnName;
     $select = $queryCarrier->getSelect();
     $where = $queryCarrier->getWhere();
     $orderBy = $queryCarrier->getOrderBy();
     $join = $queryCarrier->getJoin();
     $needDistinct = $this->process($queryCarrier->getDefaultEntityClassName(), $select, $joins, true) || $needDistinct;
     $needDistinct = $this->process($queryCarrier->getDefaultEntityClassName(), $where, $joins) || $needDistinct;
     $needDistinct = $this->process($queryCarrier->getDefaultEntityClassName(), $orderBy, $joins) || $needDistinct;
     $needDistinct = $this->process($queryCarrier->getDefaultEntityClassName(), $join, $joins) || $needDistinct;
     if ("COUNT([{$repositoryName}].[{$primaryPropertyColumn}])" === $select["query"]) {
         $query .= "SELECT  COUNT(" . ($needDistinct ? "DISTINCT " : "") . "[{$repositoryName}].[{$primaryPropertyColumn}])";
     } else {
         $query .= "SELECT " . ($needDistinct ? "DISTINCT " : "") . rtrim($select["query"], ",");
     }
     $data = \array_merge($data, $select["data"]);
     if ($queryCarrier->getFrom()["query"] === "") {
         $defaultEntityClassName = $queryCarrier->getDefaultEntityClassName();
         $query .= " FROM [{$repositoryName}]";
     } else {
         $query .= " FROM " . rtrim($queryCarrier->getFrom()["query"], ",");
         $data = \array_merge($data, $queryCarrier->getFrom()["data"]);
     }
     $query .= implode($joins, " ");
     if ($where["query"] !== "") {
         $query .= " WHERE " . \preg_replace("#^ *(AND|OR) *#i", "", $where["query"]);
         $data = \array_merge($data, $where["data"]);
     }
     if ($orderBy["query"] !== "") {
         $query .= " ORDER BY " . rtrim($orderBy["query"], ",");
         $data = \array_merge($data, $orderBy["data"]);
     }
     if ($queryCarrier->getLimit()["query"] !== "") {
         $query .= " LIMIT " . $queryCarrier->getLimit()["query"];
         $data = \array_merge($data, $queryCarrier->getLimit()["data"]);
     }
     if ($queryCarrier->getOffset()["query"] !== "") {
         $query .= " OFFSET " . $queryCarrier->getOffset()["query"];
         $data = \array_merge($data, $queryCarrier->getOffset()["data"]);
     }
     if ($asArray) {
         return \array_merge([$query], $data);
     }
     return $this->dibiTranslator->translate(\array_merge([$query], $data));
 }