public async Task Group_SeriesTests()
        {
            var source = Helpers.CreateSortedTestData();

            //add a row to test highest since.
            source.Add(new object[] { "value11", 5, 10.1, "2015/01/11", 1 });
            source.Reset();

            var aggregates = new List <TransformFunction>();

            var mavg = Functions.GetFunction("dexih.functions.BuiltIn.SeriesFunctions", "MovingAverage").GetTransformFunction();

            mavg.Inputs = new Parameter[] {
                new Parameter("Series", ETypeCode.DateTime, true, null, new TableColumn("DateColumn", ETypeCode.DateTime)),
                new Parameter("Value", ETypeCode.Double, true, null, new TableColumn("IntColumn", ETypeCode.Double)),
                new Parameter("PreCount", ETypeCode.Int32, value: 3),
                new Parameter("PostCount", ETypeCode.Int32, value: 3)
            };
            mavg.TargetColumn = new TableColumn("MAvg", ETypeCode.Double);
            aggregates.Add(mavg);

            var highest = Functions.GetFunction("dexih.functions.BuiltIn.SeriesFunctions", "HighestSince").GetTransformFunction();

            highest.Inputs = new Parameter[] {
                new Parameter("Series", ETypeCode.DateTime, true, null, new TableColumn("DateColumn", ETypeCode.DateTime)),
                new Parameter("Value", ETypeCode.Double, true, null, new TableColumn("IntColumn", ETypeCode.Int32))
            };
            highest.Outputs = new Parameter[] {
                new Parameter("Value", ETypeCode.Double, true, null, new TableColumn("HighestValue", ETypeCode.Double))
            };
            highest.TargetColumn = new TableColumn("Highest", ETypeCode.Double);
            aggregates.Add(highest);

            var groupColumns = new List <ColumnPair>()
            {
                new ColumnPair(new TableColumn("DateColumn", ETypeCode.DateTime), new TableColumn("DateColumn", ETypeCode.DateTime))
            };

            var transformGroup = new TransformGroup(source, null, aggregates, null, true);

            Assert.Equal(8, transformGroup.FieldCount);

            var counter = 0;

            double[] mAvgExpectedValues    = { 2.5, 3, 3.5, 4, 5, 6, 7, 7.14, 7.5, 7.8, 8 };
            string[] highestExpectedValues = { "2015/01/01", "2015/01/02", "2015/01/03", "2015/01/04", "2015/01/05", "2015/01/06", "2015/01/07", "2015/01/08", "2015/01/09", "2015/01/10", "2015/01/10" };
            while (await transformGroup.ReadAsync() == true)
            {
                Assert.Equal((double)mAvgExpectedValues[counter], Math.Round((double)transformGroup["MAvg"], 2));
                Assert.Equal(highestExpectedValues[counter], ((DateTime)transformGroup["Highest"]).ToString("yyyy/MM/dd"));
                counter = counter + 1;
            }
            Assert.Equal(11, counter);
        }
        public async Task Group_Aggregates_Functions()
        {
            var source = Helpers.CreateUnSortedTestData();

            var aggregates = new List <TransformFunction>();

            var intParam    = new Parameter[] { new Parameter("IntColumn", ETypeCode.Double, true, null, new TableColumn("IntColumn", ETypeCode.Int32)) };
            var stringParam = new Parameter[] { new Parameter("StringColumn", ETypeCode.String, true, null, new TableColumn("StringColumn")) };
            var concatParam = new Parameter[] { new Parameter("Seperator", ETypeCode.String, false, ","), new Parameter("StringColumn", ETypeCode.String, true, null, new TableColumn("StringColumn")) };

            var sum = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "Sum").GetTransformFunction();

            sum.Inputs       = intParam;
            sum.TargetColumn = new TableColumn("Sum", ETypeCode.Double);
            var average = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "Average").GetTransformFunction();

            average.Inputs       = intParam;
            average.TargetColumn = new TableColumn("Average", ETypeCode.Double);
            var min = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "Min").GetTransformFunction();

            min.Inputs       = intParam;
            min.TargetColumn = new TableColumn("Minimum", ETypeCode.Double);
            var max = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "Max").GetTransformFunction();

            max.Inputs       = intParam;
            max.TargetColumn = new TableColumn("Maximum", ETypeCode.Double);
            var count = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "Count").GetTransformFunction();

            count.TargetColumn = new TableColumn("Count", ETypeCode.Double);
            var countdistinct = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "CountDistinct").GetTransformFunction();

            countdistinct.Inputs       = stringParam;
            countdistinct.TargetColumn = new TableColumn("CountDistinct", ETypeCode.Double);
            var concat = Functions.GetFunction("dexih.functions.BuiltIn.AggregateFunctions", "ConcatAgg").GetTransformFunction();

            concat.Inputs       = concatParam;
            concat.TargetColumn = new TableColumn("Concat", ETypeCode.String);

            aggregates.Add(sum);
            aggregates.Add(average);
            aggregates.Add(min);
            aggregates.Add(max);
            aggregates.Add(count);
            aggregates.Add(countdistinct);
            aggregates.Add(concat);

            var transformGroup = new TransformGroup(source, null, aggregates, null, false);

            Assert.Equal(7, transformGroup.FieldCount);

            var counter = 0;

            while (await transformGroup.ReadAsync() == true)
            {
                counter = counter + 1;
                Assert.Equal((double)55, transformGroup["Sum"]);
                Assert.Equal((double)5.5, transformGroup["Average"]);
                Assert.Equal((double)1, transformGroup["Minimum"]);
                Assert.Equal((double)10, transformGroup["Maximum"]);
                Assert.Equal(10, transformGroup["Count"]);
                Assert.Equal(10, transformGroup["CountDistinct"]);
            }
            Assert.Equal(1, counter);

            //add a row to use for grouping.
            source.Add(new object[] { "value10", 10, 10.1, "2015/01/10", 10, "Even" });

            var groupColumns = new List <ColumnPair>()
            {
                new ColumnPair(new TableColumn("StringColumn"), new TableColumn("StringColumn"))
            };

            transformGroup = new TransformGroup(source, groupColumns, aggregates, null, false);

            counter = 0;
            while (await transformGroup.ReadAsync() == true)
            {
                counter = counter + 1;
                if (counter < 10)
                {
                    Assert.Equal("value0" + counter.ToString(), transformGroup["StringColumn"]);
                    Assert.Equal((double)counter, transformGroup["Sum"]);
                    Assert.Equal((double)counter, transformGroup["Average"]);
                    Assert.Equal((double)counter, transformGroup["Minimum"]);
                    Assert.Equal((double)counter, transformGroup["Maximum"]);
                    Assert.Equal(1, transformGroup["Count"]);
                    Assert.Equal(1, transformGroup["CountDistinct"]);
                }
                else
                {
                    Assert.Equal((double)20, transformGroup["Sum"]);
                    Assert.Equal((double)10, transformGroup["Average"]);
                    Assert.Equal((double)10, transformGroup["Minimum"]);
                    Assert.Equal((double)10, transformGroup["Maximum"]);
                    Assert.Equal(2, transformGroup["Count"]);
                    Assert.Equal(1, transformGroup["CountDistinct"]);
                }
            }
            Assert.Equal(10, counter);
        }
        public async Task Group_Aggregates_AggregatePairs()
        {
            var source = Helpers.CreateUnSortedTestData();

            var aggregates = new List <AggregatePair>();

            var intColumn = new TableColumn("IntColumn", ETypeCode.Int32);

            aggregates.Add(new AggregatePair(intColumn, new TableColumn("Sum", ETypeCode.Double), functions.Query.SelectColumn.EAggregate.Sum));
            aggregates.Add(new AggregatePair(intColumn, new TableColumn("Average", ETypeCode.Double), functions.Query.SelectColumn.EAggregate.Average));
            aggregates.Add(new AggregatePair(intColumn, new TableColumn("Minimum", ETypeCode.Double), functions.Query.SelectColumn.EAggregate.Min));
            aggregates.Add(new AggregatePair(intColumn, new TableColumn("Maximum", ETypeCode.Double), functions.Query.SelectColumn.EAggregate.Max));
            aggregates.Add(new AggregatePair(intColumn, new TableColumn("Count", ETypeCode.Double), functions.Query.SelectColumn.EAggregate.Count));

            var transformGroup = new TransformGroup(source, null, null, aggregates, false);

            Assert.Equal(5, transformGroup.FieldCount);

            var counter = 0;

            while (await transformGroup.ReadAsync() == true)
            {
                counter = counter + 1;
                Assert.Equal(55, transformGroup["Sum"]);
                Assert.Equal(5.5, transformGroup["Average"]);
                Assert.Equal(1, transformGroup["Minimum"]);
                Assert.Equal(10, transformGroup["Maximum"]);
                Assert.Equal(10L, transformGroup["Count"]);
            }
            Assert.Equal(1, counter);

            //add a row to use for grouping.
            source.Add(new object[] { "value10", 10, 10.1, "2015/01/10", 10, "Even" });

            var groupColumns = new List <ColumnPair>()
            {
                new ColumnPair(new TableColumn("StringColumn"), new TableColumn("StringColumn"))
            };

            transformGroup = new TransformGroup(source, groupColumns, null, aggregates, false);

            counter = 0;
            while (await transformGroup.ReadAsync() == true)
            {
                counter = counter + 1;
                if (counter < 10)
                {
                    Assert.Equal(counter, transformGroup["Sum"]);
                    Assert.Equal((double)counter, transformGroup["Average"]);
                    Assert.Equal(counter, transformGroup["Minimum"]);
                    Assert.Equal(counter, transformGroup["Maximum"]);
                    Assert.Equal(1L, transformGroup["Count"]);
                }
                else
                {
                    Assert.Equal(20, transformGroup["Sum"]);
                    Assert.Equal(10d, transformGroup["Average"]);
                    Assert.Equal(10, transformGroup["Minimum"]);
                    Assert.Equal(10, transformGroup["Maximum"]);
                    Assert.Equal(2L, transformGroup["Count"]);
                }
            }
            Assert.Equal(10, counter);
        }