/test/SlowTests/Issues/RavenDB_6893.cs

https://github.com/fitzchak/ravendb
C# | 185 lines | 167 code | 18 blank | 0 comment | 3 complexity | bf21800b09beeb10b1a9e3774636b14a MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using FastTests;
  4. using Xunit;
  5. using Raven.Client.Documents.Indexes;
  6. namespace SlowTests.Issues
  7. {
  8. public class RavenDB_6893 : RavenTestBase
  9. {
  10. [Fact]
  11. public void Map_reduce_on_complex_object()
  12. {
  13. using (var store = GetDocumentStore())
  14. {
  15. new Index_test1().Execute(store);
  16. new Index_test2().Execute(store);
  17. using (var session = store.OpenSession())
  18. {
  19. session.Store(new Items()
  20. {
  21. gameId = 3165690117,
  22. mapId = 11,
  23. osQueueId = 420,
  24. seasonId = 8,
  25. players = new List<players>()
  26. {
  27. new players()
  28. {
  29. cId = 254,
  30. entries = new List<entries>()
  31. {
  32. new entries()
  33. {
  34. c = 498,
  35. role = 4,
  36. synergyC = 1,
  37. }
  38. },
  39. playerId = 37633534,
  40. position = 2,
  41. won = true
  42. }
  43. }
  44. });
  45. session.SaveChanges();
  46. }
  47. WaitForIndexing(store);
  48. using (var session = store.OpenSession())
  49. {
  50. var results = session.Query<Result, Index_test1>().ToList();
  51. var results2 = session.Query<Result, Index_test2>().ToList();
  52. foreach (var result in new []{results[0], results2[0]})
  53. {
  54. Assert.Equal(1, result.game_count);
  55. Assert.Equal(1, result.game_win_count);
  56. Assert.Equal(37633534, result.playerId);
  57. Assert.Equal(1, result.seasons.Length);
  58. Assert.Equal(8, result.seasons[0].seasonId);
  59. Assert.Equal(1, result.seasons[0].season_count);
  60. Assert.Equal(1, result.seasons[0].season_win_count);
  61. Assert.Equal(420, result.seasons[0].ques[0].osQueueId);
  62. Assert.Equal(1, result.seasons[0].ques[0].que_count);
  63. Assert.Equal(1, result.seasons[0].ques[0].que_win_count);
  64. }
  65. }
  66. }
  67. }
  68. private class Index_test1 : AbstractIndexCreationTask<Items, Result>
  69. {
  70. public override IndexDefinition CreateIndexDefinition()
  71. {
  72. return new IndexDefinition
  73. {
  74. Maps =
  75. {
  76. @"from d in docs.Items from p in d.players select new { p.playerId, game_count = 1, game_win_count = p.won == true ? 1 : 0, seasons = new []{ new { d.seasonId, season_count = 1, season_win_count = p.won == true ? 1 : 0, ques = new[]{ new { d.osQueueId, que_count = 1, que_win_count = p.won == true ? 1 : 0 } } } }}"
  77. },
  78. Reduce =
  79. @"from result in results group result by new { result.playerId} into g select new { playerId = g.Key.playerId, game_count = g.Sum(a => a.game_count), game_win_count = g.Sum(a => a.game_win_count), seasons = g.SelectMany(a => a.seasons).GroupBy(a => a.seasonId).Select(a => new { seasonId = a.Key, season_count = a.Sum(b => b.season_count), season_win_count = a.Sum(b => b.season_win_count), ques = a.SelectMany(b => b.ques).GroupBy(b => b.osQueueId).Select(b => new { osQueueId = b.Key, que_count = b.Sum(c => c.que_count), que_win_count = b.Sum(c => c.que_win_count) }) }) }"
  80. };
  81. }
  82. }
  83. private class Index_test2 : AbstractIndexCreationTask<Items, Result>
  84. {
  85. public Index_test2()
  86. {
  87. Map = docs => from d in docs
  88. from p in d.players
  89. select new
  90. {
  91. playerId = p.playerId,
  92. game_count = 1,
  93. game_win_count = p.won == true ? 1 : 0,
  94. seasons = new[]
  95. {
  96. new Season
  97. {
  98. seasonId = d.seasonId,
  99. season_count = 1,
  100. season_win_count = p.won == true ? 1 : 0,
  101. ques = new[] {new Que { osQueueId = d.osQueueId, que_count = 1, que_win_count = p.won == true ? 1 : 0}}
  102. }
  103. }
  104. };
  105. Reduce = results => from result in results
  106. group result by new { result.playerId }
  107. into g
  108. select new
  109. {
  110. playerId = g.Key.playerId,
  111. game_count = g.Sum(a => a.game_count),
  112. game_win_count = g.Sum(a => a.game_win_count),
  113. seasons = g.SelectMany(a => a.seasons).GroupBy(a => a.seasonId).Select(a => new
  114. {
  115. seasonId = a.Key,
  116. season_count = a.Sum(b => b.season_count),
  117. season_win_count = a.Sum(b => b.season_win_count),
  118. ques = a.SelectMany(b => b.ques).GroupBy(b => b.osQueueId)
  119. .Select(b => new { osQueueId = b.Key, que_count = b.Sum(c => c.que_count), que_win_count = b.Sum(c => c.que_win_count) })
  120. })
  121. };
  122. }
  123. }
  124. public class Result
  125. {
  126. public int playerId { get; set; }
  127. public int game_count { get; set; }
  128. public int game_win_count { get; set; }
  129. public Season[] seasons { get; set; }
  130. }
  131. public class Season
  132. {
  133. public int seasonId { get; set; }
  134. public int season_count { get; set; }
  135. public int season_win_count { get; set; }
  136. public Que[] ques { get; set; }
  137. }
  138. public class Que
  139. {
  140. public int osQueueId { get; set; }
  141. public int que_count { get; set; }
  142. public int que_win_count { get; set; }
  143. }
  144. private class entries
  145. {
  146. public int c { get; set; }
  147. public int role { get; set; }
  148. public int synergyC { get; set; }
  149. }
  150. private class players
  151. {
  152. public int cId { get; set; }
  153. public List<entries> entries { get; set; }
  154. public int playerId { get; set; }
  155. public int position { get; set; }
  156. public bool won { get; set; }
  157. }
  158. private class Items
  159. {
  160. public long gameId { get; set; }
  161. public int mapId { get; set; }
  162. public int osQueueId { get; set; }
  163. public List<players> players { get; set; }
  164. public int seasonId { get; set; }
  165. }
  166. }
  167. }