public void QMWithSelectConcats()
        {
            var q1 = new QMExtractorQueriable <ntup>();
            var q2 = new QMExtractorQueriable <ntup>();
            var r1 = q1.Select(r => r.run).Concat(q2.Select(r => r.run + 1)).Count();

            var qm     = QMExtractorExecutor.LastQM;
            var qmList = ConcatSplitterQueryVisitor.Split(qm)
                         .DumpToConsole();

            Assert.AreEqual(2, qmList.Length);
            CheckForQuery(() => q1.Select(r => r.run).Count(), qmList);
            CheckForQuery(() => q2.Select(r => r.run + 1).Count(), qmList);
        }
        public void QMWithDifferentSourcesAndSelectMany()
        {
            var q1 = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupe>();
            var q2 = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupeArrD>();

            var dude = q2.SelectMany(e => e.myvectorofdouble).Select(i => (int)1).Concat(q1.Select(i => (int)1)).Count();

            var qm     = QMExtractorExecutor.LastQM;
            var qmList = ConcatSplitterQueryVisitor.Split(qm)
                         .DumpToConsole();

            Assert.AreEqual(2, qmList.Length);

            CheckForQuery(() => q1.Select(i => (int)1).Count(), qmList);
            CheckForQuery(() => q2.SelectMany(e => e.myvectorofdouble).Select(i => (int)1).Count(), qmList);

            // Make sure the query providers are correct! Since we don't care about the order.
            var providersUsed1 = ExtractProviders <TTreeQueryExecutorTest.TestNtupe>(qmList);
            var providersUsed2 = ExtractProviders <TTreeQueryExecutorTest.TestNtupeArrD>(qmList);

            foreach (var item in providersUsed2)
            {
                providersUsed1.Add(item);
            }
            Assert.AreEqual(2, providersUsed1.Count);
            Assert.IsTrue(providersUsed1.Contains(q1.Provider));
            Assert.IsTrue(providersUsed1.Contains(q2.Provider));
        }
        public void ConcatOfArrays()
        {
            // We need to fail badly when we have the Concat operator in a select clause.
            // We don't support this sort of thing, and none of the code that enables splitting
            // of queries should affect that.

            var q1 = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupeArrD>();
            var r  = q1.Select(e => e.myvectorofdouble.Concat(e.myvectorofdouble).Count()).Sum();

            var qm     = QMExtractorExecutor.LastQM;
            var qmList = ConcatSplitterQueryVisitor.Split(qm)
                         .DumpToConsole();

            Assert.AreEqual(1, qmList.Length);
        }
        public void QMWithMixedSelecAndConcats()
        {
            // This produces a rather nasty combination: one of the Concat operators ends
            // up in the main from clause, and the other one ends up in one of the result operators
            // of the main query model.
            var q1 = new QMExtractorQueriable <ntup>();
            var q2 = new QMExtractorQueriable <ntup>();
            var q3 = new QMExtractorQueriable <ntup>();

            var r1 = q1
                     .Select(r => r.run)
                     .Concat(q2.Select(r => r.run))
                     .Select(r => r * 2)
                     .Concat(q3.Select(r => r.run))
                     .Count();

            var qm     = QMExtractorExecutor.LastQM;
            var qmList = ConcatSplitterQueryVisitor.Split(qm)
                         .DumpToConsole();

            Assert.AreEqual(3, qmList.Length);
            CheckForQuery(() => q3.Select(r => r.run).Count(), qmList);
            CheckForQuery(() => q1.Select(r => r.run).Select(r => r * 2).Count(), qmList, 2);
        }
        public void QMWithThreeAndSearchOperator()
        {
            var q1  = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupeArrD>();
            var q2  = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupeArrD>();
            var q3  = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupeArrD>();
            var seq = new IQueryable <TTreeQueryExecutorTest.TestNtupeArrD>[] { q1, q2, q3 };

            var all = seq.Skip(1).Aggregate(seq[0], (allc, next) => allc.Concat(next));

            all
            .Select(e => e.myvectorofdouble.OrderByDescending(j => j).First())
            .Where(x => x > 5)
            .Count();

            var qm     = QMExtractorExecutor.LastQM;
            var qmList = ConcatSplitterQueryVisitor.Split(qm)
                         .DumpToConsole();

            Assert.AreEqual(3, qmList.Length);
            CheckForQuery(() => q1.Select(e => e.myvectorofdouble.OrderByDescending(j => j).First()).Where(x => x > 5).Count(), qmList, 3, "e");
        }
        public void WithConcatInSelectMany()
        {
            var q1 = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupe>();
            var q2 = new QMExtractorQueriable <TTreeQueryExecutorTest.TestNtupeArrD>();

            var dude = q2.SelectMany(e => e.myvectorofdouble.Select(i => (int)1).Concat(q1.Select(eb => (int)1))).Count();
            var qm   = QMExtractorExecutor.LastQM;

            var QMList = ConcatSplitterQueryVisitor.Split(qm)
                         .DumpToConsole();

            Assert.AreEqual(2, QMList.Length);
        }