/Raven.Tests/Document/Game.cs

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