public async Task CanUpdateByChangingReduceKey()
        {
            using (var db = CreateDocumentDatabase())
                using (var index = AutoMapReduceIndex.CreateNew(new AutoMapReduceIndexDefinition("Users", new[]
                {
                    new AutoIndexField
                    {
                        Name = "Age",
                        Aggregation = AggregationOperation.Sum,
                        Storage = FieldStorage.Yes
                    }
                }, new[]
                {
                    new AutoIndexField
                    {
                        Name = "Location",
                        Storage = FieldStorage.Yes
                    },
                }), db))
                {
                    CreateUsers(db, 2, "Poland");

                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(41L, results[0].Data["Age"]);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        using (var tx = context.OpenWriteTransaction())
                        {
                            using (var doc = context.ReadObject(new DynamicJsonValue
                            {
                                ["Name"] = "James",
                                ["Location"] = "Israel",
                                ["Age"] = 20,
                                [Constants.Documents.Metadata.Key] = new DynamicJsonValue
                                {
                                    [Constants.Documents.Metadata.Collection] = "Users"
                                }
                            }, "users/0"))
                            {
                                db.DocumentsStorage.Put(context, "users/0", null, doc);
                            }

                            tx.Commit();
                        }
                    }

                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide("FROM Users ORDER BY Location"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(2, results.Count);

                        Assert.Equal("Israel", results[0].Data["Location"].ToString());
                        Assert.Equal(20L, results[0].Data["Age"]);

                        Assert.Equal("Poland", results[1].Data["Location"].ToString());
                        Assert.Equal(21L, results[1].Data["Age"]);
                    }
                }
        }
        public async Task CanDelete()
        {
            const long numberOfUsers = 10;

            using (var db = CreateDocumentDatabase())
                using (var index = AutoMapReduceIndex.CreateNew(GetUsersCountByLocationIndexDefinition(), db))
                {
                    CreateUsers(db, numberOfUsers, "Poland");

                    // index 10 users
                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(numberOfUsers, results[0].Data["Count"]);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        using (var tx = context.OpenWriteTransaction())
                        {
                            db.DocumentsStorage.Delete(context, "users/0", null);

                            tx.Commit();
                        }
                    }

                    // one document deleted
                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(numberOfUsers - 1, results[0].Data["Count"]);
                    }

                    CreateUsers(db, 1, "Poland");

                    // document added again
                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(numberOfUsers, results[0].Data["Count"]);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        using (var tx = context.OpenWriteTransaction())
                        {
                            for (int i = 0; i < numberOfUsers; i++)
                            {
                                db.DocumentsStorage.Delete(context, $"users/{i}", null);
                            }

                            tx.Commit();
                        }
                    }

                    // all documents removed
                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(0, results.Count);
                    }

                    CreateUsers(db, numberOfUsers, "Poland");

                    // documents added back
                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(numberOfUsers, results[0].Data["Count"]);
                    }
                }
        }
Beispiel #3
0
        public async Task GroupByMultipleFields()
        {
            using (var db = CreateDocumentDatabase())
                using (var index = AutoMapReduceIndex.CreateNew(1, new AutoMapReduceIndexDefinition("Orders", new[]
                {
                    new AutoIndexField
                    {
                        Name = "Count",
                        Aggregation = AggregationOperation.Count,
                        Storage = FieldStorage.Yes
                    }
                }, new[]
                {
                    new AutoIndexField
                    {
                        Name = "Employee",
                        Storage = FieldStorage.Yes
                    },
                    new AutoIndexField
                    {
                        Name = "Company",
                        Storage = FieldStorage.Yes
                    },
                }), db))
                {
                    CreateOrders(db, 10, employees: new[] { "employees/1", "employees/2" }, companies: new[] { "companies/1", "companies/2", "companies/3" });

                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var results = (await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}'"), context, OperationCancelToken.None)).Results;

                        Assert.Equal(6, results.Count);

                        for (int i = 0; i < 6; i++)
                        {
                            var employeeNumber = i % 2 + 1;
                            var companyNumber  = i % 3 + 1;
                            results = (await index.Query(new IndexQueryServerSide($"FROM INDEX '{index.Name}' WHERE Employee = 'employees/{employeeNumber}' AND Company = 'companies/{companyNumber}'")
                            {
                                Query = $"Employee:employees/{employeeNumber} AND Company:companies/{companyNumber}"
                            }, context, OperationCancelToken.None)).Results;

                            Assert.Equal(1, results.Count);

                            long expectedCount;

                            if ((employeeNumber == 1 && companyNumber == 2) || (employeeNumber == 2 && companyNumber == 3))
                            {
                                expectedCount = 1;
                            }
                            else
                            {
                                expectedCount = 2;
                            }

                            Assert.Equal(expectedCount, results[0].Data["Count"]);
                        }
                    }
                }
        }
Beispiel #4
0
        public async Task CanUpdateByChangingValue()
        {
            using (var db = CreateDocumentDatabase())
                using (var index = AutoMapReduceIndex.CreateNew(1, new AutoMapReduceIndexDefinition(new[] { "Users" }, new[]
                {
                    new IndexField
                    {
                        Name = "Age",
                        MapReduceOperation = FieldMapReduceOperation.Sum,
                        Storage = FieldStorage.Yes
                    }
                }, new[]
                {
                    new IndexField
                    {
                        Name = "Location",
                        Storage = FieldStorage.Yes
                    },
                }), db))
                {
                    CreateUsers(db, 2, "Poland");

                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide(), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(41L, results[0].Data["Age"]);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        using (var tx = context.OpenWriteTransaction())
                        {
                            using (var doc = context.ReadObject(new DynamicJsonValue
                            {
                                ["Name"] = "modified",
                                ["Location"] = "Poland",
                                ["Age"] = 30,
                                [Constants.Metadata.Key] = new DynamicJsonValue
                                {
                                    [Constants.Headers.RavenEntityName] = "Users"
                                }
                            }, "users/0"))
                            {
                                db.DocumentsStorage.Put(context, "users/0", null, doc);
                            }

                            tx.Commit();
                        }
                    }

                    index.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await index.Query(new IndexQueryServerSide(), context, OperationCancelToken.None);

                        var results = queryResult.Results;

                        Assert.Equal(1, results.Count);

                        Assert.Equal("Poland", results[0].Data["Location"].ToString());
                        Assert.Equal(51L, results[0].Data["Age"]);
                    }
                }
        }
Beispiel #5
0
        public async Task MultipleAggregationFunctionsCanBeUsed()
        {
            using (var db = CreateDocumentDatabase())
                using (var mri = AutoMapReduceIndex.CreateNew(1, new AutoMapReduceIndexDefinition(new[] { "Users" }, new[]
                {
                    new IndexField
                    {
                        Name = "Count",
                        MapReduceOperation = FieldMapReduceOperation.Count,
                        Storage = FieldStorage.Yes
                    },
                    new IndexField
                    {
                        Name = "TotalCount",
                        MapReduceOperation = FieldMapReduceOperation.Count,
                        Storage = FieldStorage.Yes
                    },
                    new IndexField
                    {
                        Name = "Age",
                        MapReduceOperation = FieldMapReduceOperation.Sum,
                        Storage = FieldStorage.Yes
                    }
                }, new[]
                {
                    new IndexField
                    {
                        Name = "Location",
                        Storage = FieldStorage.Yes
                    },
                }), db))
                {
                    CreateUsers(db, 2, "Poland");

                    mri.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await mri.Query(new IndexQueryServerSide(), context, OperationCancelToken.None);

                        Assert.Equal(1, queryResult.Results.Count);
                        var result = queryResult.Results[0].Data;

                        string location;
                        Assert.True(result.TryGet("Location", out location));
                        Assert.Equal("Poland", location);

                        Assert.Equal(2L, result["Count"]);

                        Assert.Equal(2L, result["TotalCount"]);

                        Assert.Equal(41L, result["Age"]);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await mri.Query(new IndexQueryServerSide()
                        {
                            Query = "Count_Range:[Lx2 TO Lx10]"
                        }, context, OperationCancelToken.None);

                        Assert.Equal(1, queryResult.Results.Count);

                        queryResult = await mri.Query(new IndexQueryServerSide()
                        {
                            Query = "Count_Range:[Lx10 TO NULL]"
                        }, context, OperationCancelToken.None);

                        Assert.Equal(0, queryResult.Results.Count);
                    }
                }
        }
        public async Task MultipleAggregationFunctionsCanBeUsed()
        {
            using (var db = CreateDocumentDatabase())
                using (var mri = AutoMapReduceIndex.CreateNew(new AutoMapReduceIndexDefinition("Users", new[]
                {
                    new AutoIndexField
                    {
                        Name = "Count",
                        Aggregation = AggregationOperation.Count,
                        Storage = FieldStorage.Yes
                    },
                    new AutoIndexField
                    {
                        Name = "TotalCount",
                        Aggregation = AggregationOperation.Count,
                        Storage = FieldStorage.Yes
                    },
                    new AutoIndexField
                    {
                        Name = "Age",
                        Aggregation = AggregationOperation.Sum,
                        Storage = FieldStorage.Yes
                    }
                }, new[]
                {
                    new AutoIndexField
                    {
                        Name = "Location",
                        Storage = FieldStorage.Yes
                    },
                }), db))
                {
                    BasicAutoMapReduceIndexing.CreateUsers(db, 2, "Poland");

                    mri.DoIndexingWork(new IndexingStatsScope(new IndexingRunStats()), CancellationToken.None);

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await mri.Query(new IndexQueryServerSide($"FROM INDEX '{mri.Name}'"), context, OperationCancelToken.None);

                        Assert.Equal(1, queryResult.Results.Count);
                        var result = queryResult.Results[0].Data;

                        string location;
                        Assert.True(result.TryGet("Location", out location));
                        Assert.Equal("Poland", location);

                        Assert.Equal(2L, result["Count"]);

                        Assert.Equal(2L, result["TotalCount"]);

                        Assert.Equal(41L, result["Age"]);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await mri.Query(new IndexQueryServerSide($"FROM INDEX '{mri.Name}' WHERE Count BETWEEN 2 AND 10"), context,
                                                          OperationCancelToken.None);

                        Assert.Equal(1, queryResult.Results.Count);
                    }

                    using (var context = DocumentsOperationContext.ShortTermSingleUse(db))
                    {
                        var queryResult = await mri.Query(new IndexQueryServerSide($"FROM INDEX '{mri.Name}' WHERE Count >= 10"), context, OperationCancelToken.None);

                        Assert.Equal(0, queryResult.Results.Count);
                    }
                }
        }