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 () { _mainFromClause = ExpressionHelper.CreateMainFromClause_Int(); _selectClause = ExpressionHelper.CreateSelectClause(); _queryModel = new QueryModel (_mainFromClause, _selectClause); _querySourceMapping = new QuerySourceMapping(); }
public void SetUp () { _resultOperatorNoDefault = new FirstResultOperator (false); _resultOperatorWithDefault = new FirstResultOperator (true); _querySourceMapping = new QuerySourceMapping (); _cloneContext = new CloneContext (_querySourceMapping); }
public void Clone () { var clonedClauseMapping = new QuerySourceMapping (); var cloneContext = new CloneContext (clonedClauseMapping); var clone = _resultOperator.Clone (cloneContext); Assert.That (clone, Is.InstanceOf (typeof (MinResultOperator))); }
public void SetUp () { _oldFromClause = ExpressionHelper.CreateMainFromClause_Int (); _newFromClause = ExpressionHelper.CreateMainFromClause_Int (); _querySourceMapping = new QuerySourceMapping (); _querySourceMapping.AddMapping (_oldFromClause, new QuerySourceReferenceExpression (_newFromClause)); }
public void Clone () { var clonedClauseMapping = new QuerySourceMapping (); var cloneContext = new CloneContext (clonedClauseMapping); var clone = _resultOperator.Clone (cloneContext); Assert.That (clone, Is.InstanceOf (typeof (ExceptResultOperator))); Assert.That (((ExceptResultOperator) clone).Source2, Is.SameAs (_source2)); }
public void Clone () { var clonedClauseMapping = new QuerySourceMapping (); var cloneContext = new CloneContext (clonedClauseMapping); var clone = _resultOperator.Clone (cloneContext); Assert.That (clone, Is.InstanceOf (typeof (ContainsResultOperator))); Assert.That (((ContainsResultOperator) clone).Item, Is.SameAs (_resultOperator.Item)); }
public void Clone () { var clonedClauseMapping = new QuerySourceMapping (); var cloneContext = new CloneContext (clonedClauseMapping); var clone = _resultOperatorWithDefaultValue.Clone (cloneContext); Assert.That (clone, Is.InstanceOf (typeof (DefaultIfEmptyResultOperator))); Assert.That (((DefaultIfEmptyResultOperator) clone).OptionalDefaultValue, Is.SameAs (_resultOperatorWithDefaultValue.OptionalDefaultValue)); }
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; } }
public void Clone () { var clonedClauseMapping = new QuerySourceMapping (); var cloneContext = new CloneContext (clonedClauseMapping); var clone = _resultOperator.Clone (cloneContext); Assert.That (clone, Is.InstanceOf (typeof (ConcatResultOperator))); Assert.That (((ConcatResultOperator) clone).ItemName, Is.EqualTo ("itemName")); Assert.That (((ConcatResultOperator) clone).Source2, Is.SameAs (_source2)); Assert.That (((ConcatResultOperator) clone).ItemType, Is.SameAs (typeof (int))); }
public void SetUp () { _mapping = new QuerySourceMapping (); _clause1 = ExpressionHelper.CreateMainFromClause_Int (); _clause2 = ExpressionHelper.CreateMainFromClause_Int (); _clause3 = ExpressionHelper.CreateMainFromClause_Int (); _querySourceReferenceExpression1 = new QuerySourceReferenceExpression (_clause1); _querySourceReferenceExpression2 = new QuerySourceReferenceExpression (_clause2); _querySourceReferenceExpression3 = new QuerySourceReferenceExpression (_clause3); }
public SparqlQueryBuilder(EntityContext context) { _context = context; _graphPatternBuilder =new StringBuilder(); _querySourceMapping = new QuerySourceMapping(); _variableValueMapping = new Dictionary<string, string>(); _ordering = new List<SparqlOrdering>(); _anonymousMembersMap = new List<Tuple<string, string>>(); _membersMap = new List<Tuple<MemberInfo, string>>(); _groupByExpressions = new List<string>(); _constructorArgs= new List<string>(); AllTriples = new List<TripleInfo>(); }
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))); }
public CloningExpressionVisitor (QuerySourceMapping querySourceMapping) { _querySourceMapping = querySourceMapping; }
public void Clone_ResultOperators_PassesMapping () { var querySourceMapping = new QuerySourceMapping(); var resultOperatorMock = MockRepository.GenerateMock<ResultOperatorBase> (); _queryModel.ResultOperators.Add (resultOperatorMock); resultOperatorMock .Expect (mock => mock.Clone (Arg<CloneContext>.Matches (cc => cc.QuerySourceMapping == querySourceMapping))) .Return (ExpressionHelper.CreateResultOperator ()); resultOperatorMock.Replay (); _queryModel.Clone (querySourceMapping); resultOperatorMock.VerifyAllExpectations (); }
public CloneContext (QuerySourceMapping querySourceMapping) { ArgumentUtility.CheckNotNull ("querySourceMapping", querySourceMapping); QuerySourceMapping = querySourceMapping; }
public void Clone_WithoutResultSelector () { var clonedClauseMapping = new QuerySourceMapping (); var cloneContext = new CloneContext (clonedClauseMapping); var clone = _resultOperatorWithoutResultSelector.Clone (cloneContext); Assert.That (clone, Is.InstanceOf (typeof (AggregateFromSeedResultOperator))); Assert.That (((AggregateFromSeedResultOperator) clone).Seed, Is.SameAs (_resultOperatorWithResultSelector.Seed)); Assert.That (((AggregateFromSeedResultOperator) clone).Func, Is.SameAs (_resultOperatorWithResultSelector.Func)); Assert.That (((AggregateFromSeedResultOperator) clone).OptionalResultSelector, Is.Null); }
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 CloneContext(QuerySourceMapping querySourceMapping) { QuerySourceMapping = querySourceMapping; }
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)); }
public CloneContext(QuerySourceMapping querySourceMapping) { ArgumentUtility.CheckNotNull("querySourceMapping", querySourceMapping); QuerySourceMapping = querySourceMapping; }
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_HasCloneForMainFromClause_PassesMapping () { var querySourceMapping = new QuerySourceMapping(); var clone = _queryModel.Clone (querySourceMapping); Assert.That ( ((QuerySourceReferenceExpression) querySourceMapping.GetExpression (_queryModel.MainFromClause)).ReferencedQuerySource, Is.SameAs (clone.MainFromClause)); }
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_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)); }
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)); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual ExpressionVisitor Create( QuerySourceMapping querySourceMapping, EntityQueryModelVisitor queryModelVisitor, bool inProjection) => new MemberAccessBindingExpressionVisitor(querySourceMapping, queryModelVisitor, inProjection);
/// <summary> /// Clones this <see cref="QueryModel"/>, returning a new <see cref="QueryModel"/> equivalent to this instance, but with its clauses being /// clones of this instance's clauses. Any <see cref="QuerySourceReferenceExpression"/> in the cloned clauses that points back to another clause /// in this <see cref="QueryModel"/> (including its subqueries) is adjusted to point to the respective clones in the cloned /// <see cref="QueryModel"/>. Any subquery nested in the <see cref="QueryModel"/> is also cloned. /// </summary> /// <param name="querySourceMapping">The <see cref="QuerySourceMapping"/> defining how to adjust instances of /// <see cref="QuerySourceReferenceExpression"/> in the cloned <see cref="QueryModel"/>. If there is a <see cref="QuerySourceReferenceExpression"/> /// that points out of the <see cref="QueryModel"/> being cloned, specify its replacement via this parameter. At the end of the cloning process, /// this object maps all the clauses in this original <see cref="QueryModel"/> to the clones created in the process. /// </param> public QueryModel Clone (QuerySourceMapping querySourceMapping) { ArgumentUtility.CheckNotNull ("querySourceMapping", querySourceMapping); var cloneContext = new CloneContext (querySourceMapping); var queryModelBuilder = new QueryModelBuilder(); queryModelBuilder.AddClause (MainFromClause.Clone (cloneContext)); foreach (var bodyClause in BodyClauses) queryModelBuilder.AddClause (bodyClause.Clone (cloneContext)); queryModelBuilder.AddClause (SelectClause.Clone (cloneContext)); foreach (var resultOperator in ResultOperators) { var resultOperatorClone = resultOperator.Clone (cloneContext); queryModelBuilder.AddResultOperator (resultOperatorClone); } var clone = queryModelBuilder.Build (); clone.TransformExpressions (ex => CloningExpressionTreeVisitor.AdjustExpressionAfterCloning (ex, cloneContext.QuerySourceMapping)); clone.ResultTypeOverride = ResultTypeOverride; return clone; }
public void SetUp () { _querySourceMapping = new QuerySourceMapping (); _ordering = ExpressionHelper.CreateOrdering (); _cloneContext = new CloneContext (_querySourceMapping); }