/** * @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)); }
/** * Generates (translates) and returns SQL query as DibiDataSource. * @param array|mixed one or more arguments * @return DibiDataSource * @throws DibiException */ public final function dataSource($args) { $args = func_get_args(); $this->connect(); $translator = new DibiTranslator($this->driver); return new DibiDataSource($translator->translate($args), $this); }
/** * Generates SQL query. * @param array * @return string */ private function translateArgs($args) { $this->connected || $this->connect(); return $this->translator->translate($args); }
/** * Generates (translates) and returns SQL query as DibiDataSource. * @param array|mixed one or more arguments * @return DibiDataSource * @throws DibiException */ public final function dataSource($args) { $this->connected || $this->connect(); $args = func_get_args(); return new DibiDataSource($this->translator->translate($args), $this); }
/** * Generates and prints SQL query. * * @param array|mixed one or more arguments * @return bool */ public final function test($args) { $args = func_get_args(); $this->connect(); $trans = new DibiTranslator($this->driver); $ok = $trans->translate($args); dibi::dump($trans->sql); return $ok; }
/** * Sets SQL * @param string $sql */ public function setSql($sql) { $this->sql = self::$translator->translate((array) $sql); $this->result = $this->count = $this->totalCount = NULL; }