public void TestApplyAndFilterAggregations()
        {
            /**
             *   127.0.0.1:6379> FT.CREATE test_index SCHEMA name TEXT SORTABLE subj1 NUMERIC SORTABLE subj2 NUMERIC SORTABLE
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data1 1.0 FIELDS name abc subj1 20 subj2 70
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data2 1.0 FIELDS name def subj1 60 subj2 40
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data3 1.0 FIELDS name ghi subj1 50 subj2 80
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data1 1.0 FIELDS name abc subj1 30 subj2 20
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data2 1.0 FIELDS name def subj1 65 subj2 45
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data3 1.0 FIELDS name ghi subj1 70 subj2 70
             *   OK
             */

            Client cl = GetClient();
            Schema sc = new Schema();

            sc.AddSortableTextField("name", 1.0);
            sc.AddSortableNumericField("subj1");
            sc.AddSortableNumericField("subj2");
            cl.CreateIndex(sc, new ConfiguredIndexOptions());
            cl.AddDocument(new Document("data1").Set("name", "abc").Set("subj1", 20).Set("subj2", 70));
            cl.AddDocument(new Document("data2").Set("name", "def").Set("subj1", 60).Set("subj2", 40));
            cl.AddDocument(new Document("data3").Set("name", "ghi").Set("subj1", 50).Set("subj2", 80));
            cl.AddDocument(new Document("data4").Set("name", "abc").Set("subj1", 30).Set("subj2", 20));
            cl.AddDocument(new Document("data5").Set("name", "def").Set("subj1", 65).Set("subj2", 45));
            cl.AddDocument(new Document("data6").Set("name", "ghi").Set("subj1", 70).Set("subj2", 70));

            AggregationBuilder r = new AggregationBuilder().Apply("(@subj1+@subj2)/2", "attemptavg")
                                   .GroupBy("@name", Reducers.Avg("@attemptavg").As("avgscore"))
                                   .Filter("@avgscore>=50")
                                   .SortBy(10, SortedField.Ascending("@name"));

            // actual search
            AggregationResult res = cl.Aggregate(r);
            Row?r1 = res.GetRow(0);

            Assert.NotNull(r1);
            Assert.Equal("def", r1.Value.GetString("name"));
            Assert.Equal(52.5, r1.Value.GetDouble("avgscore"));

            Row?r2 = res.GetRow(1);

            Assert.NotNull(r2);
            Assert.Equal("ghi", r2.Value.GetString("name"));
            Assert.Equal(67.5, r2.Value.GetDouble("avgscore"));
        }
        public void TestAggregations()
        {
            /**
             *   127.0.0.1:6379> FT.CREATE test_index SCHEMA name TEXT SORTABLE count NUMERIC SORTABLE
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data1 1.0 FIELDS name abc count 10
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data2 1.0 FIELDS name def count 5
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data3 1.0 FIELDS name def count 25
             */

            Client cl = GetClient();
            Schema sc = new Schema();

            sc.AddSortableTextField("name", 1.0);
            sc.AddSortableNumericField("count");
            cl.CreateIndex(sc, new ConfiguredIndexOptions());
            cl.AddDocument(new Document("data1").Set("name", "abc").Set("count", 10));
            cl.AddDocument(new Document("data2").Set("name", "def").Set("count", 5));
            cl.AddDocument(new Document("data3").Set("name", "def").Set("count", 25));

            AggregationBuilder r = new AggregationBuilder()
                                   .GroupBy("@name", Reducers.Sum("@count").As("sum"))
                                   .SortBy(10, SortedField.Descending("@sum"));

            // actual search
            AggregationResult res = cl.Aggregate(r);
            Row?r1 = res.GetRow(0);

            Assert.NotNull(r1);
            Assert.Equal("def", r1.Value.GetString("name"));
            Assert.Equal(30, r1.Value.GetInt64("sum"));
            Assert.Equal(30.0, r1.Value.GetDouble("sum"));

            Assert.Equal(0L, r1.Value.GetInt64("nosuchcol"));
            Assert.Equal(0.0, r1.Value.GetDouble("nosuchcol"));
            Assert.Null(r1.Value.GetString("nosuchcol"));

            Row?r2 = res.GetRow(1);

            Assert.NotNull(r2);
            Assert.Equal("abc", r2.Value.GetString("name"));
            Assert.Equal(10L, r2.Value.GetInt64("sum"));
        }
        public async Task TestCursor()
        {
            /*
             *   127.0.0.1:6379> FT.CREATE test_index SCHEMA name TEXT SORTABLE count NUMERIC SORTABLE
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data1 1.0 FIELDS name abc count 10
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data2 1.0 FIELDS name def count 5
             *   OK
             *   127.0.0.1:6379> FT.ADD test_index data3 1.0 FIELDS name def count 25
             */

            Client cl = GetClient();
            Schema sc = new Schema();

            sc.AddSortableTextField("name", 1.0);
            sc.AddSortableNumericField("count");
            cl.CreateIndex(sc, new ConfiguredIndexOptions());
            cl.AddDocument(new Document("data1").Set("name", "abc").Set("count", 10));
            cl.AddDocument(new Document("data2").Set("name", "def").Set("count", 5));
            cl.AddDocument(new Document("data3").Set("name", "def").Set("count", 25));

            AggregationBuilder r = new AggregationBuilder()
                                   .GroupBy("@name", Reducers.Sum("@count").As("sum"))
                                   .SortBy(10, SortedField.Descending("@sum"))
                                   .Cursor(1, 3000);

            // actual search
            AggregationResult res = cl.Aggregate(r);
            Row?row = res.GetRow(0);

            Assert.NotNull(row);
            Assert.Equal("def", row.Value.GetString("name"));
            Assert.Equal(30, row.Value.GetInt64("sum"));
            Assert.Equal(30.0, row.Value.GetDouble("sum"));

            Assert.Equal(0L, row.Value.GetInt64("nosuchcol"));
            Assert.Equal(0.0, row.Value.GetDouble("nosuchcol"));
            Assert.Null(row.Value.GetString("nosuchcol"));

            res = cl.CursorRead(res.CursorId, 1);
            Row?row2 = res.GetRow(0);

            Assert.NotNull(row2);
            Assert.Equal("abc", row2.Value.GetString("name"));
            Assert.Equal(10, row2.Value.GetInt64("sum"));

            Assert.True(cl.CursorDelete(res.CursorId));

            try
            {
                cl.CursorRead(res.CursorId, 1);
                Assert.True(false);
            }
            catch (RedisException) { }

            _ = new AggregationBuilder()
                .GroupBy("@name", Reducers.Sum("@count").As("sum"))
                .SortBy(10, SortedField.Descending("@sum"))
                .Cursor(1, 1000);

            await Task.Delay(1000).ForAwait();

            try
            {
                cl.CursorRead(res.CursorId, 1);
                Assert.True(false);
            }
            catch (RedisException) { }
        }