Ejemplo n.º 1
0
		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));
		}
Ejemplo n.º 2
0
 public void SetUp ()
 {
   _mainFromClause = ExpressionHelper.CreateMainFromClause_Int();
   _selectClause = ExpressionHelper.CreateSelectClause();
   _queryModel = new QueryModel (_mainFromClause, _selectClause);
   _querySourceMapping = new QuerySourceMapping();
 }
Ejemplo n.º 3
0
 public void SetUp ()
 {
   _resultOperatorNoDefault = new FirstResultOperator (false);
   _resultOperatorWithDefault = new FirstResultOperator (true);
   _querySourceMapping = new QuerySourceMapping ();
   _cloneContext = new CloneContext (_querySourceMapping);
 }
Ejemplo n.º 4
0
    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));
    }
Ejemplo n.º 9
0
        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;
            }
        }
Ejemplo n.º 10
0
    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)));
    }
Ejemplo n.º 11
0
    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);
    }
Ejemplo n.º 12
0
 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)));
		}
Ejemplo n.º 15
0
 public CloningExpressionVisitor (QuerySourceMapping querySourceMapping)
 {
   _querySourceMapping = querySourceMapping;
 }
Ejemplo n.º 16
0
    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 ();
    }
Ejemplo n.º 17
0
    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);
    }
Ejemplo n.º 19
0
    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));
    }
Ejemplo n.º 20
0
 public CloneContext(QuerySourceMapping querySourceMapping)
 {
     QuerySourceMapping = querySourceMapping;
 }
Ejemplo n.º 21
0
    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));
    }
Ejemplo n.º 22
0
        public CloneContext(QuerySourceMapping querySourceMapping)
        {
            ArgumentUtility.CheckNotNull("querySourceMapping", querySourceMapping);

            QuerySourceMapping = querySourceMapping;
        }
Ejemplo n.º 23
0
    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));
    }
Ejemplo n.º 24
0
    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));
    }
Ejemplo n.º 25
0
    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));
    }
Ejemplo n.º 26
0
        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;
                }
            }
        }
Ejemplo n.º 27
0
    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));
    }
Ejemplo n.º 28
0
    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);
Ejemplo n.º 30
0
    /// <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;
    }
Ejemplo n.º 31
0
 public void SetUp ()
 {
   _querySourceMapping = new QuerySourceMapping ();
   _ordering = ExpressionHelper.CreateOrdering ();
   _cloneContext = new CloneContext (_querySourceMapping);
 }