|
|
@@ -129,12 +129,12 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param string $sql initial sql string to append to
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator The placeholder and value binder object
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return \Closure
|
|
|
*/
|
|
|
- protected function _sqlCompiler(string &$sql, Query $query, ValueBinder $generator): Closure
|
|
|
+ protected function _sqlCompiler(string &$sql, Query $query, ValueBinder $binder): Closure
|
|
|
{
|
|
|
- return function ($part, $partName) use (&$sql, $query, $generator) {
|
|
|
+ return function ($part, $partName) use (&$sql, $query, $binder) {
|
|
|
if (
|
|
|
$part === null ||
|
|
|
(is_array($part) && empty($part)) ||
|
|
|
@@ -144,16 +144,16 @@ class QueryCompiler
|
|
|
}
|
|
|
|
|
|
if ($part instanceof ExpressionInterface) {
|
|
|
- $part = [$part->sql($generator)];
|
|
|
+ $part = [$part->sql($binder)];
|
|
|
}
|
|
|
if (isset($this->_templates[$partName])) {
|
|
|
- $part = $this->_stringifyExpressions((array)$part, $generator);
|
|
|
+ $part = $this->_stringifyExpressions((array)$part, $binder);
|
|
|
$sql .= sprintf($this->_templates[$partName], implode(', ', $part));
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- $sql .= $this->{'_build' . $partName . 'Part'}($part, $query, $generator);
|
|
|
+ $sql .= $this->{'_build' . $partName . 'Part'}($part, $query, $binder);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
@@ -164,16 +164,16 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts List of CTEs to be transformed to string
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator The placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildWithPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildWithPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$recursive = false;
|
|
|
$expressions = [];
|
|
|
foreach ($parts as $cte) {
|
|
|
$recursive = $recursive || $cte->isRecursive();
|
|
|
- $expressions[] = $cte->sql($generator);
|
|
|
+ $expressions[] = $cte->sql($binder);
|
|
|
}
|
|
|
|
|
|
$recursive = $recursive ? 'RECURSIVE ' : '';
|
|
|
@@ -189,22 +189,22 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts list of fields to be transformed to string
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildSelectPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildSelectPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$select = 'SELECT%s %s%s';
|
|
|
if ($this->_orderedUnion && $query->clause('union')) {
|
|
|
$select = '(SELECT%s %s%s';
|
|
|
}
|
|
|
$distinct = $query->clause('distinct');
|
|
|
- $modifiers = $this->_buildModifierPart($query->clause('modifier'), $query, $generator);
|
|
|
+ $modifiers = $this->_buildModifierPart($query->clause('modifier'), $query, $binder);
|
|
|
|
|
|
$driver = $query->getConnection()->getDriver();
|
|
|
$quoteIdentifiers = $driver->isAutoQuotingEnabled() || $this->_quotedSelectAliases;
|
|
|
$normalized = [];
|
|
|
- $parts = $this->_stringifyExpressions($parts, $generator);
|
|
|
+ $parts = $this->_stringifyExpressions($parts, $binder);
|
|
|
foreach ($parts as $k => $p) {
|
|
|
if (!is_numeric($k)) {
|
|
|
$p = $p . ' AS ';
|
|
|
@@ -222,7 +222,7 @@ class QueryCompiler
|
|
|
}
|
|
|
|
|
|
if (is_array($distinct)) {
|
|
|
- $distinct = $this->_stringifyExpressions($distinct, $generator);
|
|
|
+ $distinct = $this->_stringifyExpressions($distinct, $binder);
|
|
|
$distinct = sprintf('DISTINCT ON (%s) ', implode(', ', $distinct));
|
|
|
}
|
|
|
|
|
|
@@ -236,14 +236,14 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts list of tables to be transformed to string
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildFromPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildFromPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$select = ' FROM %s';
|
|
|
$normalized = [];
|
|
|
- $parts = $this->_stringifyExpressions($parts, $generator);
|
|
|
+ $parts = $this->_stringifyExpressions($parts, $binder);
|
|
|
foreach ($parts as $k => $p) {
|
|
|
if (!is_numeric($k)) {
|
|
|
$p = $p . ' ' . $k;
|
|
|
@@ -262,16 +262,16 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts list of joins to be transformed to string
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildJoinPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildJoinPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$joins = '';
|
|
|
foreach ($parts as $join) {
|
|
|
$subquery = $join['table'] instanceof Query || $join['table'] instanceof QueryExpression;
|
|
|
if ($join['table'] instanceof ExpressionInterface) {
|
|
|
- $join['table'] = $join['table']->sql($generator);
|
|
|
+ $join['table'] = $join['table']->sql($binder);
|
|
|
}
|
|
|
|
|
|
if ($subquery) {
|
|
|
@@ -282,7 +282,7 @@ class QueryCompiler
|
|
|
|
|
|
$condition = '';
|
|
|
if (isset($join['conditions']) && $join['conditions'] instanceof ExpressionInterface) {
|
|
|
- $condition = $join['conditions']->sql($generator);
|
|
|
+ $condition = $join['conditions']->sql($binder);
|
|
|
}
|
|
|
if (strlen($condition)) {
|
|
|
$joins .= " ON {$condition}";
|
|
|
@@ -299,14 +299,14 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts List of windows to be transformed to string
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildWindowPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildWindowPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$windows = [];
|
|
|
foreach ($parts as $window) {
|
|
|
- $windows[] = $window['name']->sql($generator) . ' AS (' . $window['window']->sql($generator) . ')';
|
|
|
+ $windows[] = $window['name']->sql($binder) . ' AS (' . $window['window']->sql($binder) . ')';
|
|
|
}
|
|
|
|
|
|
return ' WINDOW ' . implode(', ', $windows);
|
|
|
@@ -317,15 +317,15 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts List of keys & values to set.
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildSetPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildSetPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$set = [];
|
|
|
foreach ($parts as $part) {
|
|
|
if ($part instanceof ExpressionInterface) {
|
|
|
- $part = $part->sql($generator);
|
|
|
+ $part = $part->sql($binder);
|
|
|
}
|
|
|
if ($part[0] === '(') {
|
|
|
$part = substr($part, 1, -1);
|
|
|
@@ -343,13 +343,13 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts list of queries to be operated with UNION
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string
|
|
|
*/
|
|
|
- protected function _buildUnionPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildUnionPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
- $parts = array_map(function ($p) use ($generator) {
|
|
|
- $p['query'] = $p['query']->sql($generator);
|
|
|
+ $parts = array_map(function ($p) use ($binder) {
|
|
|
+ $p['query'] = $p['query']->sql($binder);
|
|
|
$p['query'] = $p['query'][0] === '(' ? trim($p['query'], '()') : $p['query'];
|
|
|
$prefix = $p['all'] ? 'ALL ' : '';
|
|
|
if ($this->_orderedUnion) {
|
|
|
@@ -371,14 +371,14 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts The insert parts.
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string SQL fragment.
|
|
|
*/
|
|
|
- protected function _buildInsertPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildInsertPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
$table = $parts[0];
|
|
|
- $columns = $this->_stringifyExpressions($parts[1], $generator);
|
|
|
- $modifiers = $this->_buildModifierPart($query->clause('modifier'), $query, $generator);
|
|
|
+ $columns = $this->_stringifyExpressions($parts[1], $binder);
|
|
|
+ $modifiers = $this->_buildModifierPart($query->clause('modifier'), $query, $binder);
|
|
|
|
|
|
return sprintf('INSERT%s INTO %s (%s)', $modifiers, $table, implode(', ', $columns));
|
|
|
}
|
|
|
@@ -388,12 +388,12 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts The values parts.
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string SQL fragment.
|
|
|
*/
|
|
|
- protected function _buildValuesPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildValuesPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
- return implode('', $this->_stringifyExpressions($parts, $generator));
|
|
|
+ return implode('', $this->_stringifyExpressions($parts, $binder));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -401,13 +401,13 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts The update parts.
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string SQL fragment.
|
|
|
*/
|
|
|
- protected function _buildUpdatePart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildUpdatePart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
- $table = $this->_stringifyExpressions($parts, $generator);
|
|
|
- $modifiers = $this->_buildModifierPart($query->clause('modifier'), $query, $generator);
|
|
|
+ $table = $this->_stringifyExpressions($parts, $binder);
|
|
|
+ $modifiers = $this->_buildModifierPart($query->clause('modifier'), $query, $binder);
|
|
|
|
|
|
return sprintf('UPDATE%s %s', $modifiers, implode(',', $table));
|
|
|
}
|
|
|
@@ -417,16 +417,16 @@ class QueryCompiler
|
|
|
*
|
|
|
* @param array $parts The query modifier parts
|
|
|
* @param \Cake\Database\Query $query The query that is being compiled
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @return string SQL fragment.
|
|
|
*/
|
|
|
- protected function _buildModifierPart(array $parts, Query $query, ValueBinder $generator): string
|
|
|
+ protected function _buildModifierPart(array $parts, Query $query, ValueBinder $binder): string
|
|
|
{
|
|
|
if ($parts === []) {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
- return ' ' . implode(' ', $this->_stringifyExpressions($parts, $generator, false));
|
|
|
+ return ' ' . implode(' ', $this->_stringifyExpressions($parts, $binder, false));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -434,16 +434,16 @@ class QueryCompiler
|
|
|
* into their string representation.
|
|
|
*
|
|
|
* @param array $expressions list of strings and ExpressionInterface objects
|
|
|
- * @param \Cake\Database\ValueBinder $generator the placeholder generator to be used in expressions
|
|
|
+ * @param \Cake\Database\ValueBinder $binder Value binder used to generate parameter placeholder
|
|
|
* @param bool $wrap Whether to wrap each expression object with parenthesis
|
|
|
* @return array
|
|
|
*/
|
|
|
- protected function _stringifyExpressions(array $expressions, ValueBinder $generator, bool $wrap = true): array
|
|
|
+ protected function _stringifyExpressions(array $expressions, ValueBinder $binder, bool $wrap = true): array
|
|
|
{
|
|
|
$result = [];
|
|
|
foreach ($expressions as $k => $expression) {
|
|
|
if ($expression instanceof ExpressionInterface) {
|
|
|
- $value = $expression->sql($generator);
|
|
|
+ $value = $expression->sql($binder);
|
|
|
$expression = $wrap ? '(' . $value . ')' : $value;
|
|
|
}
|
|
|
$result[$k] = $expression;
|