Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch expression in SqlNullabilityProcessor + cleanup #20953

Merged
merged 1 commit into from
May 15, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 38 additions & 68 deletions src/EFCore.Relational/Query/SqlNullabilityProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public SqlNullabilityProcessor(
/// A bool value indicating whether relational null semantics are in use.
/// </summary>
protected virtual bool UseRelationalNulls { get; }

/// <summary>
/// Dictionary of current parameter values in use.
/// </summary>
Expand Down Expand Up @@ -332,69 +333,38 @@ private SqlExpression Visit(
}

var nonNullableColumnsCount = _nonNullableColumns.Count;
SqlExpression result;
switch (sqlExpression)
var result = sqlExpression switch
{
case CaseExpression caseExpression:
result = VisitCase(caseExpression, allowOptimizedExpansion, out nullable);
break;

case CollateExpression collateExpression:
result = VisitCollate(collateExpression, allowOptimizedExpansion, out nullable);
break;

case ColumnExpression columnExpression:
result = VisitColumn(columnExpression, allowOptimizedExpansion, out nullable);
break;

case ExistsExpression existsExpression:
result = VisitExists(existsExpression, allowOptimizedExpansion, out nullable);
break;

case InExpression inExpression:
result = VisitIn(inExpression, allowOptimizedExpansion, out nullable);
break;

case LikeExpression likeExpression:
result = VisitLike(likeExpression, allowOptimizedExpansion, out nullable);
break;

case RowNumberExpression rowNumberExpression:
result = VisitRowNumber(rowNumberExpression, allowOptimizedExpansion, out nullable);
break;

case ScalarSubqueryExpression scalarSubqueryExpression:
result = VisitScalarSubquery(scalarSubqueryExpression, allowOptimizedExpansion, out nullable);
break;

case SqlBinaryExpression sqlBinaryExpression:
result = VisitSqlBinary(sqlBinaryExpression, allowOptimizedExpansion, out nullable);
break;

case SqlConstantExpression sqlConstantExpression:
result = VisitSqlConstant(sqlConstantExpression, allowOptimizedExpansion, out nullable);
break;

case SqlFragmentExpression sqlFragmentExpression:
result = VisitSqlFragment(sqlFragmentExpression, allowOptimizedExpansion, out nullable);
break;

case SqlFunctionExpression sqlFunctionExpression:
result = VisitSqlFunction(sqlFunctionExpression, allowOptimizedExpansion, out nullable);
break;

case SqlParameterExpression sqlParameterExpression:
result = VisitSqlParameter(sqlParameterExpression, allowOptimizedExpansion, out nullable);
break;

case SqlUnaryExpression sqlUnaryExpression:
result = VisitSqlUnary(sqlUnaryExpression, allowOptimizedExpansion, out nullable);
break;

default:
result = VisitCustomSqlExpression(sqlExpression, allowOptimizedExpansion, out nullable);
break;
}
CaseExpression caseExpression
=> VisitCase(caseExpression, allowOptimizedExpansion, out nullable),
CollateExpression collateExpression
=> VisitCollate(collateExpression, allowOptimizedExpansion, out nullable),
ColumnExpression columnExpression
=> VisitColumn(columnExpression, allowOptimizedExpansion, out nullable),
ExistsExpression existsExpression
=> VisitExists(existsExpression, allowOptimizedExpansion, out nullable),
InExpression inExpression
=> VisitIn(inExpression, allowOptimizedExpansion, out nullable),
LikeExpression likeExpression
=> VisitLike(likeExpression, allowOptimizedExpansion, out nullable),
RowNumberExpression rowNumberExpression
=> VisitRowNumber(rowNumberExpression, allowOptimizedExpansion, out nullable),
ScalarSubqueryExpression scalarSubqueryExpression
=> VisitScalarSubquery(scalarSubqueryExpression, allowOptimizedExpansion, out nullable),
SqlBinaryExpression sqlBinaryExpression
=> VisitSqlBinary(sqlBinaryExpression, allowOptimizedExpansion, out nullable),
SqlConstantExpression sqlConstantExpression
=> VisitSqlConstant(sqlConstantExpression, allowOptimizedExpansion, out nullable),
SqlFragmentExpression sqlFragmentExpression
=> VisitSqlFragment(sqlFragmentExpression, allowOptimizedExpansion, out nullable),
SqlFunctionExpression sqlFunctionExpression
=> VisitSqlFunction(sqlFunctionExpression, allowOptimizedExpansion, out nullable),
SqlParameterExpression sqlParameterExpression
=> VisitSqlParameter(sqlParameterExpression, allowOptimizedExpansion, out nullable),
SqlUnaryExpression sqlUnaryExpression
=> VisitSqlUnary(sqlUnaryExpression, allowOptimizedExpansion, out nullable),
_ => VisitCustomSqlExpression(sqlExpression, allowOptimizedExpansion, out nullable)
};

if (!preserveNonNullableColumns)
{
Expand Down Expand Up @@ -751,14 +721,14 @@ protected virtual SqlExpression VisitScalarSubquery(

return scalarSubqueryExpression.Update(Visit(scalarSubqueryExpression.Subquery));
}

/// <summary>
/// Visits a <see cref="SqlBinaryExpression"/> and computes its nullability.
/// </summary>
/// <param name="sqlBinaryExpression"> A sql binary expression to visit. </param>
/// <param name="allowOptimizedExpansion"> A bool value indicating if optimized expansion which considers null value as false value is allowed. </param>
/// <param name="nullable"> A bool value indicating whether the sql expression is nullable. </param>
/// <returns> An optimized sql expression. </returns>

protected virtual SqlExpression VisitSqlBinary(
[NotNull] SqlBinaryExpression sqlBinaryExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand Down Expand Up @@ -876,14 +846,14 @@ SqlExpression AddNullConcatenationProtection(SqlExpression argument, RelationalT
? (SqlExpression)_sqlExpressionFactory.Constant(string.Empty, typeMapping)
: _sqlExpressionFactory.Coalesce(argument, _sqlExpressionFactory.Constant(string.Empty, typeMapping));
}

/// <summary>
/// Visits a <see cref="SqlConstantExpression"/> and computes its nullability.
/// </summary>
/// <param name="sqlConstantExpression"> A sql constant expression to visit. </param>
/// <param name="allowOptimizedExpansion"> A bool value indicating if optimized expansion which considers null value as false value is allowed. </param>
/// <param name="nullable"> A bool value indicating whether the sql expression is nullable. </param>
/// <returns> An optimized sql expression. </returns>

protected virtual SqlExpression VisitSqlConstant(
[NotNull] SqlConstantExpression sqlConstantExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand All @@ -893,14 +863,14 @@ protected virtual SqlExpression VisitSqlConstant(

return sqlConstantExpression;
}

/// <summary>
/// Visits a <see cref="SqlFragmentExpression"/> and computes its nullability.
/// </summary>
/// <param name="sqlFragmentExpression"> A sql fragment expression to visit. </param>
/// <param name="allowOptimizedExpansion"> A bool value indicating if optimized expansion which considers null value as false value is allowed. </param>
/// <param name="nullable"> A bool value indicating whether the sql expression is nullable. </param>
/// <returns> An optimized sql expression. </returns>

protected virtual SqlExpression VisitSqlFragment(
[NotNull] SqlFragmentExpression sqlFragmentExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand All @@ -910,14 +880,14 @@ protected virtual SqlExpression VisitSqlFragment(

return sqlFragmentExpression;
}

/// <summary>
/// Visits a <see cref="SqlFunctionExpression"/> and computes its nullability.
/// </summary>
/// <param name="sqlFunctionExpression"> A sql function expression to visit. </param>
/// <param name="allowOptimizedExpansion"> A bool value indicating if optimized expansion which considers null value as false value is allowed. </param>
/// <param name="nullable"> A bool value indicating whether the sql expression is nullable. </param>
/// <returns> An optimized sql expression. </returns>

protected virtual SqlExpression VisitSqlFunction(
[NotNull] SqlFunctionExpression sqlFunctionExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand Down Expand Up @@ -951,14 +921,14 @@ protected virtual SqlExpression VisitSqlFunction(

return sqlFunctionExpression.Update(instance, arguments);
}

/// <summary>
/// Visits a <see cref="SqlParameterExpression"/> and computes its nullability.
/// </summary>
/// <param name="sqlParameterExpression"> A sql parameter expression to visit. </param>
/// <param name="allowOptimizedExpansion"> A bool value indicating if optimized expansion which considers null value as false value is allowed. </param>
/// <param name="nullable"> A bool value indicating whether the sql expression is nullable. </param>
/// <returns> An optimized sql expression. </returns>

protected virtual SqlExpression VisitSqlParameter(
[NotNull] SqlParameterExpression sqlParameterExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand All @@ -970,14 +940,14 @@ protected virtual SqlExpression VisitSqlParameter(
? _sqlExpressionFactory.Constant(null, sqlParameterExpression.TypeMapping)
: (SqlExpression)sqlParameterExpression;
}

/// <summary>
/// Visits a <see cref="SqlUnaryExpression"/> and computes its nullability.
/// </summary>
/// <param name="sqlUnaryExpression"> A sql unary expression to visit. </param>
/// <param name="allowOptimizedExpansion"> A bool value indicating if optimized expansion which considers null value as false value is allowed. </param>
/// <param name="nullable"> A bool value indicating whether the sql expression is nullable. </param>
/// <returns> An optimized sql expression. </returns>

protected virtual SqlExpression VisitSqlUnary(
[NotNull] SqlUnaryExpression sqlUnaryExpression, bool allowOptimizedExpansion, out bool nullable)
{
Expand Down