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); }