PageRenderTime 47ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/Raven.Tests/Views/ViewCompilation.cs

http://github.com/ravendb/ravendb
C# | 93 lines | 79 code | 9 blank | 5 comment | 0 complexity | 386f7b8a59adb8837018b3d03174273b MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0, BSD-3-Clause
  1. //-----------------------------------------------------------------------
  2. // <copyright file="ViewCompilation.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System.Collections.Generic;
  7. using System.Dynamic;
  8. using System.Linq;
  9. using Raven.Abstractions.Indexing;
  10. using Raven.Abstractions.Linq;
  11. using Raven.Json.Linq;
  12. using Raven.Database.Linq;
  13. using Raven.Tests.Common;
  14. using Xunit;
  15. namespace Raven.Tests.Views
  16. {
  17. public class ViewCompilation : NoDisposalNeeded
  18. {
  19. private const string map =
  20. @"from post in docs
  21. select new {
  22. post.blog_id,
  23. comments_length = post.comments.Length
  24. }";
  25. private const string reduce =
  26. @"
  27. from agg in results
  28. group agg by agg.blog_id into g
  29. select new {
  30. blog_id = g.Key,
  31. comments_length = g.Sum(x=>x.comments_length)
  32. }";
  33. private readonly IEnumerable<DynamicJsonObject> source;
  34. public ViewCompilation()
  35. {
  36. source = ConvertToExpando(new[]
  37. {
  38. new {blog_id = 3, comments = new object[3], __document_id = 1},
  39. new {blog_id = 5, comments = new object[4], __document_id = 1},
  40. new {blog_id = 6, comments = new object[6], __document_id = 1},
  41. new {blog_id = 7, comments = new object[1], __document_id = 1},
  42. new {blog_id = 3, comments = new object[3], __document_id = 1},
  43. new {blog_id = 3, comments = new object[5], __document_id = 1},
  44. new {blog_id = 2, comments = new object[8], __document_id = 1},
  45. new {blog_id = 4, comments = new object[3], __document_id = 1},
  46. new {blog_id = 5, comments = new object[2], __document_id = 1},
  47. new {blog_id = 3, comments = new object[3], __document_id = 1},
  48. new {blog_id = 5, comments = new object[1], __document_id = 1}
  49. });
  50. }
  51. [Fact]
  52. public void CanDetectGroupByTarget()
  53. {
  54. var abstractViewGenerator = new DynamicViewCompiler("test", new IndexDefinition { Map = map, Reduce = reduce }, ".").GenerateInstance();
  55. var expandoObject = new ExpandoObject();
  56. ((IDictionary<string,object>)expandoObject).Add("blog_id","1");
  57. Assert.Equal("1", abstractViewGenerator.GroupByExtraction(expandoObject));
  58. }
  59. [Fact]
  60. public void CanCompileQuery()
  61. {
  62. var abstractViewGenerator = new DynamicViewCompiler("test", new IndexDefinition { Map = map, Reduce = reduce }, ".").GenerateInstance();
  63. Assert.NotNull(abstractViewGenerator);
  64. }
  65. [Fact]
  66. public void CanExecuteQuery()
  67. {
  68. var dynamicViewCompiler = new DynamicViewCompiler("test", new IndexDefinition { Map = map, Reduce = reduce }, ".");
  69. var abstractViewGenerator = dynamicViewCompiler.GenerateInstance();
  70. var mapResults = abstractViewGenerator.MapDefinitions[0](source).ToArray();
  71. var results = abstractViewGenerator.ReduceDefinition(mapResults).ToArray();
  72. Assert.Equal("{ blog_id = 3, comments_length = 14 }", results[0].ToString());
  73. Assert.Equal("{ blog_id = 5, comments_length = 7 }", results[1].ToString());
  74. Assert.Equal("{ blog_id = 6, comments_length = 6 }", results[2].ToString());
  75. Assert.Equal("{ blog_id = 7, comments_length = 1 }", results[3].ToString());
  76. Assert.Equal("{ blog_id = 2, comments_length = 8 }", results[4].ToString());
  77. Assert.Equal("{ blog_id = 4, comments_length = 3 }", results[5].ToString());
  78. }
  79. private static IEnumerable<DynamicJsonObject> ConvertToExpando(IEnumerable<object> objects)
  80. {
  81. return objects.Select(obj => new DynamicJsonObject(RavenJObject.FromObject(obj)));
  82. }
  83. }
  84. }