Merge pull request #25656 from nextcloud/enh/type/expressionbuilder

Type the experssionbuilders
This commit is contained in:
Joas Schilling 2021-03-03 11:37:16 +01:00 committed by GitHub
commit a6246be34c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 79 additions and 77 deletions

View File

@ -33,6 +33,7 @@ use OC\DB\QueryBuilder\FunctionBuilder\FunctionBuilder;
use OC\DB\QueryBuilder\Literal;
use OC\DB\QueryBuilder\QueryFunction;
use OC\DB\QueryBuilder\QuoteHelper;
use OCP\DB\QueryBuilder\ICompositeExpression;
use OCP\DB\QueryBuilder\IExpressionBuilder;
use OCP\DB\QueryBuilder\ILiteral;
use OCP\DB\QueryBuilder\IParameter;
@ -80,7 +81,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return \OCP\DB\QueryBuilder\ICompositeExpression
*/
public function andX(...$x) {
public function andX(...$x): ICompositeExpression {
$compositeExpression = call_user_func_array([$this->expressionBuilder, 'andX'], $x);
return new CompositeExpression($compositeExpression);
}
@ -99,7 +100,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return \OCP\DB\QueryBuilder\ICompositeExpression
*/
public function orX(...$x) {
public function orX(...$x): ICompositeExpression {
$compositeExpression = call_user_func_array([$this->expressionBuilder, 'orX'], $x);
return new CompositeExpression($compositeExpression);
}
@ -115,7 +116,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function comparison($x, $operator, $y, $type = null) {
public function comparison($x, string $operator, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->comparison($x, $operator, $y);
@ -138,7 +139,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function eq($x, $y, $type = null) {
public function eq($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->eq($x, $y);
@ -160,7 +161,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function neq($x, $y, $type = null) {
public function neq($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->neq($x, $y);
@ -182,7 +183,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function lt($x, $y, $type = null) {
public function lt($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->lt($x, $y);
@ -204,7 +205,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function lte($x, $y, $type = null) {
public function lte($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->lte($x, $y);
@ -226,7 +227,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function gt($x, $y, $type = null) {
public function gt($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->gt($x, $y);
@ -248,7 +249,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function gte($x, $y, $type = null) {
public function gte($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->gte($x, $y);
@ -257,11 +258,11 @@ class ExpressionBuilder implements IExpressionBuilder {
/**
* Creates an IS NULL expression with the given arguments.
*
* @param string $x The field in string format to be restricted by IS NULL.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NULL.
*
* @return string
*/
public function isNull($x) {
public function isNull($x): string {
$x = $this->helper->quoteColumnName($x);
return $this->expressionBuilder->isNull($x);
}
@ -269,11 +270,11 @@ class ExpressionBuilder implements IExpressionBuilder {
/**
* Creates an IS NOT NULL expression with the given arguments.
*
* @param string $x The field in string format to be restricted by IS NOT NULL.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NOT NULL.
*
* @return string
*/
public function isNotNull($x) {
public function isNotNull($x): string {
$x = $this->helper->quoteColumnName($x);
return $this->expressionBuilder->isNotNull($x);
}
@ -288,7 +289,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function like($x, $y, $type = null) {
public function like($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->like($x, $y);
@ -305,7 +306,7 @@ class ExpressionBuilder implements IExpressionBuilder {
* @return string
* @since 9.0.0
*/
public function iLike($x, $y, $type = null) {
public function iLike($x, $y, $type = null): string {
return $this->expressionBuilder->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y));
}
@ -319,7 +320,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function notLike($x, $y, $type = null) {
public function notLike($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->notLike($x, $y);
@ -335,7 +336,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function in($x, $y, $type = null) {
public function in($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnNames($y);
return $this->expressionBuilder->in($x, $y);
@ -351,7 +352,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return string
*/
public function notIn($x, $y, $type = null) {
public function notIn($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnNames($y);
return $this->expressionBuilder->notIn($x, $y);
@ -360,22 +361,22 @@ class ExpressionBuilder implements IExpressionBuilder {
/**
* Creates a $x = '' statement, because Oracle needs a different check
*
* @param string $x The field in string format to be inspected by the comparison.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison.
* @return string
* @since 13.0.0
*/
public function emptyString($x) {
public function emptyString($x): string {
return $this->eq($x, $this->literal('', IQueryBuilder::PARAM_STR));
}
/**
* Creates a `$x <> ''` statement, because Oracle needs a different check
*
* @param string $x The field in string format to be inspected by the comparison.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison.
* @return string
* @since 13.0.0
*/
public function nonEmptyString($x) {
public function nonEmptyString($x): string {
return $this->neq($x, $this->literal('', IQueryBuilder::PARAM_STR));
}
@ -387,7 +388,7 @@ class ExpressionBuilder implements IExpressionBuilder {
* @return IQueryFunction
* @since 12.0.0
*/
public function bitwiseAnd($x, $y) {
public function bitwiseAnd($x, int $y): IQueryFunction {
return new QueryFunction($this->connection->getDatabasePlatform()->getBitAndComparisonExpression(
$this->helper->quoteColumnName($x),
$y
@ -402,7 +403,7 @@ class ExpressionBuilder implements IExpressionBuilder {
* @return IQueryFunction
* @since 12.0.0
*/
public function bitwiseOr($x, $y) {
public function bitwiseOr($x, int $y): IQueryFunction {
return new QueryFunction($this->connection->getDatabasePlatform()->getBitOrComparisonExpression(
$this->helper->quoteColumnName($x),
$y
@ -417,7 +418,7 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @return ILiteral
*/
public function literal($input, $type = null) {
public function literal($input, $type = null): ILiteral {
return new Literal($this->expressionBuilder->literal($input, $type));
}
@ -426,9 +427,9 @@ class ExpressionBuilder implements IExpressionBuilder {
*
* @param string $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return string
* @return IQueryFunction
*/
public function castColumn($column, $type) {
public function castColumn(string $column, $type): IQueryFunction {
return new QueryFunction(
$this->helper->quoteColumnName($column)
);

View File

@ -46,7 +46,7 @@ class MySqlExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function iLike($x, $y, $type = null) {
public function iLike($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->comparison($x, ' COLLATE ' . $this->charset . '_general_ci LIKE', $y);

View File

@ -49,7 +49,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function comparison($x, $operator, $y, $type = null) {
public function comparison($x, string $operator, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -59,7 +59,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function eq($x, $y, $type = null) {
public function eq($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -69,7 +69,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function neq($x, $y, $type = null) {
public function neq($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -79,7 +79,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function lt($x, $y, $type = null) {
public function lt($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -89,7 +89,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function lte($x, $y, $type = null) {
public function lte($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -99,7 +99,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function gt($x, $y, $type = null) {
public function gt($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -109,7 +109,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function gte($x, $y, $type = null) {
public function gte($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -119,7 +119,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function in($x, $y, $type = null) {
public function in($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -129,7 +129,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function notIn($x, $y, $type = null) {
public function notIn($x, $y, $type = null): string {
$x = $this->prepareColumn($x, $type);
$y = $this->prepareColumn($y, $type);
@ -139,22 +139,22 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* Creates a $x = '' statement, because Oracle needs a different check
*
* @param string $x The field in string format to be inspected by the comparison.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison.
* @return string
* @since 13.0.0
*/
public function emptyString($x) {
public function emptyString($x): string {
return $this->isNull($x);
}
/**
* Creates a `$x <> ''` statement, because Oracle needs a different check
*
* @param string $x The field in string format to be inspected by the comparison.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison.
* @return string
* @since 13.0.0
*/
public function nonEmptyString($x) {
public function nonEmptyString($x): string {
return $this->isNotNull($x);
}
@ -165,7 +165,7 @@ class OCIExpressionBuilder extends ExpressionBuilder {
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return IQueryFunction
*/
public function castColumn($column, $type) {
public function castColumn(string $column, $type): IQueryFunction {
if ($type === IQueryBuilder::PARAM_STR) {
$column = $this->helper->quoteColumnName($column);
return new QueryFunction('to_char(' . $column . ')');
@ -181,14 +181,14 @@ class OCIExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function like($x, $y, $type = null) {
public function like($x, $y, $type = null): string {
return parent::like($x, $y, $type) . " ESCAPE '\\'";
}
/**
* @inheritdoc
*/
public function iLike($x, $y, $type = null) {
public function iLike($x, $y, $type = null): string {
return $this->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y));
}
}

View File

@ -26,6 +26,7 @@ namespace OC\DB\QueryBuilder\ExpressionBuilder;
use OC\DB\QueryBuilder\QueryFunction;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
class PgSqlExpressionBuilder extends ExpressionBuilder {
@ -34,9 +35,9 @@ class PgSqlExpressionBuilder extends ExpressionBuilder {
*
* @param string $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return string
* @return IQueryFunction
*/
public function castColumn($column, $type) {
public function castColumn($column, $type): IQueryFunction {
switch ($type) {
case IQueryBuilder::PARAM_INT:
return new QueryFunction('CAST(' . $this->helper->quoteColumnName($column) . ' AS INT)');
@ -50,7 +51,7 @@ class PgSqlExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function iLike($x, $y, $type = null) {
public function iLike($x, $y, $type = null): string {
$x = $this->helper->quoteColumnName($x);
$y = $this->helper->quoteColumnName($y);
return $this->expressionBuilder->comparison($x, 'ILIKE', $y);

View File

@ -27,11 +27,11 @@ class SqliteExpressionBuilder extends ExpressionBuilder {
/**
* @inheritdoc
*/
public function like($x, $y, $type = null) {
public function like($x, $y, $type = null): string {
return parent::like($x, $y, $type) . " ESCAPE '\\'";
}
public function iLike($x, $y, $type = null) {
public function iLike($x, $y, $type = null): string {
return $this->like($this->functionBuilder->lower($x), $this->functionBuilder->lower($y), $type);
}
}

View File

@ -78,7 +78,7 @@ interface IExpressionBuilder {
*
* @psalm-taint-sink sql $x
*/
public function andX(...$x);
public function andX(...$x): ICompositeExpression;
/**
* Creates a disjunction of the given boolean expressions.
@ -97,7 +97,7 @@ interface IExpressionBuilder {
*
* @psalm-taint-sink sql $x
*/
public function orX(...$x);
public function orX(...$x): ICompositeExpression;
/**
* Creates a comparison expression.
@ -116,7 +116,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function comparison($x, $operator, $y, $type = null);
public function comparison($x, string $operator, $y, $type = null): string;
/**
* Creates an equality comparison expression with the given arguments.
@ -140,7 +140,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function eq($x, $y, $type = null);
public function eq($x, $y, $type = null): string;
/**
* Creates a non equality comparison expression with the given arguments.
@ -163,7 +163,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function neq($x, $y, $type = null);
public function neq($x, $y, $type = null): string;
/**
* Creates a lower-than comparison expression with the given arguments.
@ -186,7 +186,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function lt($x, $y, $type = null);
public function lt($x, $y, $type = null): string;
/**
* Creates a lower-than-equal comparison expression with the given arguments.
@ -209,7 +209,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function lte($x, $y, $type = null);
public function lte($x, $y, $type = null): string;
/**
* Creates a greater-than comparison expression with the given arguments.
@ -232,7 +232,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function gt($x, $y, $type = null);
public function gt($x, $y, $type = null): string;
/**
* Creates a greater-than-equal comparison expression with the given arguments.
@ -255,31 +255,31 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function gte($x, $y, $type = null);
public function gte($x, $y, $type = null): string;
/**
* Creates an IS NULL expression with the given arguments.
*
* @param string $x The field in string format to be restricted by IS NULL.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NULL.
*
* @return string
* @since 8.2.0
*
* @psalm-taint-sink sql $x
*/
public function isNull($x);
public function isNull($x): string;
/**
* Creates an IS NOT NULL expression with the given arguments.
*
* @param string $x The field in string format to be restricted by IS NOT NULL.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be restricted by IS NOT NULL.
*
* @return string
* @since 8.2.0
*
* @psalm-taint-sink sql $x
*/
public function isNotNull($x);
public function isNotNull($x): string;
/**
* Creates a LIKE() comparison expression with the given arguments.
@ -296,7 +296,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function like($x, $y, $type = null);
public function like($x, $y, $type = null): string;
/**
* Creates a NOT LIKE() comparison expression with the given arguments.
@ -313,7 +313,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function notLike($x, $y, $type = null);
public function notLike($x, $y, $type = null): string;
/**
* Creates a ILIKE() comparison expression with the given arguments.
@ -330,7 +330,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function iLike($x, $y, $type = null);
public function iLike($x, $y, $type = null): string;
/**
* Creates a IN () comparison expression with the given arguments.
@ -347,7 +347,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function in($x, $y, $type = null);
public function in($x, $y, $type = null): string;
/**
* Creates a NOT IN () comparison expression with the given arguments.
@ -364,29 +364,29 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $y
* @psalm-taint-sink sql $type
*/
public function notIn($x, $y, $type = null);
public function notIn($x, $y, $type = null): string;
/**
* Creates a $x = '' statement, because Oracle needs a different check
*
* @param string $x The field in string format to be inspected by the comparison.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison.
* @return string
* @since 13.0.0
*
* @psalm-taint-sink sql $x
*/
public function emptyString($x);
public function emptyString($x): string;
/**
* Creates a `$x <> ''` statement, because Oracle needs a different check
*
* @param string $x The field in string format to be inspected by the comparison.
* @param string|ILiteral|IParameter|IQueryFunction $x The field in string format to be inspected by the comparison.
* @return string
* @since 13.0.0
*
* @psalm-taint-sink sql $x
*/
public function nonEmptyString($x);
public function nonEmptyString($x): string;
/**
@ -400,7 +400,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $x
* @psalm-taint-sink sql $y
*/
public function bitwiseAnd($x, $y);
public function bitwiseAnd($x, int $y): IQueryFunction;
/**
* Creates a bitwise OR comparison
@ -413,7 +413,7 @@ interface IExpressionBuilder {
* @psalm-taint-sink sql $x
* @psalm-taint-sink sql $y
*/
public function bitwiseOr($x, $y);
public function bitwiseOr($x, int $y): IQueryFunction;
/**
* Quotes a given input parameter.
@ -421,24 +421,24 @@ interface IExpressionBuilder {
* @param mixed $input The parameter to be quoted.
* @param mixed|null $type One of the IQueryBuilder::PARAM_* constants
*
* @return string
* @return ILiteral
* @since 8.2.0
*
* @psalm-taint-sink sql $input
* @psalm-taint-sink sql $type
*/
public function literal($input, $type = null);
public function literal($input, $type = null): ILiteral;
/**
* Returns a IQueryFunction that casts the column to the given type
*
* @param string $column
* @param mixed $type One of IQueryBuilder::PARAM_*
* @return string
* @return IQueryFunction
* @since 9.0.0
*
* @psalm-taint-sink sql $column
* @psalm-taint-sink sql $type
*/
public function castColumn($column, $type);
public function castColumn(string $column, $type): IQueryFunction;
}