Skip to content

Commit

Permalink
Perf: Skip visiting table inside ColumnExpression
Browse files Browse the repository at this point in the history
  • Loading branch information
smitpatel committed Sep 6, 2019
1 parent 4206793 commit 9e8d237
Show file tree
Hide file tree
Showing 16 changed files with 776 additions and 782 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,9 @@ private SqlConstantExpression VisitSqlConstantExpression(SqlConstantExpression s

private ColumnExpression VisitColumnExpression(ColumnExpression columnExpression)
{
var newTable = (TableExpressionBase)Visit(columnExpression.Table);
_isNullable = columnExpression.IsNullable;

return columnExpression.Update(newTable);
return columnExpression;
}

private SqlParameterExpression VisitSqlParameterExpression(SqlParameterExpression sqlParameterExpression)
Expand Down
2 changes: 1 addition & 1 deletion src/EFCore.Relational/Query/QuerySqlGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private bool IsNonComposedSetOperation(SelectExpression selectExpression)
&& selectExpression.Tables[0] is SetOperationBase setOperation
&& selectExpression.Projection.Count == setOperation.Source1.Projection.Count
&& selectExpression.Projection.Select((pe, index) => pe.Expression is ColumnExpression column
&& column.Table.Equals(setOperation)
&& string.Equals(column.Table.Alias, setOperation.Alias, StringComparison.OrdinalIgnoreCase)
&& string.Equals(column.Name, setOperation.Source1.Projection[index].Alias, StringComparison.OrdinalIgnoreCase))
.All(e => e);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,7 @@ private ColumnExpression(string name, TableExpressionBase table, Type type, Rela
public TableExpressionBase Table { get; }
public bool IsNullable { get; }

protected override Expression VisitChildren(ExpressionVisitor visitor)
=> Update((TableExpressionBase)visitor.Visit(Table));

public virtual ColumnExpression Update(TableExpressionBase table)
=> table != Table
? new ColumnExpression(Name, table, Type, TypeMapping, IsNullable)
: this;
protected override Expression VisitChildren(ExpressionVisitor visitor) => this;

public ColumnExpression MakeNullable()
=> new ColumnExpression(Name, Table, Type.MakeNullable(), TypeMapping, true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,8 @@ public bool IsNonComposedFromSql()
&& Orderings.Count == 0
&& Tables.Count == 1
&& Tables[0] is FromSqlExpression fromSql
&& Projection.All(pe => pe.Expression is ColumnExpression column ? ReferenceEquals(column.Table, fromSql) : false);
&& Projection.All(pe => pe.Expression is ColumnExpression column
&& string.Equals(fromSql.Alias, column.Table.Alias, StringComparison.OrdinalIgnoreCase));

public void ApplyProjection()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,27 +234,27 @@ public override async Task Result_operator_nav_prop_reference_optional_via_Defau

AssertSql(
@"SELECT SUM(CASE
WHEN [t].[Id] IS NULL THEN 0
ELSE [t].[Level1_Required_Id]
WHEN [t1].[Id] IS NULL THEN 0
ELSE [t1].[Level1_Required_Id]
END)
FROM [Level1] AS [l1]
FROM [Level1] AS [l]
LEFT JOIN (
SELECT [l2].[Id], [l2].[Date], [l2].[Name], [t0].[Id] AS [Id0], [t0].[OneToOne_Required_PK_Date], [t0].[Level1_Optional_Id], [t0].[Level1_Required_Id], [t0].[Level2_Name], [t0].[OneToMany_Optional_Inverse2Id], [t0].[OneToMany_Required_Inverse2Id], [t0].[OneToOne_Optional_PK_Inverse2Id]
FROM [Level1] AS [l2]
SELECT [l0].[Id], [l0].[Date], [l0].[Name], [t].[Id] AS [Id0], [t].[OneToOne_Required_PK_Date], [t].[Level1_Optional_Id], [t].[Level1_Required_Id], [t].[Level2_Name], [t].[OneToMany_Optional_Inverse2Id], [t].[OneToMany_Required_Inverse2Id], [t].[OneToOne_Optional_PK_Inverse2Id]
FROM [Level1] AS [l0]
LEFT JOIN (
SELECT [l3].[Id], [l3].[OneToOne_Required_PK_Date], [l3].[Level1_Optional_Id], [l3].[Level1_Required_Id], [l3].[Level2_Name], [l3].[OneToMany_Optional_Inverse2Id], [l3].[OneToMany_Required_Inverse2Id], [l3].[OneToOne_Optional_PK_Inverse2Id], [l4].[Id] AS [Id0]
FROM [Level1] AS [l3]
INNER JOIN [Level1] AS [l4] ON [l3].[Id] = [l4].[Id]
WHERE [l3].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l3].[Level1_Required_Id] IS NOT NULL AND [l3].[OneToOne_Required_PK_Date] IS NOT NULL)
) AS [t0] ON [l2].[Id] = [t0].[Id]
WHERE [t0].[Id] IS NOT NULL
) AS [t1] ON [l1].[Id] = [t1].[Level1_Optional_Id]
SELECT [l1].[Id], [l1].[OneToOne_Required_PK_Date], [l1].[Level1_Optional_Id], [l1].[Level1_Required_Id], [l1].[Level2_Name], [l1].[OneToMany_Optional_Inverse2Id], [l1].[OneToMany_Required_Inverse2Id], [l1].[OneToOne_Optional_PK_Inverse2Id], [l2].[Id] AS [Id0]
FROM [Level1] AS [l1]
INNER JOIN [Level1] AS [l2] ON [l1].[Id] = [l2].[Id]
WHERE [l1].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l1].[Level1_Required_Id] IS NOT NULL AND [l1].[OneToOne_Required_PK_Date] IS NOT NULL)
) AS [t] ON [l0].[Id] = [t].[Id]
WHERE [t].[Id] IS NOT NULL
) AS [t0] ON [l].[Id] = [t0].[Level1_Optional_Id]
LEFT JOIN (
SELECT [l].[Id], [l].[OneToOne_Required_PK_Date], [l].[Level1_Optional_Id], [l].[Level1_Required_Id], [l].[Level2_Name], [l].[OneToMany_Optional_Inverse2Id], [l].[OneToMany_Required_Inverse2Id], [l].[OneToOne_Optional_PK_Inverse2Id], [l0].[Id] AS [Id0]
FROM [Level1] AS [l]
INNER JOIN [Level1] AS [l0] ON [l].[Id] = [l0].[Id]
WHERE [l].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l].[Level1_Required_Id] IS NOT NULL AND [l].[OneToOne_Required_PK_Date] IS NOT NULL)
) AS [t] ON [t1].[Id] = [t].[Id]");
SELECT [l3].[Id], [l3].[OneToOne_Required_PK_Date], [l3].[Level1_Optional_Id], [l3].[Level1_Required_Id], [l3].[Level2_Name], [l3].[OneToMany_Optional_Inverse2Id], [l3].[OneToMany_Required_Inverse2Id], [l3].[OneToOne_Optional_PK_Inverse2Id], [l4].[Id] AS [Id0]
FROM [Level1] AS [l3]
INNER JOIN [Level1] AS [l4] ON [l3].[Id] = [l4].[Id]
WHERE [l3].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l3].[Level1_Required_Id] IS NOT NULL AND [l3].[OneToOne_Required_PK_Date] IS NOT NULL)
) AS [t1] ON [t0].[Id] = [t1].[Id]");
}


Expand All @@ -263,14 +263,14 @@ public override async Task SelectMany_with_Include1(bool isAsync)
await base.SelectMany_with_Include1(isAsync);

AssertSql(
@"SELECT [t].[Id], [t].[OneToOne_Required_PK_Date], [t].[Level1_Optional_Id], [t].[Level1_Required_Id], [t].[Level2_Name], [t].[OneToMany_Optional_Inverse2Id], [t].[OneToMany_Required_Inverse2Id], [t].[OneToOne_Optional_PK_Inverse2Id], [l1].[Id], [t].[Id0], [t1].[Id], [t1].[Level2_Optional_Id], [t1].[Level2_Required_Id], [t1].[Level3_Name], [t1].[OneToMany_Optional_Inverse3Id], [t1].[OneToMany_Required_Inverse3Id], [t1].[OneToOne_Optional_PK_Inverse3Id], [t1].[Id0], [t1].[Id00]
FROM [Level1] AS [l1]
@"SELECT [t].[Id], [t].[OneToOne_Required_PK_Date], [t].[Level1_Optional_Id], [t].[Level1_Required_Id], [t].[Level2_Name], [t].[OneToMany_Optional_Inverse2Id], [t].[OneToMany_Required_Inverse2Id], [t].[OneToOne_Optional_PK_Inverse2Id], [l].[Id], [t].[Id0], [t1].[Id], [t1].[Level2_Optional_Id], [t1].[Level2_Required_Id], [t1].[Level3_Name], [t1].[OneToMany_Optional_Inverse3Id], [t1].[OneToMany_Required_Inverse3Id], [t1].[OneToOne_Optional_PK_Inverse3Id], [t1].[Id0], [t1].[Id00]
FROM [Level1] AS [l]
INNER JOIN (
SELECT [l].[Id], [l].[OneToOne_Required_PK_Date], [l].[Level1_Optional_Id], [l].[Level1_Required_Id], [l].[Level2_Name], [l].[OneToMany_Optional_Inverse2Id], [l].[OneToMany_Required_Inverse2Id], [l].[OneToOne_Optional_PK_Inverse2Id], [l0].[Id] AS [Id0]
FROM [Level1] AS [l]
INNER JOIN [Level1] AS [l0] ON [l].[Id] = [l0].[Id]
WHERE [l].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l].[Level1_Required_Id] IS NOT NULL AND [l].[OneToOne_Required_PK_Date] IS NOT NULL)
) AS [t] ON [l1].[Id] = [t].[OneToMany_Optional_Inverse2Id]
SELECT [l0].[Id], [l0].[OneToOne_Required_PK_Date], [l0].[Level1_Optional_Id], [l0].[Level1_Required_Id], [l0].[Level2_Name], [l0].[OneToMany_Optional_Inverse2Id], [l0].[OneToMany_Required_Inverse2Id], [l0].[OneToOne_Optional_PK_Inverse2Id], [l1].[Id] AS [Id0]
FROM [Level1] AS [l0]
INNER JOIN [Level1] AS [l1] ON [l0].[Id] = [l1].[Id]
WHERE [l0].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l0].[Level1_Required_Id] IS NOT NULL AND [l0].[OneToOne_Required_PK_Date] IS NOT NULL)
) AS [t] ON [l].[Id] = [t].[OneToMany_Optional_Inverse2Id]
LEFT JOIN (
SELECT [l2].[Id], [l2].[Level2_Optional_Id], [l2].[Level2_Required_Id], [l2].[Level3_Name], [l2].[OneToMany_Optional_Inverse3Id], [l2].[OneToMany_Required_Inverse3Id], [l2].[OneToOne_Optional_PK_Inverse3Id], [t0].[Id] AS [Id0], [t0].[Id0] AS [Id00]
FROM [Level1] AS [l2]
Expand All @@ -282,7 +282,7 @@ WHERE [l3].[OneToMany_Required_Inverse2Id] IS NOT NULL AND ([l3].[Level1_Require
) AS [t0] ON [l2].[Id] = [t0].[Id]
WHERE [l2].[OneToMany_Required_Inverse3Id] IS NOT NULL AND [l2].[Level2_Required_Id] IS NOT NULL
) AS [t1] ON [t].[Id] = [t1].[OneToMany_Optional_Inverse3Id]
ORDER BY [l1].[Id], [t].[Id], [t].[Id0], [t1].[Id], [t1].[Id0], [t1].[Id00]");
ORDER BY [l].[Id], [t].[Id], [t].[Id0], [t1].[Id], [t1].[Id0], [t1].[Id00]");
}

private void AssertSql(params string[] expected)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,18 +168,18 @@ public override void Project_reference_that_itself_has_query_filter_with_another
@__ef_filter___quantity_0='50'
SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate]
FROM [Order Details] AS [o0]
FROM [Order Details] AS [o]
INNER JOIN (
SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate], [t].[CustomerID] AS [CustomerID0], [t].[Address], [t].[City], [t].[CompanyName], [t].[ContactName], [t].[ContactTitle], [t].[Country], [t].[Fax], [t].[Phone], [t].[PostalCode], [t].[Region]
FROM [Orders] AS [o]
SELECT [o0].[OrderID], [o0].[CustomerID], [o0].[EmployeeID], [o0].[OrderDate], [t].[CustomerID] AS [CustomerID0], [t].[Address], [t].[City], [t].[CompanyName], [t].[ContactName], [t].[ContactTitle], [t].[Country], [t].[Fax], [t].[Phone], [t].[PostalCode], [t].[Region]
FROM [Orders] AS [o0]
LEFT JOIN (
SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region]
FROM [Customers] AS [c]
WHERE ((@__ef_filter__TenantPrefix_1 = N'') AND @__ef_filter__TenantPrefix_1 IS NOT NULL) OR ([c].[CompanyName] IS NOT NULL AND (@__ef_filter__TenantPrefix_1 IS NOT NULL AND (([c].[CompanyName] LIKE [c].[CompanyName] + N'%') AND (((LEFT([c].[CompanyName], LEN(@__ef_filter__TenantPrefix_1)) = @__ef_filter__TenantPrefix_1) AND (LEFT([c].[CompanyName], LEN(@__ef_filter__TenantPrefix_1)) IS NOT NULL AND @__ef_filter__TenantPrefix_1 IS NOT NULL)) OR (LEFT([c].[CompanyName], LEN(@__ef_filter__TenantPrefix_1)) IS NULL AND @__ef_filter__TenantPrefix_1 IS NULL)))))
) AS [t] ON [o].[CustomerID] = [t].[CustomerID]
) AS [t] ON [o0].[CustomerID] = [t].[CustomerID]
WHERE [t].[CompanyName] IS NOT NULL
) AS [t0] ON [o0].[OrderID] = [t0].[OrderID]
WHERE [o0].[Quantity] > @__ef_filter___quantity_0");
) AS [t0] ON [o].[OrderID] = [t0].[OrderID]
WHERE [o].[Quantity] > @__ef_filter___quantity_0");
}

public override void Navs_query()
Expand Down
Loading

0 comments on commit 9e8d237

Please sign in to comment.