/**
* @return Fluent
* @throws InvalidStateException
*/
public function createFluent()
{
if ($this->clauses->from === null or empty($this->clauses->select)) {
throw new InvalidStateException();
}
$statement = $this->connection->command();
foreach (array_keys($this->clauses->select) as $alias) {
// SELECT
$statement->select($this->queryHelper->formatSelect($this->domainQueryHelper->getReflection($this->aliases->getEntityClass($alias)), $alias));
if (array_key_exists($alias, $this->relationshipTables)) {
call_user_func_array(array($statement, 'select'), array_merge(array('%n.%n AS %n, %n.%n AS %n, %n.%n AS %n'), $this->relationshipTables[$alias]));
}
}
$statement->from(array($this->clauses->from['table'] => $this->clauses->from['alias']));
// FROM
foreach ($this->clauses->join as $join) {
// JOIN
call_user_func_array(array($statement, $join['type']), array_merge(array('%n AS %n'), $join['joinParameters']));
call_user_func_array(array($statement, 'on'), array_merge(array('%n.%n = %n.%n'), $join['onParameters']));
}
if (!empty($this->clauses->where)) {
// WHERE
call_user_func_array(array($statement, 'where'), $this->clauses->where);
}
foreach ($this->clauses->orderBy as $orderBy) {
// ORDER BY
$statement->orderBy('%n.%n', $orderBy[0], $orderBy[1]);
if ($orderBy[2] === self::ORDER_DESC) {
$statement->desc();
}
}
return $statement;
}