Skip to content

Commit

Permalink
Query: Encapsulate more logic about pushdown into SelectExpression
Browse files Browse the repository at this point in the history
  • Loading branch information
smitpatel committed Jun 11, 2019
1 parent 6806e50 commit b97c53d
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 159 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,11 @@ public override ShapedQueryExpression TranslateSubquery(Expression expression)

protected override ShapedQueryExpression TranslateAll(ShapedQueryExpression source, LambdaExpression predicate)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}

var translation = TranslateLambdaExpression(source, predicate);

if (translation != null)
{
var selectExpression = (SelectExpression)source.QueryExpression;
selectExpression.ApplyPredicate(_sqlExpressionFactory.Not(translation));
selectExpression.ReplaceProjectionMapping(new Dictionary<ProjectionMember, Expression>());
if (selectExpression.Limit == null
Expand Down Expand Up @@ -112,11 +106,7 @@ protected override ShapedQueryExpression TranslateAny(ShapedQueryExpression sour
protected override ShapedQueryExpression TranslateAverage(ShapedQueryExpression source, LambdaExpression selector, Type resultType)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}
selectExpression.PrepareForAggregate();

if (selector != null)
{
Expand Down Expand Up @@ -191,13 +181,7 @@ protected override ShapedQueryExpression TranslateContains(ShapedQueryExpression
protected override ShapedQueryExpression TranslateCount(ShapedQueryExpression source, LambdaExpression predicate)
{
var selectExpression = (SelectExpression)source.QueryExpression;

if (selectExpression.IsDistinct
|| selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}
selectExpression.PrepareForAggregate();

if (predicate != null)
{
Expand Down Expand Up @@ -306,19 +290,6 @@ protected override ShapedQueryExpression TranslateJoin(
LambdaExpression innerKeySelector,
LambdaExpression resultSelector)
{
// TODO: write a test which has distinct on outer so that we can verify pushdown
var innerSelectExpression = (SelectExpression)inner.QueryExpression;
if (innerSelectExpression.Orderings.Any()
|| innerSelectExpression.Limit != null
|| innerSelectExpression.Offset != null
|| innerSelectExpression.IsDistinct
// TODO: Predicate can be lifted in inner join
|| innerSelectExpression.Predicate != null
|| innerSelectExpression.Tables.Count > 1)
{
innerSelectExpression.PushdownIntoSubQuery();
}

var joinPredicate = CreateJoinPredicate(outer, outerKeySelector, inner, innerKeySelector);
if (joinPredicate != null)
{
Expand All @@ -327,7 +298,7 @@ protected override ShapedQueryExpression TranslateJoin(
resultSelector.Parameters[1].Type);

((SelectExpression)outer.QueryExpression).AddInnerJoin(
innerSelectExpression, joinPredicate, transparentIdentifierType);
(SelectExpression)inner.QueryExpression, joinPredicate, transparentIdentifierType);

return TranslateResultSelectorForJoin(
outer,
Expand All @@ -342,34 +313,15 @@ protected override ShapedQueryExpression TranslateJoin(

protected override ShapedQueryExpression TranslateLeftJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector)
{
var outerSelectExpression = (SelectExpression)outer.QueryExpression;
if (outerSelectExpression.Limit != null
|| outerSelectExpression.Offset != null
|| outerSelectExpression.IsDistinct)
{
outerSelectExpression.PushdownIntoSubQuery();
}

var innerSelectExpression = (SelectExpression)inner.QueryExpression;
if (innerSelectExpression.Orderings.Any()
|| innerSelectExpression.Limit != null
|| innerSelectExpression.Offset != null
|| innerSelectExpression.IsDistinct
|| innerSelectExpression.Predicate != null
|| innerSelectExpression.Tables.Count > 1)
{
innerSelectExpression.PushdownIntoSubQuery();
}

var joinPredicate = CreateJoinPredicate(outer, outerKeySelector, inner, innerKeySelector);
if (joinPredicate != null)
{
var transparentIdentifierType = CreateTransparentIdentifierType(
resultSelector.Parameters[0].Type,
resultSelector.Parameters[1].Type);

outerSelectExpression.AddLeftJoin(
innerSelectExpression, joinPredicate, transparentIdentifierType);
((SelectExpression)outer.QueryExpression).AddLeftJoin(
(SelectExpression)inner.QueryExpression, joinPredicate, transparentIdentifierType);

return TranslateResultSelectorForJoin(
outer,
Expand Down Expand Up @@ -446,13 +398,6 @@ protected override ShapedQueryExpression TranslateLastOrDefault(
}

var selectExpression = (SelectExpression)source.QueryExpression;

if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}

selectExpression.ReverseOrderings();
selectExpression.ApplyLimit(TranslateExpression(Expression.Constant(1)));

Expand All @@ -467,13 +412,7 @@ protected override ShapedQueryExpression TranslateLastOrDefault(
protected override ShapedQueryExpression TranslateLongCount(ShapedQueryExpression source, LambdaExpression predicate)
{
var selectExpression = (SelectExpression)source.QueryExpression;

if (selectExpression.IsDistinct
|| selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}
selectExpression.PrepareForAggregate();

if (predicate != null)
{
Expand All @@ -497,11 +436,7 @@ protected override ShapedQueryExpression TranslateLongCount(ShapedQueryExpressio
protected override ShapedQueryExpression TranslateMax(ShapedQueryExpression source, LambdaExpression selector, Type resultType)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}
selectExpression.PrepareForAggregate();

if (selector != null)
{
Expand All @@ -518,11 +453,7 @@ protected override ShapedQueryExpression TranslateMax(ShapedQueryExpression sour
protected override ShapedQueryExpression TranslateMin(ShapedQueryExpression source, LambdaExpression selector, Type resultType)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}
selectExpression.PrepareForAggregate();

if (selector != null)
{
Expand Down Expand Up @@ -586,19 +517,10 @@ protected override ShapedQueryExpression TranslateOfType(ShapedQueryExpression s

protected override ShapedQueryExpression TranslateOrderBy(ShapedQueryExpression source, LambdaExpression keySelector, bool ascending)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.IsDistinct
|| selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}

var translation = TranslateLambdaExpression(source, keySelector);

if (translation != null)
{
selectExpression.ApplyOrdering(new OrderingExpression(translation, ascending));
((SelectExpression)source.QueryExpression).ApplyOrdering(new OrderingExpression(translation, ascending));

return source;
}
Expand All @@ -618,7 +540,7 @@ protected override ShapedQueryExpression TranslateSelect(ShapedQueryExpression s
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.IsDistinct)
{
selectExpression.PushdownIntoSubQuery();
selectExpression.PushdownIntoSubquery();
}

var newSelectorBody = ReplacingExpressionVisitor.Replace(selector.Parameters.Single(), source.ShaperExpression, selector.Body);
Expand Down Expand Up @@ -655,31 +577,11 @@ protected override ShapedQueryExpression TranslateSelectMany(ShapedQueryExpressi
{
if (Visit(collectionSelectorBody) is ShapedQueryExpression inner)
{
var outerSelectExpression = (SelectExpression)source.QueryExpression;
if (outerSelectExpression.Limit != null
|| outerSelectExpression.Offset != null
|| outerSelectExpression.IsDistinct
|| outerSelectExpression.Predicate != null)
{
outerSelectExpression.PushdownIntoSubQuery();
}

var innerSelectExpression = (SelectExpression)inner.QueryExpression;
if (innerSelectExpression.Orderings.Any()
|| innerSelectExpression.Limit != null
|| innerSelectExpression.Offset != null
|| innerSelectExpression.IsDistinct
|| innerSelectExpression.Predicate != null)
{
innerSelectExpression.PushdownIntoSubQuery();
}

var transparentIdentifierType = CreateTransparentIdentifierType(
resultSelector.Parameters[0].Type,
resultSelector.Parameters[1].Type);

outerSelectExpression.AddCrossJoin(
innerSelectExpression, transparentIdentifierType);
((SelectExpression)source.QueryExpression).AddCrossJoin(
(SelectExpression)inner.QueryExpression, transparentIdentifierType);

return TranslateResultSelectorForJoin(
source,
Expand Down Expand Up @@ -761,11 +663,7 @@ protected override ShapedQueryExpression TranslateSkip(ShapedQueryExpression sou
protected override ShapedQueryExpression TranslateSum(ShapedQueryExpression source, LambdaExpression selector, Type resultType)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}
selectExpression.PrepareForAggregate();

if (selector != null)
{
Expand Down Expand Up @@ -811,7 +709,6 @@ protected override ShapedQueryExpression TranslateTake(ShapedQueryExpression sou
protected override ShapedQueryExpression TranslateThenBy(ShapedQueryExpression source, LambdaExpression keySelector, bool ascending)
{
var translation = TranslateLambdaExpression(source, keySelector);

if (translation != null)
{
((SelectExpression)source.QueryExpression).AppendOrdering(new OrderingExpression(translation, ascending));
Expand All @@ -826,17 +723,10 @@ protected override ShapedQueryExpression TranslateThenBy(ShapedQueryExpression s

protected override ShapedQueryExpression TranslateWhere(ShapedQueryExpression source, LambdaExpression predicate)
{
var selectExpression = (SelectExpression)source.QueryExpression;
if (selectExpression.Limit != null
|| selectExpression.Offset != null)
{
selectExpression.PushdownIntoSubQuery();
}

var translation = TranslateLambdaExpression(source, predicate);
if (translation != null)
{
selectExpression.ApplyPredicate(translation);
((SelectExpression)source.QueryExpression).ApplyPredicate(translation);

return source;
}
Expand Down
Loading

0 comments on commit b97c53d

Please sign in to comment.