public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index) { var subQuery = fromClause.FromExpression as SubQueryExpression; if (subQuery == null) return; var subQueryModel = subQuery.QueryModel; if (!IsLeftJoin(subQueryModel)) return; var mainFromClause = subQueryModel.MainFromClause; var restrictions = subQueryModel.BodyClauses .OfType<WhereClause>() .Select(w => new NhWithClause(w.Predicate)); var join = new NhJoinClause(mainFromClause.ItemName, mainFromClause.ItemType, mainFromClause.FromExpression, restrictions); var innerSelectorMapping = new QuerySourceMapping(); innerSelectorMapping.AddMapping(fromClause, subQueryModel.SelectClause.Selector); queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerSelectorMapping, false)); queryModel.BodyClauses.RemoveAt(index); queryModel.BodyClauses.Insert(index, @join); InsertBodyClauses(subQueryModel.BodyClauses.Where(b => !(b is WhereClause)), queryModel, index + 1); var innerBodyClauseMapping = new QuerySourceMapping(); innerBodyClauseMapping.AddMapping(mainFromClause, new QuerySourceReferenceExpression(@join)); queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false)); }
public void SetUp () { _oldFromClause = ExpressionHelper.CreateMainFromClause_Int (); _newFromClause = ExpressionHelper.CreateMainFromClause_Int (); _querySourceMapping = new QuerySourceMapping (); _querySourceMapping.AddMapping (_oldFromClause, new QuerySourceReferenceExpression (_newFromClause)); }
protected override void FlattenSubQuery( [NotNull] SubQueryExpression subQueryExpression, [NotNull] FromClauseBase fromClause, [NotNull] QueryModel queryModel, int destinationIndex) { Check.NotNull(subQueryExpression, nameof(subQueryExpression)); Check.NotNull(fromClause, nameof(fromClause)); Check.NotNull(queryModel, nameof(queryModel)); var subQueryModel = subQueryExpression.QueryModel; VisitQueryModel(subQueryModel); if (subQueryModel.ResultOperators .Any(ro => !(ro is OfTypeResultOperator)) || subQueryModel.BodyClauses.Any(bc => bc is OrderByClause)) { return; } var innerMainFromClause = subQueryExpression.QueryModel.MainFromClause; CopyFromClauseData(innerMainFromClause, fromClause); var innerSelectorMapping = new QuerySourceMapping(); innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector); queryModel.TransformExpressions( ex => ReferenceReplacingExpressionTreeVisitor .ReplaceClauseReferences(ex, innerSelectorMapping, false)); InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex); var innerBodyClauseMapping = new QuerySourceMapping(); innerBodyClauseMapping .AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause)); queryModel.TransformExpressions(ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false)); foreach (var resultOperator in subQueryModel.ResultOperators.Reverse()) { queryModel.ResultOperators.Insert(0, resultOperator); } foreach (var queryAnnotation in _queryAnnotations .Where(qa => qa.QuerySource == subQueryExpression.QueryModel.MainFromClause)) { queryAnnotation.QuerySource = fromClause; } }
private static ClientSideSelect CreateClientSideSelect(Expression expression, QueryModel queryModel) { // TODO - don't like calling GetGenericArguments here... var parameter = Expression.Parameter(expression.Type.GetGenericArguments()[0], "inputParameter"); var mapping = new QuerySourceMapping(); mapping.AddMapping(queryModel.MainFromClause, parameter); var body = ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(queryModel.SelectClause.Selector, mapping, false); var lambda = Expression.Lambda(body, parameter); return new ClientSideSelect(lambda); }
private static void FlattenSubQuery(SubQueryExpression subQueryExpression, FromClauseBase fromClause, QueryModel queryModel, int destinationIndex) { if (!CheckFlattenable(subQueryExpression.QueryModel)) return; var mainFromClause = subQueryExpression.QueryModel.MainFromClause; CopyFromClauseData(mainFromClause, fromClause); var innerSelectorMapping = new QuerySourceMapping(); innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector); queryModel.TransformExpressions((ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerSelectorMapping, false))); InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex); CopyResultOperators(subQueryExpression.QueryModel.ResultOperators, queryModel); var innerBodyClauseMapping = new QuerySourceMapping(); innerBodyClauseMapping.AddMapping(mainFromClause, new QuerySourceReferenceExpression(fromClause)); queryModel.TransformExpressions((ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false))); }
protected virtual void FlattenSubQuery ( SubQueryExpression subQueryExpression, FromClauseBase fromClause, QueryModel queryModel, int destinationIndex) { ArgumentUtility.CheckNotNull ("subQueryExpression", subQueryExpression); ArgumentUtility.CheckNotNull ("fromClause", fromClause); ArgumentUtility.CheckNotNull ("queryModel", queryModel); CheckFlattenable (subQueryExpression.QueryModel); var innerMainFromClause = subQueryExpression.QueryModel.MainFromClause; CopyFromClauseData (innerMainFromClause, fromClause); var innerSelectorMapping = new QuerySourceMapping(); innerSelectorMapping.AddMapping (fromClause, subQueryExpression.QueryModel.SelectClause.Selector); queryModel.TransformExpressions (ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences (ex, innerSelectorMapping, false)); InsertBodyClauses (subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex); var innerBodyClauseMapping = new QuerySourceMapping(); innerBodyClauseMapping.AddMapping (innerMainFromClause, new QuerySourceReferenceExpression (fromClause)); queryModel.TransformExpressions (ex => ReferenceReplacingExpressionTreeVisitor.ReplaceClauseReferences (ex, innerBodyClauseMapping, false)); }
protected override void FlattenSubQuery( [NotNull] SubQueryExpression subQueryExpression, [NotNull] IFromClause fromClause, [NotNull] QueryModel queryModel, int destinationIndex) { var subQueryModel = subQueryExpression.QueryModel; VisitQueryModel(subQueryModel); if ((subQueryModel.ResultOperators .All(ro => ro is CastResultOperator) && !subQueryModel.BodyClauses.Any(bc => bc is OrderByClause)) || (queryModel.IsIdentityQuery() && !queryModel.ResultOperators.Any())) { string itemName; var innerMainFromClause = subQueryExpression.QueryModel.MainFromClause; var isGeneratedNameOuter = fromClause.HasGeneratedItemName(); if (innerMainFromClause.HasGeneratedItemName() && !isGeneratedNameOuter) { itemName = fromClause.ItemName; } else { itemName = innerMainFromClause.ItemName; } var fromClauseData = new FromClauseData( itemName, innerMainFromClause.ItemType, innerMainFromClause.FromExpression); fromClause.CopyFromSource(fromClauseData); var innerSelectorMapping = new QuerySourceMapping(); innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector); queryModel.TransformExpressions( ex => ReferenceReplacingExpressionVisitor .ReplaceClauseReferences(ex, innerSelectorMapping, false)); InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex); foreach (var resultOperator in subQueryModel.ResultOperators.Reverse()) { queryModel.ResultOperators.Insert(0, resultOperator); } var innerBodyClauseMapping = new QuerySourceMapping(); innerBodyClauseMapping .AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause)); queryModel.TransformExpressions( ex => ReferenceReplacingExpressionVisitor .ReplaceClauseReferences(ex, innerBodyClauseMapping, false)); foreach (var queryAnnotation in _queryAnnotations .Where(qa => qa.QuerySource == subQueryExpression.QueryModel.MainFromClause)) { queryAnnotation.QuerySource = fromClause; queryAnnotation.QueryModel = queryModel; } } }
public void Clone_VisitsExtensionExpression_AndChildren () { var referencedClause = ExpressionHelper.CreateMainFromClause_Int(); var expression = new ReducibleExtensionExpression (new QuerySourceReferenceExpression (referencedClause)); var querySourceMapping = new QuerySourceMapping(); var newReferenceExpression = new QuerySourceReferenceExpression (ExpressionHelper.CreateMainFromClause_Int()); querySourceMapping.AddMapping (referencedClause, newReferenceExpression); var queryModel = new QueryModel (_mainFromClause, new SelectClause (expression)); var clone = queryModel.Clone (querySourceMapping); Assert.That (((ReducibleExtensionExpression) clone.SelectClause.Selector), Is.Not.SameAs (expression)); Assert.That ( ((QuerySourceReferenceExpression) ((ReducibleExtensionExpression) clone.SelectClause.Selector).Expression), Is.SameAs (newReferenceExpression)); }
public void Clone_ReplacesSubQueryExpression_WithCorrectCloneContext () { var subQueryModel = ExpressionHelper.CreateQueryModel<Cook>(); var referencedClause = ExpressionHelper.CreateMainFromClause_Int(); subQueryModel.MainFromClause.FromExpression = new QuerySourceReferenceExpression (referencedClause); var expression = new SubQueryExpression (subQueryModel); var querySourceMapping = new QuerySourceMapping(); var newReferenceExpression = new QuerySourceReferenceExpression (ExpressionHelper.CreateMainFromClause_Int()); querySourceMapping.AddMapping (referencedClause, newReferenceExpression); var queryModel = new QueryModel (_mainFromClause, new SelectClause (expression)); var clone = queryModel.Clone (querySourceMapping); var clonedSubQueryModel = ((SubQueryExpression) clone.SelectClause.Selector).QueryModel; Assert.That (clonedSubQueryModel, Is.Not.SameAs (subQueryModel)); Assert.That (clonedSubQueryModel.MainFromClause.FromExpression, Is.SameAs (newReferenceExpression)); }
public void Clone_HasCloneForBodyClauses_TransformExpressions () { var bodyClause = ExpressionHelper.CreateWhereClause(); var oldReferencedClause = ExpressionHelper.CreateMainFromClause_Int(); bodyClause.Predicate = new QuerySourceReferenceExpression (oldReferencedClause); _queryModel.BodyClauses.Add (bodyClause); var querySourceMapping = new QuerySourceMapping(); var newReferenceExpression = new QuerySourceReferenceExpression (ExpressionHelper.CreateMainFromClause_Int()); querySourceMapping.AddMapping (oldReferencedClause, newReferenceExpression); var clone = _queryModel.Clone (querySourceMapping); Assert.That (((WhereClause) clone.BodyClauses[0]).Predicate, Is.SameAs (newReferenceExpression)); }
public void Clone_HasCloneForSelectClause_TransformExpressions () { var oldReferencedClause = ExpressionHelper.CreateMainFromClause_Int(); _queryModel.SelectClause.Selector = new QuerySourceReferenceExpression (oldReferencedClause); var querySourceMapping = new QuerySourceMapping(); var newReferenceExpression = new QuerySourceReferenceExpression (ExpressionHelper.CreateMainFromClause_Int()); querySourceMapping.AddMapping (oldReferencedClause, newReferenceExpression); var clone = _queryModel.Clone (querySourceMapping); Assert.That (clone.SelectClause.Selector, Is.SameAs (newReferenceExpression)); }
public void Clone_ReplacesNestedQuerySourceReferenceExpression () { var originalExpression = new QuerySourceReferenceExpression (ExpressionHelper.CreateMainFromClause_Int()); _queryModel.BodyClauses.Add (new AdditionalFromClause ("inner", typeof (int), Expression.Not (originalExpression))); var querySourceMapping = new QuerySourceMapping(); var newExpression = new QuerySourceReferenceExpression (ExpressionHelper.CreateMainFromClause_Int()); querySourceMapping.AddMapping (originalExpression.ReferencedQuerySource, newExpression); var clone = _queryModel.Clone (querySourceMapping); Assert.That ( ((UnaryExpression) ((AdditionalFromClause) clone.BodyClauses[0]).FromExpression).Operand, Is.SameAs (newExpression)); }