This commit is contained in:
Yuri Kuznetsov
2023-05-10 11:50:37 +03:00
parent 324ded28de
commit ed12c6f6bd
3 changed files with 142 additions and 152 deletions
@@ -48,6 +48,8 @@ use PDO;
use RuntimeException;
use LogicException;
use const STR_PAD_LEFT;
/**
* Composes SQL queries.
*
@@ -339,7 +341,7 @@ abstract class BaseQueryComposer implements QueryComposer
$aliasPart = $this->sanitize($alias);
}
$sql = $this->composeDeleteQuery(
return $this->composeDeleteQuery(
$this->toDb($entityType),
$aliasPart,
$wherePart,
@@ -347,8 +349,6 @@ abstract class BaseQueryComposer implements QueryComposer
$orderPart,
$params['limit']
);
return $sql;
}
/**
@@ -370,7 +370,7 @@ abstract class BaseQueryComposer implements QueryComposer
$setPart = $this->getSetPart($entity, $values, $params);
$sql = $this->composeUpdateQuery(
return $this->composeUpdateQuery(
$this->toDb($entityType),
$setPart,
$wherePart,
@@ -378,8 +378,6 @@ abstract class BaseQueryComposer implements QueryComposer
$orderPart,
$params['limit']
);
return $sql;
}
/**
@@ -595,13 +593,13 @@ abstract class BaseQueryComposer implements QueryComposer
if ($method !== self::SELECT_METHOD) {
if (isset($params['offset'])) {
throw new RuntimeException("ORM Query: Param 'offset' is not allowed for '{$method}'.");
throw new RuntimeException("ORM Query: Param 'offset' is not allowed for '$method'.");
}
}
if ($method !== self::UPDATE_METHOD) {
if (isset($params['set'])) {
throw new RuntimeException("ORM Query: Param 'set' is not allowed for '{$method}'.");
throw new RuntimeException("ORM Query: Param 'set' is not allowed for '$method'.");
}
}
@@ -884,7 +882,7 @@ abstract class BaseQueryComposer implements QueryComposer
!$this->functionConverterFactory->isCreatable($function)
)
) {
throw new RuntimeException("ORM Query: Not allowed function '{$function}'.");
throw new RuntimeException("ORM Query: Not allowed function '$function'.");
}
if (in_array($function, ['MATCH_BOOLEAN', 'MATCH_NATURAL_LANGUAGE'])) {
@@ -897,7 +895,7 @@ abstract class BaseQueryComposer implements QueryComposer
$modePart = $function === 'MATCH_BOOLEAN' ?
'IN BOOLEAN MODE' : 'IN NATURAL LANGUAGE MODE';
return "MATCH ({$columnsPart}) AGAINST ({$queryPart} {$modePart})";
return "MATCH ($columnsPart) AGAINST ($queryPart $modePart)";
}
if (str_starts_with($function, 'YEAR_') && $function !== 'YEAR_NUMBER') {
@@ -908,9 +906,9 @@ abstract class BaseQueryComposer implements QueryComposer
$fiscalFirstMonth = $fiscalShift + 1;
return
"CASE WHEN MONTH({$part}) >= {$fiscalFirstMonth} THEN ".
"YEAR({$part}) ".
"ELSE YEAR({$part}) - 1 END";
"CASE WHEN MONTH($part) >= $fiscalFirstMonth THEN ".
"YEAR($part) ".
"ELSE YEAR($part) - 1 END";
}
}
@@ -925,9 +923,9 @@ abstract class BaseQueryComposer implements QueryComposer
12 - $fiscalFirstMonth + 1;
return
"CASE WHEN MONTH({$part}) >= {$fiscalFirstMonth} THEN ".
"CONCAT(YEAR({$part}), '_', FLOOR((MONTH({$part}) - {$fiscalFirstMonth}) / 3) + 1) ".
"ELSE CONCAT(YEAR({$part}) - 1, '_', CEIL((MONTH({$part}) + {$fiscalDistractedMonth}) / 3)) END";
"CASE WHEN MONTH($part) >= $fiscalFirstMonth THEN ".
"CONCAT(YEAR($part), '_', FLOOR((MONTH($part) - $fiscalFirstMonth) / 3) + 1) ".
"ELSE CONCAT(YEAR($part) - 1, '_', CEIL((MONTH($part) + $fiscalDistractedMonth) / 3)) END";
}
}
@@ -937,7 +935,7 @@ abstract class BaseQueryComposer implements QueryComposer
if (in_array($function, Functions::COMPARISON_FUNCTION_LIST)) {
if (count($argumentPartList) < 2) {
throw new RuntimeException("Not enough arguments for function '{$function}'.");
throw new RuntimeException("Not enough arguments for function '$function'.");
}
$operator = $this->comparisonFunctionOperatorMap[$function];
@@ -947,7 +945,7 @@ abstract class BaseQueryComposer implements QueryComposer
if (in_array($function, Functions::MATH_OPERATION_FUNCTION_LIST)) {
if (count($argumentPartList) < 2) {
throw new RuntimeException("ORM Query: Not enough arguments for function '{$function}'.");
throw new RuntimeException("ORM Query: Not enough arguments for function '$function'.");
}
$operator = $this->mathFunctionOperatorMap[$function];
@@ -959,7 +957,7 @@ abstract class BaseQueryComposer implements QueryComposer
$operator = $this->comparisonFunctionOperatorMap[$function];
if (count($argumentPartList) < 2) {
throw new RuntimeException("ORM Query: Not enough arguments for function '{$function}'.");
throw new RuntimeException("ORM Query: Not enough arguments for function '$function'.");
}
$operatorArgumentList = $argumentPartList;
@@ -995,7 +993,7 @@ abstract class BaseQueryComposer implements QueryComposer
$whenPart = $argumentPartList[$i * 2];
$thenPart = $argumentPartList[$i * 2 + 1];
$part .= " WHEN {$whenPart} THEN {$thenPart}";
$part .= " WHEN $whenPart THEN $thenPart";
}
if (count($argumentPartList) % 2) {
@@ -1019,7 +1017,7 @@ abstract class BaseQueryComposer implements QueryComposer
$whenPart = $argumentPartList[$i * 2];
$thenPart = $argumentPartList[$i * 2 + 1];
$part .= " WHEN {$whenPart} THEN {$thenPart}";
$part .= " WHEN $whenPart THEN $thenPart";
}
if (count($argumentPartList) % 2) {
@@ -1031,22 +1029,22 @@ abstract class BaseQueryComposer implements QueryComposer
return $part;
case 'MONTH':
return "DATE_FORMAT({$part}, '%Y-%m')";
return "DATE_FORMAT($part, '%Y-%m')";
case 'DAY':
return "DATE_FORMAT({$part}, '%Y-%m-%d')";
return "DATE_FORMAT($part, '%Y-%m-%d')";
case 'WEEK_0':
return "CONCAT(SUBSTRING(YEARWEEK({$part}, 6), 1, 4), '/', ".
"TRIM(LEADING '0' FROM SUBSTRING(YEARWEEK({$part}, 6), 5, 2)))";
return "CONCAT(SUBSTRING(YEARWEEK($part, 6), 1, 4), '/', ".
"TRIM(LEADING '0' FROM SUBSTRING(YEARWEEK($part, 6), 5, 2)))";
case 'WEEK':
case 'WEEK_1':
return "CONCAT(SUBSTRING(YEARWEEK({$part}, 3), 1, 4), '/', ".
"TRIM(LEADING '0' FROM SUBSTRING(YEARWEEK({$part}, 3), 5, 2)))";
return "CONCAT(SUBSTRING(YEARWEEK($part, 3), 1, 4), '/', ".
"TRIM(LEADING '0' FROM SUBSTRING(YEARWEEK($part, 3), 5, 2)))";
case 'QUARTER':
return "CONCAT(YEAR({$part}), '_', QUARTER({$part}))";
return "CONCAT(YEAR($part), '_', QUARTER($part))";
case 'MONTH_NUMBER':
$function = 'MONTH';
@@ -1060,11 +1058,11 @@ abstract class BaseQueryComposer implements QueryComposer
break;
case 'WEEK_NUMBER_0':
return "WEEK({$part}, 6)";
return "WEEK($part, 6)";
case 'WEEK_NUMBER':
case 'WEEK_NUMBER_1':
return "WEEK({$part}, 3)";
return "WEEK($part, 3)";
case 'HOUR_NUMBER':
$function = 'HOUR';
@@ -1151,15 +1149,13 @@ abstract class BaseQueryComposer implements QueryComposer
$offsetMinutes = (abs($offset) - $offsetHours) * 60;
$offsetString =
str_pad((string) $offsetHours, 2, '0', \STR_PAD_LEFT) .
str_pad((string) $offsetHours, 2, '0', STR_PAD_LEFT) .
':' .
str_pad((string) $offsetMinutes, 2, '0', \STR_PAD_LEFT);
str_pad((string) $offsetMinutes, 2, '0', STR_PAD_LEFT);
if ($offset < 0) {
$offsetString = '-' . $offsetString;
} else {
$offsetString = '+' . $offsetString;
}
$offsetString = $offset < 0 ?
'-' . $offsetString :
'+' . $offsetString;
return "CONVERT_TZ(". $argumentPartList[0]. ", '+00:00', " . $this->quote($offsetString) . ")";
}
@@ -1380,18 +1376,14 @@ abstract class BaseQueryComposer implements QueryComposer
$part = $this->getAttributeParam($entity, $attribute, 'order');
$part = str_replace('{direction}', $order, $part);
return $part;
return str_replace('{direction}', $order, $part);
}
if (!empty($defs['sql'])) {
// @deprecated
$part = $defs['sql'];
$part = str_replace('{direction}', $order, $part);
return $part;
return str_replace('{direction}', $order, $part);
}
if (!empty($defs['order'])) {
@@ -1755,12 +1747,10 @@ abstract class BaseQueryComposer implements QueryComposer
throw new RuntimeException("Bad select expression.");
}
$selectPartItemList[] = "{$expression} AS " . $this->quoteIdentifier($alias);
$selectPartItemList[] = "$expression AS " . $this->quoteIdentifier($alias);
}
$selectPart = implode(', ', $selectPartItemList);
return $selectPart;
return implode(', ', $selectPartItemList);
}
/**
@@ -1955,12 +1945,12 @@ abstract class BaseQueryComposer implements QueryComposer
$fromAlias = $this->getFromAlias($params, $entity->getEntityType());
$leftColumnPart = $this->quoteColumn("{$fromAlias}." . $this->toDb($key));
$rightColumnPart = $this->quoteColumn("{$alias}." . $this->toDb($foreignKey));
$leftColumnPart = $this->quoteColumn("$fromAlias." . $this->toDb($key));
$rightColumnPart = $this->quoteColumn("$alias." . $this->toDb($foreignKey));
return
"JOIN " . $this->quoteIdentifier($table) . " AS " . $this->quoteIdentifier($alias) . " ON ".
"{$leftColumnPart} = {$rightColumnPart}";
"$leftColumnPart = $rightColumnPart";
}
/**
@@ -2145,7 +2135,7 @@ abstract class BaseQueryComposer implements QueryComposer
$list = array_reverse($list);
$listString = implode(', ', $list);
$orderBy = "POSITION_IN_LIST:({$field}, {$listString})";
$orderBy = "POSITION_IN_LIST:($field, $listString)";
$order = 'DESC';
}
@@ -2164,7 +2154,7 @@ abstract class BaseQueryComposer implements QueryComposer
}
if (is_integer($orderBy)) {
return "{$orderBy} " . $order;
return "$orderBy " . $order;
}
if (
@@ -2181,7 +2171,7 @@ abstract class BaseQueryComposer implements QueryComposer
throw new LogicException("Could not handle 'order' for '".$entity->getEntityType()."'.");
}
return "{$fieldPath} " . $order;
return "$fieldPath " . $order;
}
/**
@@ -2362,16 +2352,16 @@ abstract class BaseQueryComposer implements QueryComposer
$item = $this->getAlias($entity, $relationName) . '.' . $this->toDb($value);
$item = $this->quoteColumn($item);
$foreign[$i] = "COALESCE({$item}, '')";
$foreign[$i] = "COALESCE($item, '')";
}
$path = 'TRIM(CONCAT(' . implode(', ', $foreign). '))';
if ($wsCount > 1) {
$path = "REPLACE({$path}, ' ', ' ')";
$path = "REPLACE($path, ' ', ' ')";
}
return "NULLIF({$path}, '')";
return "NULLIF($path, '')";
}
$expression = $this->getAlias($entity, $relationName) . '.' . $foreign;
@@ -2488,7 +2478,7 @@ abstract class BaseQueryComposer implements QueryComposer
$subQueryPart = $this->composeSelect($value);
return "EXISTS ({$subQueryPart})";
return "EXISTS ($subQueryPart)";
}
$isComplex = false;
@@ -2543,7 +2533,7 @@ abstract class BaseQueryComposer implements QueryComposer
if ($value instanceof Select) {
$subSql = $this->composeSelect($value);
return "{$leftPart} {$operator} ({$subSql})";
return "$leftPart $operator ($subSql)";
}
if (!is_array($value)) {
@@ -2568,7 +2558,7 @@ abstract class BaseQueryComposer implements QueryComposer
$subSql = $this->createSelectQueryInternal($subQuerySelectParams);
return "{$leftPart} {$operator} ({$subSql})";
return "$leftPart $operator ($subSql)";
}
if ($value instanceof Select) {
@@ -2578,7 +2568,7 @@ abstract class BaseQueryComposer implements QueryComposer
$subQueryPart = $this->composeSelect($value);
return "{$leftPart} {$operator} ({$subQueryPart})";
return "$leftPart $operator ($subQueryPart)";
}
if (str_ends_with($operatorOrm, 'any') || str_ends_with($operatorOrm, 'all')) {
@@ -2612,7 +2602,7 @@ abstract class BaseQueryComposer implements QueryComposer
$valuesPart = implode(',', $valuePartList);
return "{$leftPart} {$negatingPart}IN ({$valuesPart})";
return "$leftPart {$negatingPart}IN ($valuesPart)";
}
if ($isNotValue) {
@@ -2622,16 +2612,16 @@ abstract class BaseQueryComposer implements QueryComposer
$expressionSql = $this->convertComplexExpression($entity, $value, false, $params);
return "{$leftPart} {$operator} {$expressionSql}";
return "$leftPart $operator $expressionSql";
}
if (is_null($value)) {
if ($operator === '=') {
return "{$leftPart} IS NULL";
return "$leftPart IS NULL";
}
if ($operator === '<>') {
return "{$leftPart} IS NOT NULL";
return "$leftPart IS NOT NULL";
}
return $this->quote(false);
@@ -2639,7 +2629,7 @@ abstract class BaseQueryComposer implements QueryComposer
$valuePart = $this->quote($value);
return "{$leftPart} {$operator} {$valuePart}";
return "$leftPart $operator $valuePart";
}
/**
@@ -2656,28 +2646,28 @@ abstract class BaseQueryComposer implements QueryComposer
$foreign = $this->getAttributeParam($entity, $attribute, 'foreign');
if (!$relationName) {
throw new RuntimeException("No 'relation' param for field {$entityType}.{$attribute}.");
throw new RuntimeException("No 'relation' param for field $entityType.$attribute.");
}
if (!$foreign) {
throw new RuntimeException("No 'foreign' param for field {$entityType}.{$attribute}.");
throw new RuntimeException("No 'foreign' param for field $entityType.$attribute.");
}
if (!$entity->hasRelation($relationName)) {
throw new RuntimeException("No relation '$relationName' for field {$entityType}.{$attribute}.");
throw new RuntimeException("No relation '$relationName' for field $entityType.$attribute.");
}
$alias = $this->getAlias($entity, $relationName);
if (!$alias) {
throw new RuntimeException("Could not get alias for {$entityType}.{$relationName}.");
throw new RuntimeException("Could not get alias for $entityType.$relationName.");
}
if (is_array($foreign)) {
return $this->getAttributePath($entity, $attribute, $params);
}
return $this->convertComplexExpression($entity, "{$alias}.{$foreign}", false, $params);
return $this->convertComplexExpression($entity, "$alias.$foreign", false, $params);
}
$fromAlias = $this->getFromAlias($params, $entity->getEntityType());
@@ -3057,7 +3047,7 @@ abstract class BaseQueryComposer implements QueryComposer
$this->sanitize($alias);
}
$sql .= $this->quoteColumn("{$leftAlias}.{$column}");
$sql .= $this->quoteColumn("$leftAlias.$column");
}
if ($right instanceof Expression) {
@@ -3247,16 +3237,16 @@ abstract class BaseQueryComposer implements QueryComposer
$indexPart = " USE INDEX (" . implode(', ', $sanitizedIndexList) . ")";
}
$leftKeyColumn = $this->quoteColumn("{$fromAlias}." . $this->toDb($key));
$middleKeyColumn = $this->quoteColumn("{$midAlias}." . $this->toDb($nearKey));
$middleDeletedColumn = $this->quoteColumn("{$midAlias}.deleted");
$leftKeyColumn = $this->quoteColumn("$fromAlias." . $this->toDb($key));
$middleKeyColumn = $this->quoteColumn("$midAlias." . $this->toDb($nearKey));
$middleDeletedColumn = $this->quoteColumn("$midAlias.deleted");
$sql =
"{$prefix}JOIN ".$this->quoteIdentifier($relTable)." AS " .
$this->quoteIdentifier($midAlias) . "{$indexPart} " .
"ON {$leftKeyColumn} = {$middleKeyColumn}" .
$this->quoteIdentifier($midAlias) . "$indexPart " .
"ON $leftKeyColumn = $middleKeyColumn" .
" AND " .
"{$middleDeletedColumn} = " . $this->quote(false);
"$middleDeletedColumn = " . $this->quote(false);
$joinSqlList = [];
@@ -3275,15 +3265,15 @@ abstract class BaseQueryComposer implements QueryComposer
}
if (!$onlyMiddle) {
$rightKeyColumn = $this->quoteColumn("{$alias}." . $this->toDb($foreignKey));
$middleDistantKeyColumn = $this->quoteColumn("{$midAlias}." . $this->toDb($distantKey));
$rightDeletedColumn = $this->quoteColumn("{$alias}.deleted");
$rightKeyColumn = $this->quoteColumn("$alias." . $this->toDb($foreignKey));
$middleDistantKeyColumn = $this->quoteColumn("$midAlias." . $this->toDb($distantKey));
$rightDeletedColumn = $this->quoteColumn("$alias.deleted");
$sql .= " {$prefix}JOIN " . $this->quoteIdentifier($distantTable) . " AS " .
$this->quoteIdentifier($alias)
. " ON {$rightKeyColumn} = {$middleDistantKeyColumn}"
. " ON $rightKeyColumn = $middleDistantKeyColumn"
. " AND "
. "{$rightDeletedColumn} = " . $this->quote(false);
. "$rightDeletedColumn = " . $this->quote(false);
}
return $sql;
@@ -3293,15 +3283,15 @@ abstract class BaseQueryComposer implements QueryComposer
$foreignKey = $keySet['foreignKey'];
$distantTable = $this->toDb($foreignEntityType);
$leftIdColumn = $this->quoteColumn("{$fromAlias}." . $this->toDb('id'));
$rightIdColumn = $this->quoteColumn("{$alias}." . $this->toDb($foreignKey));
$leftDeletedColumn = $this->quoteColumn("{$alias}.deleted");
$leftIdColumn = $this->quoteColumn("$fromAlias." . $this->toDb('id'));
$rightIdColumn = $this->quoteColumn("$alias." . $this->toDb($foreignKey));
$leftDeletedColumn = $this->quoteColumn("$alias.deleted");
$sql =
"{$prefix}JOIN " . $this->quoteIdentifier($distantTable) . " AS "
. $this->quoteIdentifier($alias) . " ON "
. "{$leftIdColumn} = {$rightIdColumn} AND "
. "{$leftDeletedColumn} = " . $this->quote(false);
. "$leftIdColumn = $rightIdColumn AND "
. "$leftDeletedColumn = " . $this->quote(false);
$joinSqlList = [];
@@ -3325,18 +3315,18 @@ abstract class BaseQueryComposer implements QueryComposer
$distantTable = $this->toDb($foreignEntityType);
$leftIdColumn = $this->quoteColumn("{$fromAlias}." . $this->toDb('id'));
$rightIdColumn = $this->quoteColumn("{$alias}." . $this->toDb($foreignKey));
$leftTypeColumn = $this->quoteColumn("{$alias}." . $this->toDb($foreignType));
$leftDeletedColumn = $this->quoteColumn("{$alias}.deleted");
$leftIdColumn = $this->quoteColumn("$fromAlias." . $this->toDb('id'));
$rightIdColumn = $this->quoteColumn("$alias." . $this->toDb($foreignKey));
$leftTypeColumn = $this->quoteColumn("$alias." . $this->toDb($foreignType));
$leftDeletedColumn = $this->quoteColumn("$alias.deleted");
$sql =
"{$prefix}JOIN " . $this->quoteIdentifier($distantTable)
. " AS "
. $this->quoteIdentifier($alias) . " ON "
. "{$leftIdColumn} = {$rightIdColumn} AND "
. "{$leftTypeColumn} = " . $this->quote($entity->getEntityType()) . " AND "
. "{$leftDeletedColumn} = " . $this->quote(false);
. "$leftIdColumn = $rightIdColumn AND "
. "$leftTypeColumn = " . $this->quote($entity->getEntityType()) . " AND "
. "$leftDeletedColumn = " . $this->quote(false);
$joinSqlList = [];
@@ -3382,10 +3372,10 @@ abstract class BaseQueryComposer implements QueryComposer
$sql .= " DISTINCT";
}
$sql .= " {$select}";
$sql .= " $select";
if ($from) {
$sql .= " FROM {$from}";
$sql .= " FROM $from";
}
if ($alias) {
@@ -3399,23 +3389,23 @@ abstract class BaseQueryComposer implements QueryComposer
}
if (!empty($joins)) {
$sql .= " {$joins}";
$sql .= " $joins";
}
if ($where !== null && $where !== '') {
$sql .= " WHERE {$where}";
$sql .= " WHERE $where";
}
if (!empty($groupBy)) {
$sql .= " GROUP BY {$groupBy}";
$sql .= " GROUP BY $groupBy";
}
if ($having !== null && $having !== '') {
$sql .= " HAVING {$having}";
$sql .= " HAVING $having";
}
if (!empty($order)) {
$sql .= " ORDER BY {$order}";
$sql .= " ORDER BY $order";
}
if (is_null($offset) && !is_null($limit)) {
@@ -3454,15 +3444,15 @@ abstract class BaseQueryComposer implements QueryComposer
}
if ($joins) {
$sql .= " {$joins}";
$sql .= " $joins";
}
if ($where) {
$sql .= " WHERE {$where}";
$sql .= " WHERE $where";
}
if ($order) {
$sql .= " ORDER BY {$order}";
$sql .= " ORDER BY $order";
}
if ($limit !== null) {
@@ -3484,17 +3474,17 @@ abstract class BaseQueryComposer implements QueryComposer
$sql = "UPDATE " . $this->quoteIdentifier($table);
if ($joins) {
$sql .= " {$joins}";
$sql .= " $joins";
}
$sql .= " SET {$set}";
$sql .= " SET $set";
if ($where) {
$sql .= " WHERE {$where}";
$sql .= " WHERE $where";
}
if ($order) {
$sql .= " ORDER BY {$order}";
$sql .= " ORDER BY $order";
}
if ($limit !== null) {
@@ -3511,7 +3501,7 @@ abstract class BaseQueryComposer implements QueryComposer
?string $update = null
): string {
$sql = "INSERT INTO " . $this->quoteIdentifier($table) . " ({$columns}) {$values}";
$sql = "INSERT INTO " . $this->quoteIdentifier($table) . " ($columns) $values";
if ($update) {
$sql .= " ON DUPLICATE KEY UPDATE " . $update;
@@ -3546,13 +3536,13 @@ abstract class BaseQueryComposer implements QueryComposer
$alias = $this->sanitize($alias);
$column = $this->toDb($this->sanitize($attribute));
$left = $this->quoteColumn("{$alias}.{$column}");
$left = $this->quoteColumn("$alias.$column");
}
else {
$table = $this->toDb($entity->getEntityType());
$column = $this->toDb($this->sanitize($attribute));
$left = $this->quoteColumn("{$table}.{$column}");
$left = $this->quoteColumn("$table.$column");
}
$right = $isNotValue ?
@@ -83,7 +83,7 @@ class MysqlQueryComposer extends BaseQueryComposer
$offset = intval($offset);
$limit = intval($limit);
$sql .= " LIMIT {$offset}, {$limit}";
$sql .= " LIMIT $offset, $limit";
return $sql;
}
@@ -91,7 +91,7 @@ class MysqlQueryComposer extends BaseQueryComposer
if (!is_null($limit)) {
$limit = intval($limit);
$sql .= " LIMIT {$limit}";
$sql .= " LIMIT $limit";
return $sql;
}
@@ -141,12 +141,12 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$columnsPart = implode(
" || ' ' || ",
array_map(
fn ($item) => "COALESCE({$item}, '')",
fn ($item) => "COALESCE($item, '')",
array_slice($argumentPartList, 0, -1)
)
);
return "TS_RANK_CD(TO_TSVECTOR({$columnsPart}), PLAINTO_TSQUERY({$queryPart}))";
return "TS_RANK_CD(TO_TSVECTOR($columnsPart), PLAINTO_TSQUERY($queryPart))";
}
if ($function === 'IF') {
@@ -158,21 +158,21 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$thenPart = $argumentPartList[1];
$elsePart = $argumentPartList[2];
return "CASE WHEN {$conditionPart} THEN {$thenPart} ELSE {$elsePart} END";
return "CASE WHEN $conditionPart THEN $thenPart ELSE $elsePart END";
}
if ($function === 'ROUND') {
if (count($argumentPartList) === 2 && $argumentPartList[1] === '0') {
$argumentPartList = array_slice($argumentPartList, 0, -1);
return "ROUND({$argumentPartList[0]})";
return "ROUND($argumentPartList[0])";
}
}
if ($function === 'UNIX_TIMESTAMP') {
$arg = $argumentPartList[0] ?? 'NOW()';
return "FLOOR(EXTRACT(EPOCH FROM {$arg}))";
return "FLOOR(EXTRACT(EPOCH FROM $arg))";
}
if ($function === 'BINARY') {
@@ -190,7 +190,7 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$offsetHoursString = substr($offsetHoursString, 1, -1);
}
return "{$argumentPartList[0]} + INTERVAL 'HOUR {$offsetHoursString}'";
return "$argumentPartList[0] + INTERVAL 'HOUR $offsetHoursString'";
}
if ($function === 'POSITION_IN_LIST') {
@@ -209,7 +209,7 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$resolution = intval($item[0]);
$value = $item[1];
return " WHEN {$field} = {$value} THEN {$resolution}";
return " WHEN $field = $value THEN $resolution";
}, array_slice($pairs, 1));
return "CASE" . implode('', $whenParts) . " ELSE 0 END";
@@ -227,9 +227,9 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$fiscalFirstMonth = $fiscalShift + 1;
return
"CASE WHEN EXTRACT(MONTH FROM {$part}) >= {$fiscalFirstMonth} THEN ".
"EXTRACT(YEAR FROM {$part}) ".
"ELSE EXTRACT(YEAR FROM {$part}) - 1 END";
"CASE WHEN EXTRACT(MONTH FROM $part) >= $fiscalFirstMonth THEN ".
"EXTRACT(YEAR FROM $part) ".
"ELSE EXTRACT(YEAR FROM $part) - 1 END";
}
}
@@ -244,16 +244,16 @@ class PostgresqlQueryComposer extends BaseQueryComposer
12 - $fiscalFirstMonth + 1;
return
"CASE WHEN EXTRACT(MONTH FROM {$part}) >= {$fiscalFirstMonth} " .
"CASE WHEN EXTRACT(MONTH FROM $part) >= $fiscalFirstMonth " .
"THEN " .
"CONCAT(" .
"EXTRACT(YEAR FROM {$part}), '_', " .
"FLOOR((EXTRACT(MONTH FROM {$part}) - {$fiscalFirstMonth}) / 3) + 1" .
"EXTRACT(YEAR FROM $part), '_', " .
"FLOOR((EXTRACT(MONTH FROM $part) - $fiscalFirstMonth) / 3) + 1" .
") " .
"ELSE " .
"CONCAT(" .
"EXTRACT(YEAR FROM {$part}) - 1, '_', " .
"CEIL((EXTRACT(MONTH FROM {$part}) + {$fiscalDistractedMonth}) / 3)" .
"EXTRACT(YEAR FROM $part) - 1, '_', " .
"CEIL((EXTRACT(MONTH FROM $part) + $fiscalDistractedMonth) / 3)" .
") " .
"END";
}
@@ -261,10 +261,10 @@ class PostgresqlQueryComposer extends BaseQueryComposer
switch ($function) {
case 'MONTH':
return "TO_CHAR({$part}, 'YYYY-MM')";
return "TO_CHAR($part, 'YYYY-MM')";
case 'DAY':
return "TO_CHAR({$part}, 'YYYY-MM-DD')";
return "TO_CHAR($part, 'YYYY-MM-DD')";
case 'WEEK':
case 'WEEK_0':
@@ -273,46 +273,46 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$part = "DATE " . $part;
}
return "CONCAT(TO_CHAR({$part}, 'YYYY'), '/', TRIM(LEADING '0' FROM TO_CHAR({$part}, 'IW')))";
return "CONCAT(TO_CHAR($part, 'YYYY'), '/', TRIM(LEADING '0' FROM TO_CHAR($part, 'IW')))";
case 'QUARTER':
return "CONCAT(TO_CHAR({$part}, 'YYYY'), '_', TO_CHAR({$part}, 'Q'))";
return "CONCAT(TO_CHAR($part, 'YYYY'), '_', TO_CHAR($part, 'Q'))";
case 'WEEK_NUMBER_0':
case 'WEEK_NUMBER':
case 'WEEK_NUMBER_1':
// Monday week-start not implemented.
return "TO_CHAR({$part}, 'IW')::INTEGER";
return "TO_CHAR($part, 'IW')::INTEGER";
case 'HOUR_NUMBER':
case 'HOUR':
return "EXTRACT(HOUR FROM {$part})";
return "EXTRACT(HOUR FROM $part)";
case 'MINUTE_NUMBER':
case 'MINUTE':
return "EXTRACT(MINUTE FROM {$part})";
return "EXTRACT(MINUTE FROM $part)";
case 'SECOND_NUMBER':
case 'SECOND':
return "FLOOR(EXTRACT(SECOND FROM {$part}))";
return "FLOOR(EXTRACT(SECOND FROM $part))";
case 'DATE_NUMBER':
case 'DAYOFMONTH':
return "EXTRACT(DAY FROM {$part})";
return "EXTRACT(DAY FROM $part)";
case 'DAYOFWEEK_NUMBER':
case 'DAYOFWEEK':
return "EXTRACT(DOW FROM {$part})";
return "EXTRACT(DOW FROM $part)";
case 'MONTH_NUMBER':
return "EXTRACT(MONTH FROM {$part})";
return "EXTRACT(MONTH FROM $part)";
case 'YEAR_NUMBER':
case 'YEAR':
return "EXTRACT(YEAR FROM {$part})";
return "EXTRACT(YEAR FROM $part)";
case 'QUARTER_NUMBER':
return "EXTRACT(QUARTER FROM {$part})";
return "EXTRACT(QUARTER FROM $part)";
}
if (str_starts_with($function, 'TIMESTAMPDIFF_')) {
@@ -321,25 +321,25 @@ class PostgresqlQueryComposer extends BaseQueryComposer
switch ($function) {
case 'TIMESTAMPDIFF_YEAR':
return "EXTRACT(YEAR FROM {$to} - {$from})";
return "EXTRACT(YEAR FROM $to - $from)";
case 'TIMESTAMPDIFF_MONTH':
return "EXTRACT(MONTH FROM {$to}) - {$from})";
return "EXTRACT(MONTH FROM $to) - $from)";
case 'TIMESTAMPDIFF_WEEK':
return "FLOOR(EXTRACT(DAY FROM {$to} - {$from}) / 7)";
return "FLOOR(EXTRACT(DAY FROM $to - $from) / 7)";
case 'TIMESTAMPDIFF_DAY':
return "EXTRACT(DAY FROM ({$to}) - {$from})";
return "EXTRACT(DAY FROM ($to) - $from)";
case 'TIMESTAMPDIFF_HOUR':
return "EXTRACT(HOUR FROM {$to} - {$from})";
return "EXTRACT(HOUR FROM $to - $from)";
case 'TIMESTAMPDIFF_MINUTE':
return "EXTRACT(MINUTE FROM {$to} - {$from})";
return "EXTRACT(MINUTE FROM $to - $from)";
case 'TIMESTAMPDIFF_SECOND':
return "FLOOR(EXTRACT(SECOND FROM {$to} - {$from}))";
return "FLOOR(EXTRACT(SECOND FROM $to - $from))";
}
}
@@ -458,7 +458,7 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$table = $this->toDb($entityType);
$sql = "INSERT INTO " . $this->quoteIdentifier($table) . " ({$columnsPart}) {$valuesPart}";
$sql = "INSERT INTO " . $this->quoteIdentifier($table) . " ($columnsPart) $valuesPart";
if ($updatePart) {
$updateColumnsPart = implode(', ',
@@ -467,7 +467,7 @@ class PostgresqlQueryComposer extends BaseQueryComposer
)
);
$sql .= " ON CONFLICT({$updateColumnsPart}) DO UPDATE SET " . $updatePart;
$sql .= " ON CONFLICT($updateColumnsPart) DO UPDATE SET " . $updatePart;
}
return $sql;
@@ -575,7 +575,7 @@ class PostgresqlQueryComposer extends BaseQueryComposer
$offset = intval($offset);
$limit = intval($limit);
$sql .= " LIMIT {$limit} OFFSET {$offset}";
$sql .= " LIMIT $limit OFFSET $offset";
return $sql;
}
@@ -583,7 +583,7 @@ class PostgresqlQueryComposer extends BaseQueryComposer
if (!is_null($limit)) {
$limit = intval($limit);
$sql .= " LIMIT {$limit}";
$sql .= " LIMIT $limit";
return $sql;
}