private static Expression HandleConcat(
     EntityQueryModelVisitor entityQueryModelVisitor,
     ConcatResultOperator concatResultOperator)
 => HandleSetOperation(
     entityQueryModelVisitor,
     concatResultOperator.Source2,
     entityQueryModelVisitor.LinqOperatorProvider.Concat);
Example #2
0
        public void GetOutputDataInfo_AssignableSource2()
        {
            var resultOperator = new ConcatResultOperator("i", typeof(object), Expression.Constant(new[] { "string" }));

            var cookExpression = Expression.Constant(null, typeof(Cook));
            var input          = new StreamedSequenceInfo(typeof(Cook[]), cookExpression);

            var result = resultOperator.GetOutputDataInfo(input);

            Assert.That(result, Is.InstanceOf(typeof(StreamedSequenceInfo)));
            Assert.That(result.DataType, Is.SameAs(typeof(IQueryable <object>)));
        }
    public void GetConstantSource2_NoConstantExpression ()
    {
      var resultOperator = new ConcatResultOperator ("i", typeof (string), Expression.Parameter (typeof (IEnumerable<string>), "ss"));
      Assert.That (
          () => resultOperator.GetConstantSource2(),
          Throws.ArgumentException
              .With.Message.EqualTo (
#if !NET_3_5
                  "The source2 expression ('ss') is no ConstantExpression, it is a TypedParameterExpression.\r\nParameter name: expression"
#else
                  "The source2 expression ('ss') is no ConstantExpression, it is a ParameterExpression.\r\nParameter name: expression"
#endif
                  ));
    }
Example #4
0
        public void TransformExpressions()
        {
            var oldExpression  = ExpressionHelper.CreateExpression();
            var newExpression  = ExpressionHelper.CreateExpression();
            var resultOperator = new ConcatResultOperator("i", typeof(int), oldExpression);

            resultOperator.TransformExpressions(ex =>
            {
                Assert.That(ex, Is.SameAs(oldExpression));
                return(newExpression);
            });

            Assert.That(resultOperator.Source2, Is.SameAs(newExpression));
        }
        public void GetConstantSource2_NoConstantExpression()
        {
            var resultOperator = new ConcatResultOperator("i", typeof(string), Expression.Parameter(typeof(IEnumerable <string>), "ss"));

            Assert.That(
                () => resultOperator.GetConstantSource2(),
                Throws.ArgumentException
                .With.Message.EqualTo(
#if !NET_3_5
                    "The source2 expression ('ss') is no ConstantExpression, it is a TypedParameterExpression.\r\nParameter name: expression"
#else
                    "The source2 expression ('ss') is no ConstantExpression, it is a ParameterExpression.\r\nParameter name: expression"
#endif
                    ));
        }
            /// <summary>
            /// Given a query model, look at all the result operators for Concat operators, and split everything up
            /// into separate query models.
            /// </summary>
            /// <param name="queryModel"></param>
            /// <returns></returns>
            private static IEnumerable <QueryModel> SplitQMByConcatResultOperator(QueryModel queryModel)
            {
                // If there are no concat result operators in the list, then we just bail quickly.
                // This is to specifically avoid the Clone operation unless we actually need it.
                if (!queryModel.ResultOperators.Where(r => r is ConcatResultOperator).Any())
                {
                    return(new QueryModel[] { queryModel });
                }

                // Now, look for concat operators in the list. Pop them out when we find them.
                ConcatResultOperator ro = null;
                var qm  = queryModel.Clone();
                var lst = new List <QueryModel>();

                while ((ro = qm.ResultOperators.Reverse().Where(r => r is ConcatResultOperator).Cast <ConcatResultOperator>().FirstOrDefault()) != null)
                {
                    // We are going to make q QueryModel here that uses the second source in the Concat operator.
                    // This means everything that comes before this query can be ignored - and we want this "source" to
                    // become the query from clause. Note this also means messing with the "select" clause to make sure it
                    // isn't doing anything special (select clause comes before result operators, semantically).

                    QueryModel newQM = NewQMFromOldWithLifting(ro.Source2, qm.MainFromClause.ItemType, qm.MainFromClause.ItemName);

                    var cc = new CloneContext(new QuerySourceMapping());

                    var indexToRemoveTo = qm.ResultOperators.IndexOf(ro);
                    for (int i = indexToRemoveTo + 1; i < qm.ResultOperators.Count; i++)
                    {
                        newQM.ResultOperators.Add(qm.ResultOperators[i].Clone(cc));
                    }
                    lst.Add(newQM.Flatten());

                    // Ok - we've taken one branch. We need to remove it from the list of things to look at, and work on the
                    // next one.
                    qm.ResultOperators.Remove(ro);
                }

                // The QueryModel left over needs to be added to the list.
                lst.Add(qm.Flatten());
                return(lst);
            }
 public void SetUp ()
 {
   _source2 = Expression.Constant (new[] { 2 });
   _resultOperator = new ConcatResultOperator ("itemName", typeof (int), _source2);
 }
    public void TransformExpressions ()
    {
      var oldExpression = ExpressionHelper.CreateExpression ();
      var newExpression = ExpressionHelper.CreateExpression ();
      var resultOperator = new ConcatResultOperator ("i", typeof (int), oldExpression);

      resultOperator.TransformExpressions (ex =>
      {
        Assert.That (ex, Is.SameAs (oldExpression));
        return newExpression;
      });

      Assert.That (resultOperator.Source2, Is.SameAs (newExpression));
    }
    public void GetOutputDataInfo_AssignableSource2 ()
    {
      var resultOperator = new ConcatResultOperator ("i", typeof (object), Expression.Constant (new[] { "string" }));

      var cookExpression = Expression.Constant (null, typeof (Cook));
      var input = new StreamedSequenceInfo (typeof (Cook[]), cookExpression);

      var result = resultOperator.GetOutputDataInfo (input);

      Assert.That (result, Is.InstanceOf (typeof (StreamedSequenceInfo)));
      Assert.That (result.DataType, Is.SameAs (typeof (IQueryable<object>)));
    }
Example #10
0
        public void GetConstantSource2_NoConstantExpression()
        {
            var resultOperator = new ConcatResultOperator("i", typeof(string), Expression.Parameter(typeof(IEnumerable <string>), "ss"));

            resultOperator.GetConstantSource2();
        }
Example #11
0
 public void SetUp()
 {
     _source2        = Expression.Constant(new[] { 2 });
     _resultOperator = new ConcatResultOperator("itemName", typeof(int), _source2);
 }
 private static Expression HandleConcat(
     EntityQueryModelVisitor entityQueryModelVisitor,
     ConcatResultOperator concatResultOperator)
     => HandleSetOperation(
         entityQueryModelVisitor,
         concatResultOperator.Source2,
         entityQueryModelVisitor.LinqOperatorProvider.Concat);