/ToMigrate/Raven.Tests/Storage/Voron/MappedResultsStorageActionsTests.cs

https://github.com/fitzchak/ravendb · C# · 1066 lines · 834 code · 226 blank · 6 comment · 2 complexity · 3f190c39c7b8f70db8478594e914d76b MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="MappedResultsStorageActionsTests.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 System.Threading;
  9. using Raven.Abstractions.Data;
  10. using Raven.Database.Indexing;
  11. using Raven.Database.Storage;
  12. using Raven.Json.Linq;
  13. using Raven.Tests.Common;
  14. using Sparrow.Collections;
  15. using Xunit;
  16. using Xunit.Extensions;
  17. namespace Raven.Tests.Storage.Voron
  18. {
  19. [Trait("VoronTest", "StorageActionsTests")]
  20. public class MappedResultsStorageActionsTests : TransactionalStorageTestBase
  21. {
  22. [Theory]
  23. [PropertyData("Storages")]
  24. public void IncrementReduceKeyCounterWithNegativeValues(string requestedStorage)
  25. {
  26. using (var storage = NewTransactionalStorage(requestedStorage))
  27. {
  28. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 11));
  29. storage.Batch(
  30. accessor =>
  31. {
  32. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  33. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  34. Assert.Equal(0, reduceKeysAndTypes.Count);
  35. Assert.Equal(1, keyStats.Count);
  36. });
  37. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 0));
  38. storage.Batch(
  39. accessor =>
  40. {
  41. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  42. Assert.Equal(1, keyStats.Count);
  43. var k1 = keyStats[0];
  44. Assert.Equal(11, k1.Count);
  45. });
  46. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", -1));
  47. storage.Batch(
  48. accessor =>
  49. {
  50. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  51. Assert.Equal(1, keyStats.Count);
  52. var k1 = keyStats[0];
  53. Assert.Equal(10, k1.Count);
  54. });
  55. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", -10));
  56. storage.Batch(
  57. accessor =>
  58. {
  59. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  60. //the reduce key counter for "reduceKey1" will be removed
  61. Assert.Equal(0, keyStats.Count);
  62. });
  63. }
  64. }
  65. [Theory]
  66. [PropertyData("Storages")]
  67. public void IncrementReduceKeyCounter(string requestedStorage)
  68. {
  69. using (var storage = NewTransactionalStorage(requestedStorage))
  70. {
  71. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 7));
  72. storage.Batch(accessor =>
  73. {
  74. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  75. Assert.Equal(0, reduceKeysAndTypes.Count);
  76. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  77. Assert.Equal(1, keyStats.Count);
  78. var k1 = keyStats[0];
  79. Assert.Equal("reduceKey1", k1.Key);
  80. Assert.Equal(7, k1.Count);
  81. });
  82. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 3));
  83. storage.Batch(accessor =>
  84. {
  85. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  86. Assert.Equal(0, reduceKeysAndTypes.Count);
  87. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  88. Assert.Equal(1, keyStats.Count);
  89. var k1 = keyStats[0];
  90. Assert.Equal("reduceKey1", k1.Key);
  91. Assert.Equal(10, k1.Count);
  92. });
  93. }
  94. }
  95. [Theory]
  96. [PropertyData("Storages")]
  97. public void GetReduceKeysAndTypes(string requestedStorage)
  98. {
  99. using (var storage = NewTransactionalStorage(requestedStorage))
  100. {
  101. storage.Batch(accessor => Assert.Equal(0, accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).Count()));
  102. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 2));
  103. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey1", ReduceType.SingleStep));
  104. storage.Batch(accessor => Assert.Equal(1, accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).Count()));
  105. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey1", ReduceType.SingleStep));
  106. storage.Batch(accessor => Assert.Equal(1, accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).Count()));
  107. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey2", 2));
  108. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey2", ReduceType.SingleStep));
  109. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey3", 2));
  110. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey3", ReduceType.SingleStep));
  111. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(404, "reduceKey4", 2));
  112. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(404, "reduceKey4", ReduceType.MultiStep));
  113. storage.Batch(accessor => Assert.Equal(3, accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).Count()));
  114. if (requestedStorage == "esent")
  115. {
  116. storage.Batch(accessor => accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject()));
  117. storage.Batch(accessor => accessor.MapReduce.PutMappedResult(303, "doc2", "reduceKey1", new RavenJObject()));
  118. storage.Batch(accessor => accessor.MapReduce.PutMappedResult(303, "doc3", "reduceKey1", new RavenJObject()));
  119. storage.Batch(accessor => accessor.MapReduce.PutMappedResult(303, "doc4", "reduceKey1", new RavenJObject()));
  120. storage.Batch(accessor => accessor.MapReduce.PutMappedResult(303, "doc5", "reduceKey1", new RavenJObject()));
  121. }
  122. storage.Batch(accessor =>
  123. {
  124. var reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 1).ToList();
  125. Assert.Equal(1, reduceKeyAndTypes.Count);
  126. var k1 = reduceKeyAndTypes[0];
  127. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 1, 1).ToList();
  128. Assert.Equal(1, reduceKeyAndTypes.Count);
  129. var k2 = reduceKeyAndTypes[0];
  130. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 2, 1).ToList();
  131. Assert.Equal(1, reduceKeyAndTypes.Count);
  132. var k3 = reduceKeyAndTypes[0];
  133. Assert.NotEqual(k1.ReduceKey, k2.ReduceKey);
  134. Assert.NotEqual(k1.ReduceKey, k3.ReduceKey);
  135. Assert.NotEqual(k2.ReduceKey, k3.ReduceKey);
  136. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 1, 2).ToList();
  137. Assert.Equal(2, reduceKeyAndTypes.Count);
  138. Assert.Equal(k2.ReduceKey, reduceKeyAndTypes[0].ReduceKey);
  139. Assert.Equal(k3.ReduceKey, reduceKeyAndTypes[1].ReduceKey);
  140. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 2, 2).ToList();
  141. Assert.Equal(1, reduceKeyAndTypes.Count);
  142. Assert.Equal(k3.ReduceKey, reduceKeyAndTypes[0].ReduceKey);
  143. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 5).ToList();
  144. Assert.Equal(3, reduceKeyAndTypes.Count);
  145. Assert.Equal(k1.ReduceKey, reduceKeyAndTypes[0].ReduceKey);
  146. Assert.Equal(k2.ReduceKey, reduceKeyAndTypes[1].ReduceKey);
  147. Assert.Equal(k3.ReduceKey, reduceKeyAndTypes[2].ReduceKey);
  148. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 5, 55).ToList();
  149. Assert.Equal(0, reduceKeyAndTypes.Count);
  150. reduceKeyAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(404, 0, 10).ToList();
  151. Assert.Equal(1, reduceKeyAndTypes.Count);
  152. Assert.Equal("reduceKey4", reduceKeyAndTypes[0].ReduceKey);
  153. });
  154. }
  155. }
  156. [Theory]
  157. [PropertyData("Storages")]
  158. public void GetKeyStats(string requestedStorage)
  159. {
  160. using (var storage = NewTransactionalStorage(requestedStorage))
  161. {
  162. storage.Batch(accessor => Assert.Equal(0, accessor.MapReduce.GetKeysStats(303, 0, 10).Count()));
  163. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 7));
  164. storage.Batch(accessor => Assert.Equal(1, accessor.MapReduce.GetKeysStats(303, 0, 10).Count()));
  165. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 7));
  166. storage.Batch(accessor => Assert.Equal(1, accessor.MapReduce.GetKeysStats(303, 0, 10).Count()));
  167. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey2", 7));
  168. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey3", 7));
  169. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(404, "reduceKey1", 7));
  170. storage.Batch(accessor => Assert.Equal(3, accessor.MapReduce.GetKeysStats(303, 0, 10).Count()));
  171. storage.Batch(accessor =>
  172. {
  173. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 1).ToList();
  174. Assert.Equal(1, keyStats.Count);
  175. var k1 = keyStats[0];
  176. keyStats = accessor.MapReduce.GetKeysStats(303, 1, 1).ToList();
  177. Assert.Equal(1, keyStats.Count);
  178. var k2 = keyStats[0];
  179. keyStats = accessor.MapReduce.GetKeysStats(303, 2, 1).ToList();
  180. Assert.Equal(1, keyStats.Count);
  181. var k3 = keyStats[0];
  182. Assert.NotEqual(k1.Key, k2.Key);
  183. Assert.NotEqual(k1.Key, k3.Key);
  184. Assert.NotEqual(k2.Key, k3.Key);
  185. keyStats = accessor.MapReduce.GetKeysStats(303, 1, 2).ToList();
  186. Assert.Equal(2, keyStats.Count);
  187. Assert.Equal(k2.Key, keyStats[0].Key);
  188. Assert.Equal(k3.Key, keyStats[1].Key);
  189. keyStats = accessor.MapReduce.GetKeysStats(303, 2, 2).ToList();
  190. Assert.Equal(1, keyStats.Count);
  191. Assert.Equal(k3.Key, keyStats[0].Key);
  192. keyStats = accessor.MapReduce.GetKeysStats(303, 0, 5).ToList();
  193. Assert.Equal(3, keyStats.Count);
  194. Assert.Equal(k1.Key, keyStats[0].Key);
  195. Assert.Equal(k2.Key, keyStats[1].Key);
  196. Assert.Equal(k3.Key, keyStats[2].Key);
  197. keyStats = accessor.MapReduce.GetKeysStats(303, 5, 55).ToList();
  198. Assert.Equal(0, keyStats.Count);
  199. keyStats = accessor.MapReduce.GetKeysStats(404, 0, 10).ToList();
  200. Assert.Equal(1, keyStats.Count);
  201. Assert.Equal("reduceKey1", keyStats[0].Key);
  202. });
  203. }
  204. }
  205. [Theory]
  206. [PropertyData("Storages")]
  207. public void UpdatePerformedReduceType(string requestedStorage)
  208. {
  209. using (var storage = NewTransactionalStorage(requestedStorage))
  210. {
  211. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 5));
  212. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey1", ReduceType.None));
  213. storage.Batch(
  214. accessor =>
  215. {
  216. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  217. Assert.Equal(1, keyStats.Count);
  218. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  219. Assert.Equal(1, reduceKeysAndTypes.Count);
  220. Assert.Equal("reduceKey1", reduceKeysAndTypes[0].ReduceKey);
  221. Assert.Equal(ReduceType.None, reduceKeysAndTypes[0].OperationTypeToPerform);
  222. });
  223. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey1", ReduceType.SingleStep));
  224. storage.Batch(
  225. accessor =>
  226. {
  227. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  228. Assert.Equal(1, keyStats.Count);
  229. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  230. Assert.Equal(1, reduceKeysAndTypes.Count);
  231. Assert.Equal("reduceKey1", reduceKeysAndTypes[0].ReduceKey);
  232. Assert.Equal(ReduceType.SingleStep, reduceKeysAndTypes[0].OperationTypeToPerform);
  233. });
  234. }
  235. }
  236. [Theory]
  237. [PropertyData("Storages")]
  238. public void IncrementReduceKeyCounterDoesNotInterfereWithUpdatePerformedReduceType(string requestedStorage)
  239. {
  240. using (var storage = NewTransactionalStorage(requestedStorage))
  241. {
  242. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 5));
  243. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(303, "reduceKey1", ReduceType.MultiStep));
  244. storage.Batch(
  245. accessor =>
  246. {
  247. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  248. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  249. Assert.Equal(1, reduceKeysAndTypes.Count);
  250. Assert.Equal("reduceKey1", reduceKeysAndTypes[0].ReduceKey);
  251. Assert.Equal(ReduceType.MultiStep, reduceKeysAndTypes[0].OperationTypeToPerform);
  252. Assert.Equal(1, keyStats.Count);
  253. Assert.Equal("reduceKey1", keyStats[0].Key);
  254. Assert.Equal(5, keyStats[0].Count);
  255. });
  256. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(404, "reduceKey2", 5));
  257. storage.Batch(accessor => accessor.MapReduce.UpdatePerformedReduceType(404, "reduceKey2", ReduceType.MultiStep));
  258. storage.Batch(
  259. accessor =>
  260. {
  261. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(404, 0, 10).ToList();
  262. var keyStats = accessor.MapReduce.GetKeysStats(404, 0, 10).ToList();
  263. Assert.Equal(1, reduceKeysAndTypes.Count);
  264. Assert.Equal("reduceKey2", reduceKeysAndTypes[0].ReduceKey);
  265. Assert.Equal(ReduceType.MultiStep, reduceKeysAndTypes[0].OperationTypeToPerform);
  266. Assert.Equal(1, keyStats.Count);
  267. Assert.Equal("reduceKey2", keyStats[0].Key);
  268. Assert.Equal(5, keyStats[0].Count);
  269. });
  270. }
  271. }
  272. [Theory]
  273. [PropertyData("Storages")]
  274. public void PutMappedResult(string requestedStorage)
  275. {
  276. using (var storage = NewTransactionalStorage(requestedStorage))
  277. {
  278. storage.Batch(x => x.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data1" } }));
  279. storage.Batch(x =>
  280. {
  281. var results = x.MapReduce.GetMappedResults(303, new HashSet<string> { "reduceKey1" }, true, 100, new HashSet<string>(), CancellationToken.None);
  282. Assert.Equal(1, results.Count);
  283. var result = results[0];
  284. Assert.NotEqual(Etag.InvalidEtag, result.Etag);
  285. Assert.Equal("reduceKey1", result.ReduceKey);
  286. Assert.True(result.Size > 0);
  287. Assert.Null(result.Source);
  288. Assert.Equal(UtcNow, result.Timestamp);
  289. Assert.Equal("data1", result.Data["data"]);
  290. });
  291. storage.Batch(x => x.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data2" } }));
  292. storage.Batch(x =>
  293. {
  294. var results = x.MapReduce.GetMappedResults(303, new HashSet<string> { "reduceKey1" }, true, 100, new HashSet<string>(), CancellationToken.None);
  295. Assert.Equal(2, results.Count);
  296. var result1 = results[0];
  297. Assert.NotEqual(Etag.InvalidEtag, result1.Etag);
  298. Assert.Equal("reduceKey1", result1.ReduceKey);
  299. Assert.True(result1.Size > 0);
  300. Assert.Null(result1.Source);
  301. Assert.Equal(UtcNow, result1.Timestamp);
  302. Assert.Equal("data1", result1.Data["data"]);
  303. var result2 = results[1];
  304. Assert.NotEqual(Etag.InvalidEtag, result2.Etag);
  305. Assert.Equal("reduceKey1", result2.ReduceKey);
  306. Assert.True(result2.Size > 0);
  307. Assert.Null(result2.Source);
  308. Assert.Equal(UtcNow, result2.Timestamp);
  309. Assert.Equal("data2", result2.Data["data"]);
  310. });
  311. }
  312. }
  313. [Theory]
  314. [PropertyData("Storages")]
  315. public void DeleteMappedResultsForDocumentId(string requestedStorage)
  316. {
  317. using (var storage = NewTransactionalStorage(requestedStorage))
  318. {
  319. storage.Batch(x =>
  320. {
  321. var removed = new Dictionary<ReduceKeyAndBucket, int>();
  322. x.MapReduce.DeleteMappedResultsForDocumentId("doc1", 303, removed);
  323. Assert.Equal(0, removed.Count);
  324. });
  325. storage.Batch(x => x.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data1" } }));
  326. storage.Batch(
  327. x =>
  328. {
  329. var results = x.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1" }, true, 100, new HashSet<string>(), CancellationToken.None);
  330. Assert.Equal(1, results.Count);
  331. });
  332. storage.Batch(x =>
  333. {
  334. var removed = new Dictionary<ReduceKeyAndBucket, int>();
  335. x.MapReduce.DeleteMappedResultsForDocumentId("doc1", 303, removed);
  336. Assert.Equal(1, removed.Count);
  337. });
  338. storage.Batch(
  339. x =>
  340. {
  341. var results = x.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1" }, true, 100, new HashSet<string>(), CancellationToken.None);
  342. Assert.Equal(0, results.Count);
  343. });
  344. }
  345. }
  346. [Theory]
  347. [PropertyData("Storages")]
  348. public void DeleteMappedResultsForDocumentIdMultipleMappedResults(string requestedStorage)
  349. {
  350. using (var storage = NewTransactionalStorage(requestedStorage))
  351. {
  352. storage.Batch(x => x.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data1" } }));
  353. storage.Batch(x => x.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data2" } }));
  354. storage.Batch(x => x.MapReduce.PutMappedResult(303, "doc2", "reduceKey1", new RavenJObject { { "data", "data3" } }));
  355. storage.Batch(
  356. x =>
  357. {
  358. var results = x.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  359. Assert.Equal(3, results.Count);
  360. });
  361. storage.Batch(x =>
  362. {
  363. var removed = new Dictionary<ReduceKeyAndBucket, int>();
  364. x.MapReduce.DeleteMappedResultsForDocumentId("doc1", 303, removed);
  365. Assert.Equal(1, removed.Count);
  366. var item = removed.First();
  367. Assert.Equal("reduceKey1", item.Key.ReduceKey);
  368. Assert.Equal(2, item.Value);
  369. });
  370. storage.Batch(
  371. x =>
  372. {
  373. var results = x.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  374. Assert.Equal(1, results.Count);
  375. });
  376. }
  377. }
  378. [Theory]
  379. [PropertyData("Storages")]
  380. public void UpdateRemovedMapReduceStats(string requestedStorage)
  381. {
  382. using (var storage = NewTransactionalStorage(requestedStorage))
  383. {
  384. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 7));
  385. storage.Batch(accessor => accessor.MapReduce.IncrementReduceKeyCounter(404, "reduceKey1", 3));
  386. storage.Batch(accessor =>
  387. {
  388. var removed = new Dictionary<ReduceKeyAndBucket, int>();
  389. accessor.MapReduce.UpdateRemovedMapReduceStats(303, removed, CancellationToken.None);
  390. });
  391. storage.Batch(accessor =>
  392. {
  393. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  394. Assert.Equal(0, reduceKeysAndTypes.Count);
  395. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  396. Assert.Equal(1, keyStats.Count);
  397. var k1 = keyStats[0];
  398. Assert.Equal("reduceKey1", k1.Key);
  399. Assert.Equal(7, k1.Count);
  400. });
  401. storage.Batch(accessor =>
  402. {
  403. var removed = new Dictionary<ReduceKeyAndBucket, int>
  404. {
  405. { new ReduceKeyAndBucket(123, "reduceKey1"), 3 }
  406. };
  407. accessor.MapReduce.UpdateRemovedMapReduceStats(303, removed, CancellationToken.None);
  408. });
  409. storage.Batch(accessor =>
  410. {
  411. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  412. Assert.Equal(0, reduceKeysAndTypes.Count);
  413. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  414. Assert.Equal(1, keyStats.Count);
  415. var k1 = keyStats[0];
  416. Assert.Equal("reduceKey1", k1.Key);
  417. Assert.Equal(4, k1.Count);
  418. });
  419. storage.Batch(accessor =>
  420. {
  421. var removed = new Dictionary<ReduceKeyAndBucket, int>
  422. {
  423. { new ReduceKeyAndBucket(123, "reduceKey1"), 4 }
  424. };
  425. accessor.MapReduce.UpdateRemovedMapReduceStats(303, removed, CancellationToken.None);
  426. accessor.MapReduce.UpdateRemovedMapReduceStats(404, removed, CancellationToken.None);
  427. });
  428. storage.Batch(accessor =>
  429. {
  430. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  431. Assert.Equal(0, reduceKeysAndTypes.Count);
  432. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  433. Assert.Equal(0, keyStats.Count);
  434. reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(404, 0, 10).ToList();
  435. Assert.Equal(0, reduceKeysAndTypes.Count);
  436. keyStats = accessor.MapReduce.GetKeysStats(404, 0, 10).ToList();
  437. Assert.Equal(1, keyStats.Count);
  438. var k1 = keyStats[0];
  439. Assert.Equal("reduceKey1", k1.Key);
  440. Assert.Equal(-1, k1.Count);
  441. });
  442. }
  443. }
  444. [Theory]
  445. [PropertyData("Storages")]
  446. public void DeleteMappedResultsForView(string requestedStorage)
  447. {
  448. using (var storage = NewTransactionalStorage(requestedStorage))
  449. {
  450. storage.Batch(accessor => accessor.MapReduce.DeleteMappedResultsForView(303, CancellationToken.None));
  451. storage.Batch(accessor =>
  452. {
  453. var results = accessor.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  454. Assert.Equal(0, results.Count);
  455. results = accessor.MapReduce.GetMappedResults(404, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  456. Assert.Equal(0, results.Count);
  457. });
  458. storage.Batch(accessor =>
  459. {
  460. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data1" } });
  461. accessor.MapReduce.PutMappedResult(303, "doc2", "reduceKey1", new RavenJObject { { "data", "data2" } });
  462. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey2", new RavenJObject { { "data", "data3" } });
  463. accessor.MapReduce.PutMappedResult(404, "doc1", "reduceKey1", new RavenJObject { { "data", "data4" } });
  464. accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey1", 2);
  465. accessor.MapReduce.IncrementReduceKeyCounter(303, "reduceKey2", 1);
  466. accessor.MapReduce.IncrementReduceKeyCounter(404, "reduceKey1", 1);
  467. });
  468. storage.Batch(accessor =>
  469. {
  470. var results = accessor.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  471. Assert.Equal(3, results.Count);
  472. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  473. Assert.Equal(0, reduceKeysAndTypes.Count);
  474. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  475. Assert.Equal(2, keyStats.Count);
  476. var k1 = keyStats[0];
  477. Assert.Equal("reduceKey1", k1.Key);
  478. Assert.Equal(2, k1.Count);
  479. var k2 = keyStats[1];
  480. Assert.Equal("reduceKey2", k2.Key);
  481. Assert.Equal(1, k2.Count);
  482. results = accessor.MapReduce
  483. .GetMappedResults(404, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None)
  484. .ToList();
  485. Assert.Equal(1, results.Count);
  486. reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(404, 0, 10).ToList();
  487. Assert.Equal(0, reduceKeysAndTypes.Count);
  488. keyStats = accessor.MapReduce.GetKeysStats(404, 0, 10).ToList();
  489. Assert.Equal(1, keyStats.Count);
  490. k1 = keyStats[0];
  491. Assert.Equal("reduceKey1", k1.Key);
  492. Assert.Equal(1, k1.Count);
  493. });
  494. storage.Batch(accessor => accessor.MapReduce.DeleteMappedResultsForView(303, CancellationToken.None));
  495. storage.Batch(accessor =>
  496. {
  497. var results = accessor.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  498. Assert.Equal(0, results.Count);
  499. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  500. Assert.Equal(0, reduceKeysAndTypes.Count);
  501. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  502. Assert.Equal(0, keyStats.Count);
  503. results = accessor.MapReduce.GetMappedResults(404, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  504. Assert.Equal(1, results.Count);
  505. reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(404, 0, 10).ToList();
  506. Assert.Equal(0, reduceKeysAndTypes.Count);
  507. keyStats = accessor.MapReduce.GetKeysStats(404, 0, 10).ToList();
  508. Assert.Equal(1, keyStats.Count);
  509. var k1 = keyStats[0];
  510. Assert.Equal("reduceKey1", k1.Key);
  511. Assert.Equal(1, k1.Count);
  512. });
  513. storage.Batch(accessor => accessor.MapReduce.DeleteMappedResultsForView(404, CancellationToken.None));
  514. storage.Batch(accessor =>
  515. {
  516. var results = accessor.MapReduce.GetMappedResults(303, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  517. Assert.Equal(0, results.Count);
  518. var reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(303, 0, 10).ToList();
  519. Assert.Equal(0, reduceKeysAndTypes.Count);
  520. var keyStats = accessor.MapReduce.GetKeysStats(303, 0, 10).ToList();
  521. Assert.Equal(0, keyStats.Count);
  522. results = accessor.MapReduce.GetMappedResults(404, new HashSet<string>() { "reduceKey1", "reduceKey2" }, true, 100, new HashSet<string>(), CancellationToken.None);
  523. Assert.Equal(0, results.Count);
  524. reduceKeysAndTypes = accessor.MapReduce.GetReduceKeysAndTypes(404, 0, 10).ToList();
  525. Assert.Equal(0, reduceKeysAndTypes.Count);
  526. keyStats = accessor.MapReduce.GetKeysStats(404, 0, 10).ToList();
  527. Assert.Equal(0, keyStats.Count);
  528. });
  529. }
  530. }
  531. [Theory]
  532. [PropertyData("Storages")]
  533. public void GetKeysForIndexForDebug1(string requestedStorage)
  534. {
  535. using (var storage = NewTransactionalStorage(requestedStorage))
  536. {
  537. storage.Batch(accessor =>
  538. {
  539. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data1" } });
  540. accessor.MapReduce.PutMappedResult(303, "doc2", "reduceKey2", new RavenJObject { { "data", "data2" } });
  541. accessor.MapReduce.PutMappedResult(303, "doc3", "reduceKey3", new RavenJObject { { "data", "data3" } });
  542. accessor.MapReduce.PutMappedResult(404, "doc1", "reduceKey4", new RavenJObject { { "data", "data4" } });
  543. });
  544. storage.Batch(accessor =>
  545. {
  546. var keys = accessor.MapReduce
  547. .GetKeysForIndexForDebug(303, null, null, 0, 10)
  548. .ToList();
  549. Assert.Equal(3, keys.Count);
  550. Assert.True(keys.Contains("reduceKey1"));
  551. Assert.True(keys.Contains("reduceKey2"));
  552. Assert.True(keys.Contains("reduceKey3"));
  553. keys = accessor.MapReduce
  554. .GetKeysForIndexForDebug(404, null, null, 0, 10)
  555. .ToList();
  556. Assert.Equal(1, keys.Count);
  557. Assert.Equal("reduceKey4", keys[0]);
  558. keys = accessor.MapReduce
  559. .GetKeysForIndexForDebug(505, null, null, 0, 10)
  560. .ToList();
  561. Assert.Equal(0, keys.Count);
  562. });
  563. storage.Batch(accessor =>
  564. {
  565. var keys = accessor.MapReduce
  566. .GetKeysForIndexForDebug(303, null, null, 0, 10)
  567. .ToList();
  568. var k1 = keys[0];
  569. var k2 = keys[1];
  570. var k3 = keys[2];
  571. keys = accessor.MapReduce
  572. .GetKeysForIndexForDebug(303, null, null, 0, 1)
  573. .ToList();
  574. Assert.Equal(1, keys.Count);
  575. Assert.Equal(k1, keys[0]);
  576. keys = accessor.MapReduce
  577. .GetKeysForIndexForDebug(303, null, null, 1, 1)
  578. .ToList();
  579. Assert.Equal(1, keys.Count);
  580. Assert.Equal(k2, keys[0]);
  581. keys = accessor.MapReduce
  582. .GetKeysForIndexForDebug(303, null, null, 2, 1)
  583. .ToList();
  584. Assert.Equal(1, keys.Count);
  585. Assert.Equal(k3, keys[0]);
  586. keys = accessor.MapReduce
  587. .GetKeysForIndexForDebug(303, null, null, 3, 1)
  588. .ToList();
  589. Assert.Equal(0, keys.Count);
  590. keys = accessor.MapReduce
  591. .GetKeysForIndexForDebug(303, null, null, 0, 2)
  592. .ToList();
  593. Assert.Equal(2, keys.Count);
  594. Assert.Equal(k1, keys[0]);
  595. Assert.Equal(k2, keys[1]);
  596. keys = accessor.MapReduce
  597. .GetKeysForIndexForDebug(303, null, null, 1, 2)
  598. .ToList();
  599. Assert.Equal(2, keys.Count);
  600. Assert.Equal(k2, keys[0]);
  601. Assert.Equal(k3, keys[1]);
  602. keys = accessor.MapReduce
  603. .GetKeysForIndexForDebug(303, null, null, 2, 2)
  604. .ToList();
  605. Assert.Equal(1, keys.Count);
  606. Assert.Equal(k3, keys[0]);
  607. });
  608. }
  609. }
  610. [Theory]
  611. [PropertyData("Storages")]
  612. public void GetKeysForIndexForDebug2(string requestedStorage)
  613. {
  614. using (var storage = NewTransactionalStorage(requestedStorage))
  615. {
  616. storage.Batch(accessor =>
  617. {
  618. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey/1", new RavenJObject { { "data", "data1" } });
  619. accessor.MapReduce.PutMappedResult(303, "doc2", "reduceKey/2", new RavenJObject { { "data", "data2" } });
  620. accessor.MapReduce.PutMappedResult(303, "doc3", "reduceKey/3", new RavenJObject { { "data", "data3" } });
  621. accessor.MapReduce.PutMappedResult(404, "doc1", "reduceKey/4", new RavenJObject { { "data", "data4" } });
  622. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey/10", new RavenJObject { { "data", "data5" } });
  623. });
  624. storage.Batch(accessor =>
  625. {
  626. var keys = accessor.MapReduce
  627. .GetKeysForIndexForDebug(303, "reduceKey", null, 0, 10)
  628. .ToList();
  629. Assert.Equal(4, keys.Count);
  630. Assert.True(keys.Contains("reduceKey/1"));
  631. Assert.True(keys.Contains("reduceKey/2"));
  632. Assert.True(keys.Contains("reduceKey/3"));
  633. Assert.True(keys.Contains("reduceKey/10"));
  634. keys = accessor.MapReduce
  635. .GetKeysForIndexForDebug(303, "reduceKey/1", null, 0, 10)
  636. .ToList();
  637. Assert.Equal(2, keys.Count);
  638. Assert.True(keys.Contains("reduceKey/1"));
  639. Assert.True(keys.Contains("reduceKey/10"));
  640. });
  641. }
  642. }
  643. [Theory]
  644. [PropertyData("Storages")]
  645. public void GetKeysForIndexForDebug3(string requestedStorage)
  646. {
  647. using (var storage = NewTransactionalStorage(requestedStorage))
  648. {
  649. storage.Batch(accessor =>
  650. {
  651. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey/1", new RavenJObject { { "data", "data1" } });
  652. accessor.MapReduce.PutMappedResult(303, "doc2", "reduceKey/2", new RavenJObject { { "data", "data2" } });
  653. accessor.MapReduce.PutMappedResult(303, "doc3", "reduceKey/3", new RavenJObject { { "data", "data3" } });
  654. accessor.MapReduce.PutMappedResult(404, "doc1", "reduceKey/4", new RavenJObject { { "data", "data4" } });
  655. accessor.MapReduce.PutMappedResult(303, "doC1", "reduceKey/10", new RavenJObject { { "data", "data5" } });
  656. });
  657. storage.Batch(accessor =>
  658. {
  659. var keys = accessor.MapReduce
  660. .GetKeysForIndexForDebug(303, null, "doc1", 0, 10)
  661. .ToList();
  662. Assert.Equal(2, keys.Count);
  663. Assert.True(keys.Contains("reduceKey/1"));
  664. Assert.True(keys.Contains("reduceKey/10"));
  665. keys = accessor.MapReduce
  666. .GetKeysForIndexForDebug(303, null, "doc2", 0, 10)
  667. .ToList();
  668. Assert.Equal(1, keys.Count);
  669. Assert.True(keys.Contains("reduceKey/2"));
  670. });
  671. }
  672. }
  673. [Theory]
  674. [PropertyData("Storages")]
  675. public void GetMappedResultsForDebug(string requestedStorage)
  676. {
  677. using (var storage = NewTransactionalStorage(requestedStorage))
  678. {
  679. storage.Batch(accessor =>
  680. {
  681. accessor.MapReduce.PutMappedResult(303, "doc1", "reduceKey1", new RavenJObject { { "data", "data1" } });
  682. accessor.MapReduce.PutMappedResult(303, "doc2", "reduceKey2", new RavenJObject { { "data", "data2" } });
  683. accessor.MapReduce.PutMappedResult(303, "doc3", "reduceKey1", new RavenJObject { { "data", "data3" } });
  684. accessor.MapReduce.PutMappedResult(303, "doc4", "reduceKey1", new RavenJObject { { "data", "data4" } });
  685. accessor.MapReduce.PutMappedResult(404, "doc1", "reduceKey4", new RavenJObject { { "data", "data5" } });
  686. });
  687. storage.Batch(accessor =>
  688. {
  689. var results = accessor.MapReduce
  690. .GetMappedResultsForDebug(303, "reduceKey1", 0, 10)
  691. .ToList();
  692. Assert.Equal(3, results.Count);
  693. results = accessor.MapReduce
  694. .GetMappedResultsForDebug(303, "reduceKey2", 0, 10)
  695. .ToList();
  696. Assert.Equal(1, results.Count);
  697. results = accessor.MapReduce
  698. .GetMappedResultsForDebug(404, "reduceKey4", 0, 10)
  699. .ToList();
  700. Assert.Equal(1, results.Count);
  701. results = accessor.MapReduce
  702. .GetMappedResultsForDebug(505, "reduceKey1", 0, 10)
  703. .ToList();
  704. Assert.Equal(0, results.Count);
  705. });
  706. storage.Batch(accessor =>
  707. {
  708. var results = accessor.MapReduce
  709. .GetMappedResultsForDebug(303, "reduceKey1", 0, 10)
  710. .ToList();
  711. var r1 = results[0];
  712. var r2 = results[1];
  713. var r3 = results[2];
  714. results = accessor.MapReduce
  715. .GetMappedResultsForDebug(303, "reduceKey1", 0, 1)
  716. .ToList();
  717. Assert.Equal(1, results.Count);
  718. Assert.Equal(r1.Data["data"], results[0].Data["data"]);
  719. results = accessor.MapReduce
  720. .GetMappedResultsForDebug(303, "reduceKey1", 1, 1)
  721. .ToList();
  722. Assert.Equal(1, results.Count);
  723. Assert.Equal(r2.Data["data"], results[0].Data["data"]);
  724. results = accessor.MapReduce
  725. .GetMappedResultsForDebug(303, "reduceKey1", 2, 1)
  726. .ToList();
  727. Assert.Equal(1, results.Count);
  728. Assert.Equal(r3.Data["data"], results[0].Data["data"]);
  729. results = accessor.MapReduce
  730. .GetMappedResultsForDebug(303, "reduceKey1", 4, 1)
  731. .ToList();
  732. Assert.Equal(0, results.Count);
  733. results = accessor.MapReduce
  734. .GetMappedResultsForDebug(303, "reduceKey1", 0, 2)
  735. .ToList();
  736. Assert.Equal(2, results.Count);
  737. Assert.Equal(r1.Data["data"], results[0].Data["data"]);
  738. Assert.Equal(r2.Data["data"], results[1].Data["data"]);
  739. results = accessor.MapReduce
  740. .GetMappedResultsForDebug(303, "reduceKey1", 1, 2)
  741. .ToList();
  742. Assert.Equal(2, results.Count);
  743. Assert.Equal(r2.Data["data"], results[0].Data["data"]);
  744. Assert.Equal(r3.Data["data"], results[1].Data["data"]);
  745. results = accessor.MapReduce
  746. .GetMappedResultsForDebug(303, "reduceKey1", 2, 2)
  747. .ToList();
  748. Assert.Equal(1, results.Count);
  749. Assert.Equal(r3.Data["data"], results[0].Data["data"]);
  750. });
  751. }
  752. }
  753. [Theory]
  754. [PropertyData("Storages")]
  755. public void GetReducedResultsForDebug(string requestedStorage)
  756. {
  757. using (var storage = NewTransactionalStorage(requestedStorage))
  758. {
  759. storage.Batch(accessor =>
  760. {
  761. accessor.MapReduce.PutReducedResult(303, "doc1", 1, 1, 1, new RavenJObject { { "data", "data1" } });
  762. accessor.MapReduce.PutReducedResult(303, "doc2", 1, 1, 1, new RavenJObject { { "data", "data2" } });
  763. accessor.MapReduce.PutReducedResult(303, "doc1", 2, 2, 1, new RavenJObject { { "data", "data3" } });
  764. accessor.MapReduce.PutReducedResult(303, "doc1", 1, 1, 1, new RavenJObject { { "data", "data4" } });
  765. accessor.MapReduce.PutReducedResult(303, "doc1", 1, 2, 1, new RavenJObject { { "data", "data5" } });
  766. accessor.MapReduce.PutReducedResult(303, "doc1", 2, 1, 1, new RavenJObject { { "data", "data6" } });
  767. accessor.MapReduce.PutReducedResult(404, "doc1", 1, 1, 1, new RavenJObject { { "data", "data7" } });
  768. });
  769. storage.Batch(accessor =>
  770. {
  771. var results = accessor.MapReduce
  772. .GetReducedResultsForDebug(303, "doc1", 1, 0, 10)
  773. .ToList();
  774. Assert.Equal(3, results.Count);
  775. results = accessor.MapReduce
  776. .GetReducedResultsForDebug(303, "doc2", 1, 0, 10)
  777. .ToList();
  778. Assert.Equal(1, results.Count);
  779. results = accessor.MapReduce
  780. .GetReducedResultsForDebug(303, "doc1", 2, 0, 10)
  781. .ToList();
  782. Assert.Equal(2, results.Count);
  783. results = accessor.MapReduce
  784. .GetReducedResultsForDebug(404, "doc1", 1, 0, 10)
  785. .ToList();
  786. Assert.Equal(1, results.Count);
  787. results = accessor.MapReduce
  788. .GetReducedResultsForDebug(303, "doc5", 1, 0, 10)
  789. .ToList();
  790. Assert.Equal(0, results.Count);
  791. });
  792. storage.Batch(accessor =>
  793. {
  794. var results = accessor.MapReduce
  795. .GetReducedResultsForDebug(303, "doc1", 1, 0, 10)
  796. .ToList();
  797. var r1 = results[0];
  798. var r2 = results[1];
  799. var r3 = results[2];
  800. results = accessor.MapReduce
  801. .GetReducedResultsForDebug(303, "doc1", 1, 0, 1)
  802. .ToList();
  803. Assert.Equal(1, results.Count);
  804. Assert.Equal(r1.Data["data"], results[0].Data["data"]);
  805. results = accessor.MapReduce
  806. .GetReducedResultsForDebug(303, "doc1", 1, 1, 1)
  807. .ToList();
  808. Assert.Equal(1, results.Count);
  809. Assert.Equal(r2.Data["data"], results[0].Data["data"]);
  810. results = accessor.MapReduce
  811. .GetReducedResultsForDebug(303, "doc1", 1, 2, 1)
  812. .ToList();
  813. Assert.Equal(1, results.Count);
  814. Assert.Equal(r3.Data["data"], results[0].Data["data"]);
  815. results = accessor.MapReduce
  816. .GetReducedResultsForDebug(303, "doc1", 1, 4, 1)
  817. .ToList();
  818. Assert.Equal(0, results.Count);
  819. results = accessor.MapReduce
  820. .GetReducedResultsForDebug(303, "doc1", 1, 0, 2)
  821. .ToList();
  822. Assert.Equal(2, results.Count);
  823. Assert.Equal(r1.Data["data"], results[0].Data["data"]);
  824. Assert.Equal(r2.Data["data"], results[1].Data["data"]);
  825. results = accessor.MapReduce
  826. .GetReducedResultsForDebug(303, "doc1", 1, 1, 2)
  827. .ToList();
  828. Assert.Equal(2, results.Count);
  829. Assert.Equal(r2.Data["data"], results[0].Data["data"]);
  830. Assert.Equal(r3.Data["data"], results[1].Data["data"]);
  831. results = accessor.MapReduce
  832. .GetReducedResultsForDebug(303, "doc1", 1, 2, 2)
  833. .ToList();
  834. Assert.Equal(1, results.Count);
  835. Assert.Equal(r3.Data["data"], results[0].Data["data"]);
  836. });
  837. }
  838. }
  839. [Theory]
  840. [PropertyData("Storages"