Skip to content

Commit 0b63ad3

Browse files
committed
ExpressionProcessor prefers Case over Variant in most cases
1 parent a8dbc7d commit 0b63ad3

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

Orm/Xtensive.Orm/Orm/Providers/Expressions/ExpressionProcessor.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,10 @@ protected override SqlExpression VisitConditional(ConditionalExpression expressi
352352
? booleanExpressionConverter.BooleanToInt(check)
353353
: check;
354354
var varCheck = boolCheck as SqlVariant;
355-
if (!PreferCaseOverVariant && !varCheck.IsNullReference())
355+
356+
if (!PreferCaseOverVariant && !varCheck.IsNullReference()) {
356357
return SqlDml.Variant(varCheck.Id, ifFalse, ifTrue);
358+
}
357359
var @case = SqlDml.Case();
358360
if (fixExpressions && IsBooleanExpression(expression)) {
359361
@case[check] = booleanExpressionConverter.BooleanToInt(ifTrue);
@@ -482,8 +484,11 @@ private SqlExpression TryUnwrapEnum(SqlContainer container)
482484

483485
// Constructors
484486

485-
public ExpressionProcessor(
486-
LambdaExpression lambda, HandlerAccessor handlers, SqlCompiler compiler, in bool preferCaseOverVariant, params IReadOnlyList<SqlExpression>[] sourceColumns)
487+
public ExpressionProcessor(LambdaExpression lambda,
488+
HandlerAccessor handlers,
489+
SqlCompiler compiler,
490+
in bool preferCaseOverVariant,
491+
params IReadOnlyList<SqlExpression>[] sourceColumns)
487492
{
488493
ArgumentValidator.EnsureArgumentNotNull(lambda, "lambda");
489494
ArgumentValidator.EnsureArgumentNotNull(handlers, "handlers");

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.Helpers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ protected SqlProvider CreateProvider(SqlSelect statement, IEnumerable<QueryParam
6060

6161
protected virtual string ProcessAliasedName(string name) => name;
6262

63-
protected Pair<SqlExpression, IEnumerable<QueryParameterBinding>> ProcessExpression(LambdaExpression le,
63+
protected Pair<SqlExpression, IEnumerable<QueryParameterBinding>> ProcessExpression(LambdaExpression le, in bool preferCaseOverVariant,
6464
params IReadOnlyList<SqlExpression>[] sourceColumns)
6565
{
66-
var processor = new ExpressionProcessor(le, Handlers, this, (Owner ?? RootProvider).Type == ProviderType.Sort, sourceColumns);
66+
var processor = new ExpressionProcessor(le, Handlers, this, preferCaseOverVariant, sourceColumns);
6767
var result = new Pair<SqlExpression, IEnumerable<QueryParameterBinding>>(
6868
processor.Translate(), processor.GetBindings());
6969
return result;

Orm/Xtensive.Orm/Orm/Providers/SqlCompiler.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ protected override SqlProvider VisitCalculate(CalculateProvider provider)
111111
var sourceColumns = ExtractColumnExpressions(sqlSelect);
112112
var allBindings = EnumerableUtils<QueryParameterBinding>.Empty;
113113
foreach (var column in provider.CalculatedColumns) {
114-
var result = ProcessExpression(column.Expression, sourceColumns);
114+
var result = ProcessExpression(column.Expression, true, sourceColumns);
115115
var predicate = result.First;
116116
var bindings = result.Second;
117117
if (column.Type.StripNullable()==typeof (bool))
@@ -150,7 +150,7 @@ protected override SqlProvider VisitFilter(FilterProvider provider)
150150
var query = ExtractSqlSelect(provider, source);
151151

152152
var sourceColumns = ExtractColumnExpressions(query);
153-
var result = ProcessExpression(provider.Predicate, sourceColumns);
153+
var result = ProcessExpression(provider.Predicate, true, sourceColumns);
154154
var predicate = result.First;
155155
var bindings = result.Second;
156156

@@ -254,7 +254,7 @@ protected override SqlProvider VisitPredicateJoin(PredicateJoinProvider provider
254254

255255
var joinType = provider.JoinType==JoinType.LeftOuter ? SqlJoinType.LeftOuterJoin : SqlJoinType.InnerJoin;
256256

257-
var result = ProcessExpression(provider.Predicate, leftExpressions, rightExpressions);
257+
var result = ProcessExpression(provider.Predicate, false, leftExpressions, rightExpressions);
258258
var joinExpression = result.First;
259259
var bindings = result.Second;
260260

0 commit comments

Comments
 (0)