Skip to content

Commit 1a41e7e

Browse files
committed
Unified check whether LeftJoin should be used
1 parent 9aaddbf commit 1a41e7e

File tree

3 files changed

+22
-16
lines changed

3 files changed

+22
-16
lines changed

Orm/Xtensive.Orm/Orm/Linq/Expressions/ItemProjectorExpression.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,9 @@ public ItemProjectorExpression EnsureEntityIsJoined()
145145
rightIndex++;
146146
}
147147
var offset = dataSource.Header.Length;
148-
dataSource = entityExpression.IsNullable
149-
|| (dataSource is JoinProvider dataSourceAsJoin && dataSourceAsJoin.JoinType == JoinType.LeftOuter)
150-
? dataSource.LeftJoin(joinedRs, keyPairs)
151-
: dataSource.Join(joinedRs, keyPairs);
148+
dataSource = entityExpression.IsNullable || dataSource.CheckIfUseLeftJoin()
149+
? dataSource.LeftJoin(joinedRs, keyPairs)
150+
: dataSource.Join(joinedRs, keyPairs);
152151
EntityExpression.Fill(entityExpression, offset);
153152
return entityExpression;
154153
}
@@ -169,10 +168,9 @@ public ItemProjectorExpression EnsureEntityIsJoined()
169168
rightIndex++;
170169
}
171170
var offset = dataSource.Header.Length;
172-
dataSource = entityFieldExpression.IsNullable
173-
|| (dataSource is JoinProvider dataSourceAsJoin && dataSourceAsJoin.JoinType == JoinType.LeftOuter)
174-
? dataSource.LeftJoin(joinedRs, keyPairs)
175-
: dataSource.Join(joinedRs, keyPairs);
171+
dataSource = entityFieldExpression.IsNullable || dataSource.CheckIfUseLeftJoin()
172+
? dataSource.LeftJoin(joinedRs, keyPairs)
173+
: dataSource.Join(joinedRs, keyPairs);
176174
entityFieldExpression.RegisterEntityExpression(offset);
177175
return entityFieldExpression.Entity;
178176
}

Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,7 +1650,8 @@ public void EnsureEntityFieldsAreJoined(EntityExpression entityExpression, ItemP
16501650
.ToArray();
16511651
int offset = itemProjector.DataSource.Header.Length;
16521652
var oldDataSource = itemProjector.DataSource;
1653-
var newDataSource = entityExpression.IsNullable
1653+
1654+
var newDataSource = entityExpression.IsNullable || oldDataSource.CheckIfUseLeftJoin()
16541655
? itemProjector.DataSource.LeftJoin(joinedRs, keyPairs)
16551656
: itemProjector.DataSource.Join(joinedRs, keyPairs);
16561657
itemProjector.DataSource = newDataSource;
@@ -1675,15 +1676,15 @@ private void EnsureEntityReferenceIsJoined(EntityFieldExpression entityFieldExpr
16751676

16761677
var oldDataSource = originalItemProjector.DataSource;
16771678
var offset = oldDataSource.Header.Length;
1678-
var shouldUseLeftJoin = false;
1679+
//var shouldUseLeftJoin = false;
16791680

1680-
var sourceToCheck = (oldDataSource is FilterProvider filterProvider) ? filterProvider.Source : oldDataSource;
1681-
if ((sourceToCheck is ApplyProvider applyProvider && applyProvider.ApplyType == JoinType.LeftOuter) ||
1682-
(sourceToCheck is JoinProvider joinProvider && joinProvider.JoinType == JoinType.LeftOuter)) {
1683-
shouldUseLeftJoin = true;
1684-
}
1681+
//var sourceToCheck = (oldDataSource is FilterProvider filterProvider) ? filterProvider.Source : oldDataSource;
1682+
//if ((sourceToCheck is ApplyProvider applyProvider && applyProvider.ApplyType == JoinType.LeftOuter) ||
1683+
// (sourceToCheck is JoinProvider joinProvider && joinProvider.JoinType == JoinType.LeftOuter)) {
1684+
// shouldUseLeftJoin = true;
1685+
//}
16851686

1686-
var newDataSource = entityFieldExpression.IsNullable || shouldUseLeftJoin
1687+
var newDataSource = entityFieldExpression.IsNullable || oldDataSource.CheckIfUseLeftJoin()
16871688
? oldDataSource.LeftJoin(joinedRs, keyPairs)
16881689
: oldDataSource.Join(joinedRs, keyPairs);
16891690
originalItemProjector.DataSource = newDataSource;

Orm/Xtensive.Orm/Orm/Rse/CompilableProviderExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,12 @@ public static CompilableProvider MakeVoid(this CompilableProvider source)
212212
{
213213
return new VoidProvider(source.Header);
214214
}
215+
216+
internal static bool CheckIfUseLeftJoin(this CompilableProvider provider)
217+
{
218+
var sourceToCheck = (provider is FilterProvider filterProvider) ? filterProvider.Source : provider;
219+
return (sourceToCheck is ApplyProvider applyProvider && applyProvider.ApplyType == JoinType.LeftOuter) ||
220+
(sourceToCheck is JoinProvider joinProvider && joinProvider.JoinType == JoinType.LeftOuter);
221+
}
215222
}
216223
}

0 commit comments

Comments
 (0)