Skip to content

Commit

Permalink
Query: Dry code for generating column alias
Browse files Browse the repository at this point in the history
Added AddToProjection method which de-dupe columns and assign unique alias if subquery
Also added ability to assign alias based on member name in anonymous type projection
TableExpressionBase.Alias is either null or non-empty string to make processing it easier
  • Loading branch information
smitpatel committed Jun 11, 2019
1 parent b15966f commit 02b8acf
Show file tree
Hide file tree
Showing 16 changed files with 150 additions and 157 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@ public class EntityProjectionExpression : Expression
private readonly IDictionary<IProperty, ColumnExpression> _propertyExpressionsCache
= new Dictionary<IProperty, ColumnExpression>();
private readonly TableExpressionBase _innerTable;
private readonly bool _nullable;

public EntityProjectionExpression(IEntityType entityType, TableExpressionBase innerTable, bool nullable)
{
EntityType = entityType.RootType();
_innerTable = innerTable;
Nullable = nullable;
_nullable = nullable;
}

public EntityProjectionExpression(IEntityType entityType, IDictionary<IProperty, ColumnExpression> propertyExpressions)
Expand All @@ -35,7 +36,7 @@ protected override Expression VisitChildren(ExpressionVisitor visitor)
var table = (TableExpressionBase)visitor.Visit(_innerTable);

return table != _innerTable
? new EntityProjectionExpression(EntityType, table, Nullable)
? new EntityProjectionExpression(EntityType, table, _nullable)
: this;
}
else
Expand Down Expand Up @@ -75,7 +76,6 @@ public EntityProjectionExpression MakeNullable()
}

public IEntityType EntityType { get; }
public bool Nullable { get; }
public override ExpressionType NodeType => ExpressionType.Extension;
public override Type Type => EntityType.ClrType;

Expand All @@ -88,7 +88,7 @@ public ColumnExpression GetProperty(IProperty property)

if (!_propertyExpressionsCache.TryGetValue(property, out var expression))
{
expression = new ColumnExpression(property, _innerTable, Nullable);
expression = new ColumnExpression(property, _innerTable, _nullable);
_propertyExpressionsCache[property] = expression;
}

Expand Down
6 changes: 3 additions & 3 deletions src/EFCore.Relational/Query/Pipeline/QuerySqlGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ protected override Expression VisitSelect(SelectExpression selectExpression)
{
IDisposable subQueryIndent = null;

if (!string.IsNullOrEmpty(selectExpression.Alias))
if (selectExpression.Alias != null)
{
_relationalCommandBuilder.AppendLine("(");
subQueryIndent = _relationalCommandBuilder.Indent();
Expand Down Expand Up @@ -136,7 +136,7 @@ protected override Expression VisitSelect(SelectExpression selectExpression)

GenerateLimitOffset(selectExpression);

if (!string.IsNullOrEmpty(selectExpression.Alias))
if (selectExpression.Alias != null)
{
subQueryIndent.Dispose();

Expand All @@ -155,7 +155,7 @@ protected override Expression VisitProjection(ProjectionExpression projectionExp
&& !(projectionExpression.Expression is ColumnExpression column
&& string.Equals(column.Name, projectionExpression.Alias)))
{
_relationalCommandBuilder.Append(" AS " + projectionExpression.Alias);
_relationalCommandBuilder.Append(" AS " + _sqlGenerationHelper.DelimitIdentifier(projectionExpression.Alias));
}

return projectionExpression;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public Expression Translate(SelectExpression selectExpression, Expression expres
_projectionMapping.Clear();
}

_selectExpression.ReplaceProjection(_projectionMapping);
_selectExpression.ReplaceProjectionMapping(_projectionMapping);
_selectExpression = null;
_projectionMembers.Clear();
_projectionMapping.Clear();
Expand Down Expand Up @@ -110,7 +110,7 @@ public override Expression Visit(Expression expression)
}
else
{
return _selectExpression.AddToProjection(translation, expression.Type);
return new ProjectionBindingExpression(_selectExpression, _selectExpression.AddToProjection(translation), expression.Type);
}
}
else
Expand Down Expand Up @@ -147,12 +147,16 @@ protected override Expression VisitExtension(Expression extensionExpression)

if (_clientEval)
{
return entityShaperExpression.Update(_selectExpression.AddToProjection(entityShaperExpression.ValueBufferExpression));
var entityProjection = (EntityProjectionExpression)_selectExpression.GetMappedProjection(
entityShaperExpression.ValueBufferExpression.ProjectionMember);

return entityShaperExpression.Update(
new ProjectionBindingExpression(_selectExpression, _selectExpression.AddToProjection(entityProjection)));
}
else
{
_projectionMapping[_projectionMembers.Peek()]
= _selectExpression.GetProjectionExpression(
= _selectExpression.GetMappedProjection(
entityShaperExpression.ValueBufferExpression.ProjectionMember);

return entityShaperExpression.Update(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ protected override Expression VisitExtension(Expression extensionExpression)
private object GetProjectionIndex(ProjectionBindingExpression projectionBindingExpression)
{
return projectionBindingExpression.ProjectionMember != null
? ((ConstantExpression)_selectExpression.GetProjectionExpression(projectionBindingExpression.ProjectionMember)).Value
? ((ConstantExpression)_selectExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember)).Value
: (projectionBindingExpression.Index != null
? (object)projectionBindingExpression.Index
: projectionBindingExpression.IndexMap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ protected override ShapedQueryExpression TranslateAll(ShapedQueryExpression sour
if (translation != null)
{
selectExpression.ApplyPredicate(_sqlExpressionFactory.Not(translation));
selectExpression.ReplaceProjection(new Dictionary<ProjectionMember, Expression>());
selectExpression.ReplaceProjectionMapping(new Dictionary<ProjectionMember, Expression>());
if (selectExpression.Limit == null
&& selectExpression.Offset == null)
{
Expand All @@ -95,7 +95,7 @@ protected override ShapedQueryExpression TranslateAny(ShapedQueryExpression sour
}

var selectExpression = (SelectExpression)source.QueryExpression;
selectExpression.ReplaceProjection(new Dictionary<ProjectionMember, Expression>());
selectExpression.ReplaceProjectionMapping(new Dictionary<ProjectionMember, Expression>());
if (selectExpression.Limit == null
&& selectExpression.Offset == null)
{
Expand Down Expand Up @@ -123,7 +123,7 @@ protected override ShapedQueryExpression TranslateAverage(ShapedQueryExpression
source = TranslateSelect(source, selector);
}

var projection = (SqlExpression)selectExpression.GetProjectionExpression(new ProjectionMember());
var projection = (SqlExpression)selectExpression.GetMappedProjection(new ProjectionMember());

var inputType = projection.Type.UnwrapNullableType();
if (inputType == typeof(int)
Expand Down Expand Up @@ -213,7 +213,7 @@ protected override ShapedQueryExpression TranslateCount(ShapedQueryExpression so
};

selectExpression.ClearOrdering();
selectExpression.ReplaceProjection(_projectionMapping);
selectExpression.ReplaceProjectionMapping(_projectionMapping);
source.ShaperExpression = new ProjectionBindingExpression(source.QueryExpression, new ProjectionMember(), typeof(int));

return source;
Expand Down Expand Up @@ -488,7 +488,7 @@ protected override ShapedQueryExpression TranslateLongCount(ShapedQueryExpressio
};

selectExpression.ClearOrdering();
selectExpression.ReplaceProjection(_projectionMapping);
selectExpression.ReplaceProjectionMapping(_projectionMapping);
source.ShaperExpression = new ProjectionBindingExpression(source.QueryExpression, new ProjectionMember(), typeof(long));

return source;
Expand All @@ -508,7 +508,7 @@ protected override ShapedQueryExpression TranslateMax(ShapedQueryExpression sour
source = TranslateSelect(source, selector);
}

var projection = (SqlExpression)selectExpression.GetProjectionExpression(new ProjectionMember());
var projection = (SqlExpression)selectExpression.GetMappedProjection(new ProjectionMember());

projection = _sqlExpressionFactory.Function("MAX", new[] { projection }, resultType, projection.TypeMapping);

Expand All @@ -529,7 +529,7 @@ protected override ShapedQueryExpression TranslateMin(ShapedQueryExpression sour
source = TranslateSelect(source, selector);
}

var projection = (SqlExpression)selectExpression.GetProjectionExpression(new ProjectionMember());
var projection = (SqlExpression)selectExpression.GetMappedProjection(new ProjectionMember());

projection = _sqlExpressionFactory.Function("MIN", new[] { projection }, resultType, projection.TypeMapping);

Expand Down Expand Up @@ -773,7 +773,7 @@ protected override ShapedQueryExpression TranslateSum(ShapedQueryExpression sour
}

var serverOutputType = resultType.UnwrapNullableType();
var projection = (SqlExpression)selectExpression.GetProjectionExpression(new ProjectionMember());
var projection = (SqlExpression)selectExpression.GetMappedProjection(new ProjectionMember());

if (serverOutputType == typeof(float))
{
Expand Down Expand Up @@ -866,7 +866,7 @@ private ShapedQueryExpression AggregateResultShaper(
ShapedQueryExpression source, Expression projection, bool throwOnNullResult, Type resultType)
{
var selectExpression = (SelectExpression)source.QueryExpression;
selectExpression.ReplaceProjection(
selectExpression.ReplaceProjectionMapping(
new Dictionary<ProjectionMember, Expression>
{
{ new ProjectionMember(), projection }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ protected override Expression VisitExtension(Expression extensionExpression)
{
var selectExpression = (SelectExpression)projectionBindingExpression.QueryExpression;

return selectExpression.GetProjectionExpression(projectionBindingExpression.ProjectionMember);
return selectExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember);
}

if (extensionExpression is NullConditionalExpression nullConditionalExpression)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ protected override Expression VisitExtension(Expression extensionExpression)
{
case TableExpressionBase tableExpressionBase
when !_visitedTableExpressionBases.Contains(tableExpressionBase)
&& !string.IsNullOrEmpty(tableExpressionBase.Alias):
&& tableExpressionBase.Alias != null:
tableExpressionBase.Alias = GenerateUniqueAlias(tableExpressionBase.Alias);
_visitedTableExpressionBases.Add(tableExpressionBase);
return tableExpressionBase;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ protected override Expression VisitExtension(Expression extensionExpression)
private Expression GenerateKey(ProjectionBindingExpression projectionBindingExpression)
{
return projectionBindingExpression.ProjectionMember != null
? _selectExpression.GetProjectionExpression(projectionBindingExpression.ProjectionMember)
? _selectExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember)
: projectionBindingExpression;
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/EFCore.Relational/Query/Pipeline/SqlExpressionFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ public SelectExpression Select(SqlExpression projection)

if (projection != null)
{
selectExpression.ReplaceProjection(new Dictionary<ProjectionMember, Expression>
selectExpression.ReplaceProjectionMapping(new Dictionary<ProjectionMember, Expression>
{
{ new ProjectionMember(), projection }
});
Expand Down Expand Up @@ -550,7 +550,7 @@ private void AddDiscriminator(SelectExpression selectExpression, IEntityType ent
return;
}

var discriminatorColumn = ((EntityProjectionExpression)selectExpression.GetProjectionExpression(new ProjectionMember()))
var discriminatorColumn = ((EntityProjectionExpression)selectExpression.GetMappedProjection(new ProjectionMember()))
.GetProperty(concreteEntityType.GetDiscriminatorProperty());

selectExpression.ApplyPredicate(
Expand All @@ -559,7 +559,7 @@ private void AddDiscriminator(SelectExpression selectExpression, IEntityType ent
}
else
{
var discriminatorColumn = ((EntityProjectionExpression)selectExpression.GetProjectionExpression(new ProjectionMember()))
var discriminatorColumn = ((EntityProjectionExpression)selectExpression.GetMappedProjection(new ProjectionMember()))
.GetProperty(concreteEntityTypes[0].GetDiscriminatorProperty());

selectExpression.ApplyPredicate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Diagnostics;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Query.Internal;
using Microsoft.EntityFrameworkCore.Storage;

namespace Microsoft.EntityFrameworkCore.Relational.Query.Pipeline.SqlExpressions
{
[DebuggerDisplay("{DebuggerDisplay(),nq}")]
public class ColumnExpression : SqlExpression
{
internal ColumnExpression(IProperty property, TableExpressionBase table, bool nullable)
Expand Down Expand Up @@ -74,5 +76,7 @@ public override int GetHashCode()
return hashCode;
}
}

private string DebuggerDisplay() => $"{Table.Alias}.{Name}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Microsoft.EntityFrameworkCore.Relational.Query.Pipeline.SqlExpressions
public abstract class JoinExpressionBase : TableExpressionBase
{
protected JoinExpressionBase(TableExpressionBase table)
: base("")
: base(null)
{
Table = table;
}
Expand Down
Loading

0 comments on commit 02b8acf

Please sign in to comment.