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