/** * @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)); }