/ToMigrate/Raven.Tests.Issues/RavenDB_1353.cs

https://github.com/fitzchak/ravendb · C# · 368 lines · 342 code · 21 blank · 5 comment · 0 complexity · 36f75df1b415eed55446bd09b6edb8e7 MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="RavenDB_1353.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.Linq;
  8. using Raven.Abstractions.Data;
  9. using Raven.Client.Embedded;
  10. using Raven.Client.Indexes;
  11. using Raven.Tests.Common;
  12. using Xunit;
  13. namespace Raven.Tests.Issues
  14. {
  15. public class RavenDB_1353 : RavenTest
  16. {
  17. class Operation
  18. {
  19. public long Id { get; set; }
  20. public List<OperationUnit> Units { get; set; }
  21. }
  22. class OperationUnit
  23. {
  24. public string Id { get; set; }
  25. public string ReportId { get; set; }
  26. public string Language { get; set; }
  27. }
  28. class Report
  29. {
  30. public ReportResults Results { get; set; }
  31. public string Id { get; set; }
  32. }
  33. class ReportResults
  34. {
  35. public List<SegmentReportEntry> Segments { get; set; }
  36. }
  37. class SegmentReportEntry
  38. {
  39. public string Source { get; set; }
  40. public string Target { get; set; }
  41. public long Id { get; set; }
  42. public List<ErrorEntry> Errors { get; set; }
  43. }
  44. class ErrorEntry
  45. {
  46. public int CheckNumber { get; set; }
  47. public string CheckName { get; set; }
  48. public string CategoryName { get; set; }
  49. public string Message { get; set; }
  50. public string MessageFormat { get; set; }
  51. }
  52. class InvalidMapReduceIndexWithTooManyOutputsPerDocument : AbstractIndexCreationTask<Operation, InvalidMapReduceIndexWithTooManyOutputsPerDocument.ReduceResult>
  53. {
  54. public class ReduceResult
  55. {
  56. public string OperationId { get; set; }
  57. public long SegmentId { get; set; }
  58. public string Source { get; set; }
  59. public string Target { get; set; }
  60. public string TargetLanguage { get; set; }
  61. public int CheckNumber { get; set; }
  62. public string ErrorMessage { get; set; }
  63. public int Count { get; set; }
  64. }
  65. public InvalidMapReduceIndexWithTooManyOutputsPerDocument()
  66. {
  67. Map = operations => from operation in operations
  68. from unit in operation.Units
  69. let report = LoadDocument<Report>(unit.ReportId)
  70. from segment in report.Results.Segments
  71. from error in segment.Errors
  72. select new
  73. {
  74. OperationId = operation.Id,
  75. SegmentId = segment.Id,
  76. Source = segment.Source,
  77. TargetLanguage = unit.Language,
  78. Target = segment.Target,
  79. CheckNumber = error.CheckNumber,
  80. ErrorMessage = error.Message,
  81. Count = 1
  82. };
  83. Reduce = results => from result in results
  84. group result by new { result.OperationId, result.Source, result.Target, result.TargetLanguage, result.CheckNumber, result.ErrorMessage } into g
  85. select new
  86. {
  87. g.Key.OperationId,
  88. g.First().SegmentId,
  89. g.Key.Source,
  90. g.Key.Target,
  91. g.Key.TargetLanguage,
  92. g.Key.CheckNumber,
  93. g.Key.ErrorMessage,
  94. Count = g.Sum(x => x.Count)
  95. };
  96. MaxIndexOutputsPerDocument = 15;
  97. }
  98. }
  99. [Fact]
  100. public void WhenIndexProducesTooManyOutputsPerDocumentItShouldError()
  101. {
  102. using (var store = NewDocumentStore())
  103. {
  104. var index = new InvalidMapReduceIndexWithTooManyOutputsPerDocument();
  105. index.Execute(store);
  106. PutDocuments(store);
  107. WaitForIndexing(store);
  108. var databaseStatistics = store.DatabaseCommands.GetStatistics();
  109. var serverError = databaseStatistics.Errors.First();
  110. Assert.Equal(index.IndexName, serverError.IndexName);
  111. var queryResult = store.DatabaseCommands.Query(index.IndexName, new IndexQuery());
  112. Assert.NotEmpty(queryResult.Results);
  113. }
  114. }
  115. private static void PutDocuments(EmbeddableDocumentStore store)
  116. {
  117. using (var session = store.OpenSession())
  118. {
  119. var operation1 = new Operation()
  120. {
  121. Id = 1,
  122. Units = new List<OperationUnit>()
  123. {
  124. new OperationUnit()
  125. {
  126. Id = "unit/1",
  127. Language = "en",
  128. ReportId = "reports/1"
  129. },
  130. new OperationUnit()
  131. {
  132. Id = "unit/2",
  133. Language = "en",
  134. ReportId = "reports/2"
  135. }
  136. }
  137. };
  138. var operation2 = new Operation()
  139. {
  140. Id = 2,
  141. Units = new List<OperationUnit>()
  142. {
  143. new OperationUnit()
  144. {
  145. Id = "unit/3",
  146. Language = "en",
  147. ReportId = "reports/1"
  148. },
  149. new OperationUnit()
  150. {
  151. Id = "unit/4",
  152. Language = "en",
  153. ReportId = "reports/2"
  154. }
  155. }
  156. };
  157. var report1 = new Report()
  158. {
  159. Id = "reports/1",
  160. Results = new ReportResults()
  161. {
  162. Segments = new List<SegmentReportEntry>()
  163. {
  164. new SegmentReportEntry()
  165. {
  166. Id = 1,
  167. Target = "a",
  168. Source = "b",
  169. Errors = new List<ErrorEntry>()
  170. {
  171. new ErrorEntry()
  172. {
  173. CategoryName = "a",
  174. CheckName = "a",
  175. CheckNumber = 1,
  176. Message = "msg1",
  177. MessageFormat = "format1"
  178. },
  179. new ErrorEntry()
  180. {
  181. CategoryName = "b",
  182. CheckName = "b",
  183. CheckNumber = 2,
  184. Message = "msg2",
  185. MessageFormat = "format2"
  186. },
  187. new ErrorEntry()
  188. {
  189. CategoryName = "c",
  190. CheckName = "c",
  191. CheckNumber = 3,
  192. Message = "msg3",
  193. MessageFormat = "format3"
  194. },
  195. new ErrorEntry()
  196. {
  197. CategoryName = "d",
  198. CheckName = "d",
  199. CheckNumber = 3,
  200. Message = "msg3",
  201. MessageFormat = "format3"
  202. },
  203. new ErrorEntry()
  204. {
  205. CategoryName = "d",
  206. CheckName = "d",
  207. CheckNumber = 5,
  208. Message = "msg3",
  209. MessageFormat = "format3"
  210. }
  211. }
  212. },
  213. new SegmentReportEntry()
  214. {
  215. Id = 2,
  216. Target = "a",
  217. Source = "b",
  218. Errors = new List<ErrorEntry>()
  219. {
  220. new ErrorEntry()
  221. {
  222. CategoryName = "a",
  223. CheckName = "a",
  224. CheckNumber = 1,
  225. Message = "msg1",
  226. MessageFormat = "format1"
  227. },
  228. new ErrorEntry()
  229. {
  230. CategoryName = "b",
  231. CheckName = "b",
  232. CheckNumber = 2,
  233. Message = "msg2",
  234. MessageFormat = "format2"
  235. },
  236. new ErrorEntry()
  237. {
  238. CategoryName = "c",
  239. CheckName = "c",
  240. CheckNumber = 3,
  241. Message = "msg3",
  242. MessageFormat = "format3"
  243. },
  244. new ErrorEntry()
  245. {
  246. CategoryName = "f",
  247. CheckName = "f",
  248. CheckNumber = 6,
  249. Message = "msg3",
  250. MessageFormat = "format3"
  251. },
  252. new ErrorEntry()
  253. {
  254. CategoryName = "g",
  255. CheckName = "g",
  256. CheckNumber = 8,
  257. Message = "msg3",
  258. MessageFormat = "format3"
  259. }
  260. }
  261. }
  262. }
  263. }
  264. };
  265. var report2 = new Report()
  266. {
  267. Id = "reports/2",
  268. Results = new ReportResults()
  269. {
  270. Segments = new List<SegmentReportEntry>()
  271. {
  272. new SegmentReportEntry()
  273. {
  274. Target = "a",
  275. Source = "b",
  276. Errors = new List<ErrorEntry>()
  277. {
  278. new ErrorEntry()
  279. {
  280. CategoryName = "a",
  281. CheckName = "a",
  282. CheckNumber = 1,
  283. Message = "msg1",
  284. MessageFormat = "format1"
  285. },
  286. new ErrorEntry()
  287. {
  288. CategoryName = "b",
  289. CheckName = "b",
  290. CheckNumber = 2,
  291. Message = "msg2",
  292. MessageFormat = "format2"
  293. },
  294. new ErrorEntry()
  295. {
  296. CategoryName = "c",
  297. CheckName = "c",
  298. CheckNumber = 3,
  299. Message = "msg3",
  300. MessageFormat = "format3"
  301. }
  302. }
  303. },
  304. new SegmentReportEntry()
  305. {
  306. Target = "a",
  307. Source = "b",
  308. Errors = new List<ErrorEntry>()
  309. {
  310. new ErrorEntry()
  311. {
  312. CategoryName = "a",
  313. CheckName = "a",
  314. CheckNumber = 1,
  315. Message = "msg1",
  316. MessageFormat = "format1"
  317. },
  318. new ErrorEntry()
  319. {
  320. CategoryName = "b",
  321. CheckName = "b",
  322. CheckNumber = 2,
  323. Message = "msg2",
  324. MessageFormat = "format2"
  325. },
  326. new ErrorEntry()
  327. {
  328. CategoryName = "c",
  329. CheckName = "c",
  330. CheckNumber = 3,
  331. Message = "msg3",
  332. MessageFormat = "format3"
  333. }
  334. }
  335. }
  336. }
  337. }
  338. };
  339. session.Store(report1);
  340. session.Store(report2);
  341. session.Store(operation1);
  342. session.Store(operation2);
  343. session.SaveChanges();
  344. }
  345. }
  346. }
  347. }