/ToMigrate/Raven.Tests/Document/Game.cs

https://github.com/fitzchak/ravendb · C# · 444 lines · 333 code · 103 blank · 8 comment · 14 complexity · 21d7af2c1f5d63a326844ad76714c4ca MD5 · raw file

  1. //-----------------------------------------------------------------------
  2. // <copyright file="Game.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System;
  7. using System.Linq;
  8. using Raven.Abstractions.Indexing;
  9. using Raven.Client;
  10. using Raven.Client.Embedded;
  11. using Raven.Client.Indexes;
  12. using Raven.Tests.Common;
  13. using Xunit;
  14. namespace Raven.Tests.Document
  15. {
  16. public class Game : RavenTest
  17. {
  18. /// <summary>
  19. /// http://groups.google.com/group/ravendb/browse_thread/thread/e9f045e073d7a698
  20. /// </summary>
  21. [Fact]
  22. public void WillNotGetDuplicatedResults()
  23. {
  24. using (EmbeddableDocumentStore store = NewDocumentStore())
  25. {
  26. store.DatabaseCommands.PutIndex("GameEventCountZoneBySpecificCharacter",
  27. new IndexDefinition
  28. {
  29. Map =
  30. @"from doc in docs where doc.DataUploadId != null
  31. && doc.RealmName != null
  32. && doc.Region != null
  33. && doc.CharacterName != null
  34. && doc.Zone != null
  35. && doc.SubZone != null
  36. select new
  37. {
  38. DataUploadId = doc.DataUploadId,
  39. RealmName = doc.RealmName,
  40. Region = doc.Region,
  41. CharacterName = doc.CharacterName,
  42. Zone = doc.Zone,
  43. Count = 1
  44. };",
  45. Reduce =
  46. @"from result in results
  47. group result by new
  48. {
  49. DataUploadId = result.DataUploadId,
  50. RealmName = result.RealmName,
  51. Region = result.Region,
  52. CharacterName = result.CharacterName,
  53. Zone = result.Zone
  54. } into g
  55. select new
  56. {
  57. DataUploadId = g.Key.DataUploadId,
  58. RealmName = g.Key.RealmName,
  59. Region = g.Key.Region,
  60. CharacterName = g.Key.CharacterName,
  61. Zone = g.Key.Zone,
  62. Count = g.Sum(x => (int)x.Count)
  63. };"
  64. });
  65. using (IDocumentSession documentSession = store.OpenSession())
  66. {
  67. documentSession.Store(new GameEvent
  68. {
  69. Id = "1",
  70. UserId = "UserId1",
  71. Time = "232",
  72. ActionName = "Something",
  73. CharacterName = "Darykal",
  74. DataUploadId = "10",
  75. RealmName = "Moonglade",
  76. Region = "SingleRegion",
  77. SubZone = "SubzoneOne",
  78. Zone = "ZoneOne"
  79. });
  80. documentSession.Store(new GameEvent
  81. {
  82. Id = "2",
  83. UserId = "UserId1",
  84. Time = "232",
  85. ActionName = "Something",
  86. CharacterName = "Darykal",
  87. DataUploadId = "10",
  88. RealmName = "Moonglade",
  89. Region = "SingleRegion",
  90. SubZone = "SubzoneOne",
  91. Zone = "ZoneOne"
  92. });
  93. documentSession.Store(new GameEvent
  94. {
  95. Id = "3",
  96. UserId = "UserId1",
  97. Time = "232",
  98. ActionName = "Something",
  99. CharacterName = "Darykal",
  100. DataUploadId = "10",
  101. RealmName = "Moonglade",
  102. Region = "SingleRegion",
  103. SubZone = "SubzoneOne",
  104. Zone = "ZoneOne"
  105. });
  106. documentSession.Store(new GameEvent
  107. {
  108. Id = "4",
  109. UserId = "UserId1",
  110. Time = "232",
  111. ActionName = "Something",
  112. CharacterName = "Darykal",
  113. DataUploadId = "10",
  114. RealmName = "Moonglade",
  115. Region = "SingleRegion",
  116. SubZone = "SubzoneOne",
  117. Zone = "ZoneOne"
  118. });
  119. documentSession.Store(new GameEvent
  120. {
  121. Id = "5",
  122. UserId = "UserId1",
  123. Time = "232",
  124. ActionName = "Something",
  125. CharacterName = "Darykal",
  126. DataUploadId = "10",
  127. RealmName = "Moonglade",
  128. Region = "SingleRegion",
  129. SubZone = "SubzoneOne",
  130. Zone = "ZoneOne"
  131. });
  132. documentSession.Store(new GameEvent
  133. {
  134. Id = "6",
  135. UserId = "UserId1",
  136. Time = "232",
  137. ActionName = "Something",
  138. CharacterName = "Darykal",
  139. DataUploadId = "10",
  140. RealmName = "Moonglade",
  141. Region = "SingleRegion",
  142. SubZone = "SubzoneOne",
  143. Zone = "ZoneTwo"
  144. });
  145. documentSession.Store(new GameEvent
  146. {
  147. Id = "7",
  148. UserId = "UserId1",
  149. Time = "232",
  150. ActionName = "Something",
  151. CharacterName = "Darykal",
  152. DataUploadId = "10",
  153. RealmName = "Moonglade",
  154. Region = "SingleRegion",
  155. SubZone = "SubzoneOne",
  156. Zone = "ZoneTwo"
  157. });
  158. documentSession.Store(new GameEvent
  159. {
  160. Id = "8",
  161. UserId = "UserId1",
  162. Time = "232",
  163. ActionName = "Something",
  164. CharacterName = "Darykal",
  165. DataUploadId = "10",
  166. RealmName = "Moonglade",
  167. Region = "SingleRegion",
  168. SubZone = "SubzoneOne",
  169. Zone = "ZoneThree"
  170. });
  171. documentSession.Store(new GameEvent
  172. {
  173. Id = "9",
  174. UserId = "UserId1",
  175. Time = "232",
  176. ActionName = "Something",
  177. CharacterName = "Darykal",
  178. DataUploadId = "10",
  179. RealmName = "Moonglade",
  180. Region = "SingleRegion",
  181. SubZone = "SubzoneOne",
  182. Zone = "ZoneThree"
  183. });
  184. documentSession.Store(new GameEvent
  185. {
  186. Id = "10",
  187. UserId = "UserId1",
  188. Time = "232",
  189. ActionName = "Something",
  190. CharacterName = "Darykal",
  191. DataUploadId = "10",
  192. RealmName = "Moonglade",
  193. Region = "SingleRegion",
  194. SubZone = "SubzoneOne",
  195. Zone = "ZoneOne"
  196. });
  197. documentSession.SaveChanges();
  198. ZoneCountResult[] darykalSumResults =
  199. documentSession.Advanced.DocumentQuery<GameEvent>("GameEventCountZoneBySpecificCharacter")
  200. .Where("RealmName:Moonglade AND Region:SingleRegion AND DataUploadId:10 ")
  201. .SelectFields<ZoneCountResult>("Zone", "Count")
  202. .WaitForNonStaleResults(TimeSpan.FromDays(1))
  203. .ToArray();
  204. Assert.Equal(3, darykalSumResults.Length);
  205. }
  206. }
  207. }
  208. [Fact]
  209. public void WillNotGetDuplicatedResults_UsingLinq()
  210. {
  211. using (EmbeddableDocumentStore store = NewDocumentStore())
  212. {
  213. store.DatabaseCommands.PutIndex("GameEventCountZoneBySpecificCharacter",
  214. new IndexDefinitionBuilder<GameEvent, GameEventCount>
  215. {
  216. Map = docs =>
  217. from doc in docs
  218. where doc.DataUploadId != null
  219. && doc.RealmName != null
  220. && doc.Region != null
  221. && doc.CharacterName != null
  222. && doc.Zone != null
  223. && doc.SubZone != null
  224. select new
  225. {
  226. doc.DataUploadId,
  227. doc.RealmName,
  228. doc.Region,
  229. doc.CharacterName,
  230. doc.Zone,
  231. Count = 1
  232. },
  233. Reduce = results => from result in results
  234. group result by new
  235. {
  236. result.DataUploadId,
  237. result.RealmName,
  238. result.Region,
  239. result.CharacterName,
  240. result.Zone
  241. }
  242. into g
  243. select new
  244. {
  245. g.Key.DataUploadId,
  246. g.Key.RealmName,
  247. g.Key.Region,
  248. g.Key.CharacterName,
  249. g.Key.Zone,
  250. Count = g.Sum(x => x.Count)
  251. }
  252. });
  253. using (IDocumentSession documentSession = store.OpenSession())
  254. {
  255. for (int i = 0; i < 5; i++)
  256. {
  257. documentSession.Store(new GameEvent
  258. {
  259. Id = (i + 1).ToString(),
  260. UserId = "UserId1",
  261. Time = "232",
  262. ActionName = "Something",
  263. CharacterName = "Darykal",
  264. DataUploadId = "10",
  265. RealmName = "Moonglade",
  266. Region = "SingleRegion",
  267. SubZone = "SubzoneOne",
  268. Zone = "ZoneOne"
  269. });
  270. }
  271. for (int i = 6; i < 8; i++)
  272. {
  273. documentSession.Store(new GameEvent
  274. {
  275. Id = (i + 1).ToString(),
  276. UserId = "UserId1",
  277. Time = "232",
  278. ActionName = "Something",
  279. CharacterName = "Darykal",
  280. DataUploadId = "10",
  281. RealmName = "Moonglade",
  282. Region = "SingleRegion",
  283. SubZone = "SubzoneOne",
  284. Zone = "ZoneTwo"
  285. });
  286. }
  287. for (int i = 9; i < 12; i++)
  288. {
  289. documentSession.Store(new GameEvent
  290. {
  291. Id = (i + 1).ToString(),
  292. UserId = "UserId1",
  293. Time = "232",
  294. ActionName = "Something",
  295. CharacterName = "Darykal",
  296. DataUploadId = "10",
  297. RealmName = "Moonglade",
  298. Region = "SingleRegion",
  299. SubZone = "SubzoneOne",
  300. Zone = "ZoneThree"
  301. });
  302. }
  303. documentSession.SaveChanges();
  304. dynamic[] darykalSumResults =
  305. documentSession.Advanced.DocumentQuery<dynamic>("GameEventCountZoneBySpecificCharacter")
  306. .Where("CharacterName:Darykal AND RealmName:Moonglade AND Region:SingleRegion AND DataUploadId:10 ")
  307. .WaitForNonStaleResults(TimeSpan.FromDays(1))
  308. .ToArray();
  309. Assert.Equal(3, darykalSumResults.Length);
  310. }
  311. }
  312. }
  313. #region Nested type: GameEvent
  314. public class GameEvent
  315. {
  316. public string Id { get; set; }
  317. public string UserId { get; set; }
  318. public string Region { get; set; }
  319. public string CharacterName { get; set; }
  320. public string RealmName { get; set; }
  321. public string DataUploadId { get; set; }
  322. public string Time { get; set; }
  323. public string ActionName { get; set; }
  324. public string Zone { get; set; }
  325. public string SubZone { get; set; }
  326. }
  327. #endregion
  328. #region Nested type: GameEventCount
  329. public class GameEventCount
  330. {
  331. public string Region { get; set; }
  332. public string CharacterName { get; set; }
  333. public string RealmName { get; set; }
  334. public string DataUploadId { get; set; }
  335. public string Zone { get; set; }
  336. public string SubZone { get; set; }
  337. public int Count { get; set; }
  338. }
  339. #endregion
  340. }
  341. }