Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/ColumnExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,16 @@ public override ColumnExpression Remap(ColumnMap map, Dictionary<Expression, Exp
return new ColumnExpression(Type, newMapping, OuterParameter, DefaultIfEmpty);
}

public Expression BindParameter(ParameterExpression parameter)
{
return BindParameter(parameter, new Dictionary<Expression, Expression>());
}
public ColumnExpression BindParameter(ParameterExpression parameter) =>
BindParameter(parameter, new Dictionary<Expression, Expression>());

public override ColumnExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
return new ColumnExpression(Type, Mapping, parameter, DefaultIfEmpty);
}

public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
{
return new ColumnExpression(Type, Mapping, null, DefaultIfEmpty);
}
public override ColumnExpression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions) =>
new(Type, Mapping, null, DefaultIfEmpty);

public static ColumnExpression Create(Type type, ColNum columnIndex)
{
Expand All @@ -72,4 +68,4 @@ private ColumnExpression(
this.Mapping = mapping;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ internal sealed class ConstructorExpression : ParameterizedExpression

public IReadOnlyList<Expression> ConstructorArguments { get; }

public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
public override ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
GenericExpressionVisitor<IMappedExpression> genericVisitor = new(mapped => mapped.BindParameter(parameter, processedExpressions));
var genericBinder = genericVisitor.Process;
Expand Down
14 changes: 7 additions & 7 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/EntityExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,13 @@ public override EntityExpression Remap(ColumnMap map, Dictionary<Expression, Exp
return result;
}

public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
public override EntityExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var value)) {
return value;
return (EntityExpression) value;
}

var keyExpression = (KeyExpression) Key.BindParameter(parameter, processedExpressions);
var keyExpression = Key.BindParameter(parameter, processedExpressions);
var result = new EntityExpression(PersistentType, keyExpression, parameter, DefaultIfEmpty);
result.IsNullable = IsNullable;
processedExpressions.Add(this, result);
Expand All @@ -96,13 +96,13 @@ public override Expression BindParameter(ParameterExpression parameter, Dictiona
return result;
}

public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
public override EntityExpression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var value)) {
return value;
return (EntityExpression) value;
}

var keyExpression = (KeyExpression) Key.RemoveOuterParameter(processedExpressions);
var keyExpression = Key.RemoveOuterParameter(processedExpressions);
var result = new EntityExpression(PersistentType, keyExpression, null, DefaultIfEmpty);
result.IsNullable = IsNullable;
processedExpressions.Add(this, result);
Expand Down Expand Up @@ -177,7 +177,7 @@ public static EntityExpression Create(EntityFieldExpression entityFieldExpressio
result.SetFields(fields);
return entityFieldExpression.OuterParameter == null
? result
: (EntityExpression) result.BindParameter(
: result.BindParameter(
entityFieldExpression.OuterParameter, new Dictionary<Expression, Expression>());
}

Expand Down
31 changes: 15 additions & 16 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/EntityFieldExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
// Created by: Alexis Kochetov
// Created: 2009.05.06

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using Xtensive.Core;
using Xtensive.Orm.Model;
Expand Down Expand Up @@ -103,14 +101,14 @@ public override EntityFieldExpression BindParameter(
return (EntityFieldExpression)r;
}

var newFields = new PersistentFieldExpression[fields.Count];
int i = 0;
foreach (var field in fields) {
var n = fields.Count;
var newFields = new PersistentFieldExpression[n];
for (int i = 0; i < n; ++i) {
// Do not convert to LINQ. We want to avoid a closure creation here.
newFields[i++] = (PersistentFieldExpression) field.BindParameter(parameter, processedExpressions);
newFields[i] = (PersistentFieldExpression) fields[i].BindParameter(parameter, processedExpressions);
}
var keyExpression = (KeyExpression) Key.BindParameter(parameter, processedExpressions);
var entity = (EntityExpression) Entity?.BindParameter(parameter, processedExpressions);
var keyExpression = Key.BindParameter(parameter, processedExpressions);
var entity = Entity?.BindParameter(parameter, processedExpressions);
var result = new EntityFieldExpression(
PersistentType, Field, newFields, Mapping, keyExpression, entity, parameter, DefaultIfEmpty);
if (Owner == null) {
Expand All @@ -122,20 +120,21 @@ public override EntityFieldExpression BindParameter(
return result;
}

public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
public override EntityFieldExpression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var result)) {
return result;
if (processedExpressions.TryGetValue(this, out var value)) {
return (EntityFieldExpression) value;
}

var newFields = new List<PersistentFieldExpression>(fields.Count);
var newFields = new PersistentFieldExpression[fields.Count];
int i = 0;
foreach (var field in fields) {
// Do not convert to LINQ. We want to avoid a closure creation here.
newFields.Add((PersistentFieldExpression) field.RemoveOuterParameter(processedExpressions));
newFields[i++] = (PersistentFieldExpression) field.RemoveOuterParameter(processedExpressions);
}
var keyExpression = (KeyExpression) Key.RemoveOuterParameter(processedExpressions);
var entity = (EntityExpression) Entity?.RemoveOuterParameter(processedExpressions);
result = new EntityFieldExpression(
var keyExpression = Key.RemoveOuterParameter(processedExpressions);
var entity = Entity?.RemoveOuterParameter(processedExpressions);
var result = new EntityFieldExpression(
PersistentType, Field, newFields, Mapping, keyExpression, entity, null, DefaultIfEmpty);
if (Owner == null) {
return result;
Expand Down
11 changes: 5 additions & 6 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/EntitySetExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,11 @@ public override EntitySetExpression BindParameter(ParameterExpression parameter,
return result;
}

public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
public override EntitySetExpression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
{
Expression result;
if (processedExpressions.TryGetValue(this, out result))
return result;
result = new EntitySetExpression(Field, null, DefaultIfEmpty);
if (processedExpressions.TryGetValue(this, out var value))
return (EntitySetExpression) value;
var result = new EntitySetExpression(Field, null, DefaultIfEmpty);
if (base.Owner==null)
return result;
processedExpressions.Add(this, result);
Expand Down Expand Up @@ -122,4 +121,4 @@ private EntitySetExpression(
{
}
}
}
}
8 changes: 4 additions & 4 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/FieldExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ public override FieldExpression BindParameter(ParameterExpression parameter, Dic
return result;
}

public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
public override FieldExpression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var result)) {
return result;
if (processedExpressions.TryGetValue(this, out var value)) {
return (FieldExpression) value;
}

result = new FieldExpression(ExtendedExpressionType.Field, Field, Mapping, null, DefaultIfEmpty);
var result = new FieldExpression(ExtendedExpressionType.Field, Field, Mapping, null, DefaultIfEmpty);
if (owner == null) {
return result;
}
Expand Down
14 changes: 7 additions & 7 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/FullTextExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ internal sealed class FullTextExpression : ParameterizedExpression

public EntityExpression EntityExpression { get; private set; }

public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
public override ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
Expression result;
if (processedExpressions.TryGetValue(this, out result))
return result;
return (ParameterizedExpression) result;

var entityExpression = (EntityExpression) EntityExpression.BindParameter(parameter, processedExpressions);
var rankExpression = (ColumnExpression) RankExpression.BindParameter(parameter, processedExpressions);
var entityExpression = EntityExpression.BindParameter(parameter, processedExpressions);
var rankExpression = RankExpression.BindParameter(parameter, processedExpressions);
return new FullTextExpression(FullTextIndex, entityExpression, rankExpression, parameter);
}

Expand All @@ -41,8 +41,8 @@ public override Expression RemoveOuterParameter(Dictionary<Expression, Expressio
if (processedExpressions.TryGetValue(this, out result))
return result;

var entityExpression = (EntityExpression) EntityExpression.RemoveOuterParameter(processedExpressions);
var rankExpression = (ColumnExpression) RankExpression.RemoveOuterParameter(processedExpressions);
var entityExpression = EntityExpression.RemoveOuterParameter(processedExpressions);
var rankExpression = RankExpression.RemoveOuterParameter(processedExpressions);
return new FullTextExpression(FullTextIndex, entityExpression, rankExpression, null);
}

Expand Down Expand Up @@ -84,4 +84,4 @@ public FullTextExpression(FullTextIndexInfo fullTextIndex, EntityExpression enti
EntityExpression = entityExpression;
}
}
}
}
14 changes: 6 additions & 8 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/GroupingExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,14 @@ public SelectManyGroupingInfo(ProjectionExpression groupByProjection)

public SelectManyGroupingInfo SelectManyInfo { get; private set; }

public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
public override ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
Expression result;
if (processedExpressions.TryGetValue(this, out result))
return result;
var mappedKey = KeyExpression as IMappedExpression;
if (mappedKey==null)
if (processedExpressions.TryGetValue(this, out var value))
return (ParameterizedExpression) value;
if (!(KeyExpression is IMappedExpression mappedKey))
return this;
var processedKey = mappedKey.BindParameter(parameter, processedExpressions);
result = new GroupingExpression(Type, OuterParameter, DefaultIfEmpty, ProjectionExpression, ApplyParameter, processedKey, SelectManyInfo);
var result = new GroupingExpression(Type, OuterParameter, DefaultIfEmpty, ProjectionExpression, ApplyParameter, processedKey, SelectManyInfo);
processedExpressions.Add(this, result);
return result;
}
Expand Down Expand Up @@ -110,4 +108,4 @@ public GroupingExpression(
KeyExpression = keyExpression;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ namespace Xtensive.Orm.Linq.Expressions
{
internal interface IMappedExpression
{
Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions);
ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions);
Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions);
Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions);
Expression Remap(ColumnMap map, Dictionary<Expression, Expression> processedExpressions);
}
}
}
30 changes: 4 additions & 26 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/KeyExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,6 @@ public override KeyExpression Remap(ColNum offset, Dictionary<Expression, Expres
{
if (TryProcessed<KeyExpression>(processedExpressions, out var value))
return value;
return RemapWithNoCheck(offset, processedExpressions);
}

// Having this code as a separate method helps to avoid closure allocation during Remap call
// in case processedExpressions dictionary already contains a result.
private KeyExpression RemapWithNoCheck(ColNum offset, Dictionary<Expression, Expression> processedExpressions)
{
var newMapping = new Segment<ColNum>((ColNum)(Mapping.Offset + offset), Mapping.Length);

var n = KeyFields.Count;
Expand Down Expand Up @@ -79,14 +72,6 @@ public override KeyExpression BindParameter(
return (KeyExpression)value;
}

return BindParameterWithNoCheck(parameter, processedExpressions);
}

// Having this code as a separate method helps to avoid closure allocation during BindParameter call
// in case processedExpressions dictionary already contains a result.
private KeyExpression BindParameterWithNoCheck(
ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
var n = KeyFields.Count;
var fields = new FieldExpression[n];
for (int i = 0; i < n; ++i) {
Expand All @@ -98,23 +83,16 @@ private KeyExpression BindParameterWithNoCheck(
return result;
}

public override Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
public override KeyExpression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var value)) {
return value;
return (KeyExpression) value;
}

return RemoveOuterParameterWithNoCheck(processedExpressions);
}

// Having this code as a separate method helps to avoid closure allocation during RemoveOuterParameter call
// in case processedExpressions dictionary already contains a result.
private Expression RemoveOuterParameterWithNoCheck(Dictionary<Expression, Expression> processedExpressions)
{
var n = KeyFields.Count;
var fields = new FieldExpression[n];
for (int i = 0; i < n; ++i) {
fields[i] = (FieldExpression) KeyFields[i].RemoveOuterParameter(processedExpressions);
fields[i] = KeyFields[i].RemoveOuterParameter(processedExpressions);
}
var result = new KeyExpression(EntityType, fields, Mapping, UnderlyingProperty, null, DefaultIfEmpty);

Expand Down Expand Up @@ -155,4 +133,4 @@ private KeyExpression(
KeyFields = keyFields;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ public override Expression Remap(ColumnMap map, Dictionary<Expression, Expressio
return result;
}

public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
public override ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var value))
return value;
return (ParameterizedExpression) value;

var result = new LocalCollectionExpression(Type, MemberInfo, expressionAsString);
processedExpressions.Add(this, result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
// Created by: Alexis Kochetov
// Created: 2009.05.18

using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Xtensive.Orm.Linq.Expressions
Expand Down Expand Up @@ -42,7 +40,7 @@ protected bool TryProcessed<T>(Dictionary<Expression, Expression> processedExpre
return false;
}

public abstract Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions);
public abstract ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions);
public abstract Expression RemoveOuterParameter(Dictionary<Expression, Expression> processedExpressions);
public abstract Expression Remap(ColNum offset, Dictionary<Expression, Expression> processedExpressions);
public abstract Expression Remap(ColumnMap map, Dictionary<Expression, Expression> processedExpressions);
Expand All @@ -56,4 +54,4 @@ protected ParameterizedExpression(ExtendedExpressionType expressionType, Type ty
DefaultIfEmpty = defaultIfEmpty;
}
}
}
}
6 changes: 3 additions & 3 deletions Orm/Xtensive.Orm/Orm/Linq/Expressions/StructureExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,10 @@ public override Expression Remap(ColumnMap map, Dictionary<Expression, Expressio
return result;
}

public override Expression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
public override ParameterizedExpression BindParameter(ParameterExpression parameter, Dictionary<Expression, Expression> processedExpressions)
{
if (processedExpressions.TryGetValue(this, out var value)) {
return value;
return (ParameterizedExpression) value;
}

var result = new StructureExpression(PersistentType, Mapping);
Expand Down Expand Up @@ -172,4 +172,4 @@ private StructureExpression(
PersistentType = persistentType;
}
}
}
}
Loading