/ToMigrate/Raven.Tests.Issues/RavenDB-4153.cs

https://github.com/fitzchak/ravendb · C# · 403 lines · 335 code · 63 blank · 5 comment · 0 complexity · e2bdb82a7f5e216abdbed19f8da66158 MD5 · raw file

  1. // -----------------------------------------------------------------------
  2. // <copyright file="RavenDB-4153.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.Net.Http;
  8. using System.Threading;
  9. using Raven.Abstractions.Data;
  10. using Raven.Abstractions.Indexing;
  11. using Raven.Client.Connection;
  12. using Raven.Client.Document;
  13. using Raven.Database.Storage;
  14. using Raven.Json.Linq;
  15. using Raven.Tests.Common;
  16. using Xunit;
  17. using Xunit.Extensions;
  18. namespace Raven.Tests.Issues
  19. {
  20. public class RavenDB_4153 : RavenTest
  21. {
  22. const string IndexName = "test";
  23. [Theory]
  24. [PropertyData("Storages")]
  25. public void can_change_reduce_key_leaving_correct_stats1(string storageType)
  26. {
  27. using (var store = NewRemoteDocumentStore(requestedStorage: storageType))
  28. {
  29. using (var session = store.OpenSession())
  30. {
  31. session.Store(new Order{ Company = "companies/1"});
  32. session.SaveChanges();
  33. }
  34. CreateIndex(store);
  35. WaitForIndexing(store);
  36. var json = GetIndexKeysStats(store);
  37. Assert.Equal(1, json["Count"]);
  38. var results = ((RavenJArray)json["Results"])
  39. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  40. Assert.Equal(1, results.Count);
  41. Assert.Equal(1, results[0].Count);
  42. Assert.Equal("companies/1", results[0].Key);
  43. using (var session = store.OpenSession())
  44. {
  45. var order = session.Load<Order>("orders/1");
  46. order.Company = "companies/2";
  47. session.SaveChanges();
  48. }
  49. WaitForIndexing(store);
  50. json = GetIndexKeysStats(store);
  51. Assert.Equal(1, json["Count"]);
  52. results = ((RavenJArray)json["Results"])
  53. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  54. Assert.Equal(1, results.Count);
  55. Assert.Equal(1, results[0].Count);
  56. Assert.Equal("companies/2", results[0].Key);
  57. using (var session = store.OpenSession())
  58. {
  59. var order = session.Load<Order>("orders/1");
  60. order.Company = "companies/3";
  61. session.SaveChanges();
  62. }
  63. WaitForIndexing(store);
  64. json = GetIndexKeysStats(store);
  65. Assert.Equal(1, json["Count"]);
  66. results = ((RavenJArray)json["Results"])
  67. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  68. Assert.Equal(1, results.Count);
  69. Assert.Equal(1, results[0].Count);
  70. Assert.Equal("companies/3", results[0].Key);
  71. using (var session = store.OpenSession())
  72. {
  73. var order = session.Load<Order>("orders/1");
  74. order.Company = null;
  75. session.SaveChanges();
  76. }
  77. WaitForIndexing(store);
  78. json = GetIndexKeysStats(store);
  79. Assert.Equal(0, json["Count"]);
  80. results = ((RavenJArray)json["Results"])
  81. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  82. Assert.Equal(0, results.Count);
  83. }
  84. }
  85. [Theory]
  86. [PropertyData("Storages")]
  87. public void can_change_reduce_key_leaving_correct_stats2(string storageType)
  88. {
  89. using (var store = NewRemoteDocumentStore(requestedStorage: storageType))
  90. {
  91. using (var session = store.OpenSession())
  92. {
  93. session.Store(new Order{ Company = "companies/1"});
  94. session.SaveChanges();
  95. }
  96. CreateIndex(store);
  97. WaitForIndexing(store);
  98. using (var session = store.OpenSession())
  99. {
  100. session.Delete("orders/1");
  101. session.SaveChanges();
  102. }
  103. WaitForIndexing(store);
  104. var json = GetIndexKeysStats(store);
  105. Assert.Equal(0, json["Count"]);
  106. var results = ((RavenJArray)json["Results"])
  107. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  108. Assert.Equal(0, results.Count);
  109. }
  110. }
  111. [Theory]
  112. [PropertyData("Storages")]
  113. public void can_change_reduce_key_leaving_correct_stats3(string storageType)
  114. {
  115. using (var store = NewRemoteDocumentStore(requestedStorage: storageType))
  116. {
  117. using (var session = store.OpenSession())
  118. {
  119. session.Store(new Order { Company = "companies/1" });
  120. session.Store(new Order { Company = "companies/1" });
  121. session.Store(new Order { Company = "companies/1" });
  122. session.SaveChanges();
  123. }
  124. CreateIndex(store);
  125. WaitForIndexing(store);
  126. var json = GetIndexKeysStats(store);
  127. Assert.Equal(1, json["Count"]);
  128. var results = ((RavenJArray)json["Results"])
  129. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  130. Assert.Equal(1, results.Count);
  131. Assert.Equal(3, results[0].Count);
  132. Assert.Equal("companies/1", results[0].Key);
  133. using (var session = store.OpenSession())
  134. {
  135. session.Delete("orders/2");
  136. session.SaveChanges();
  137. }
  138. WaitForIndexing(store);
  139. json = GetIndexKeysStats(store);
  140. Assert.Equal(1, json["Count"]);
  141. results = ((RavenJArray)json["Results"])
  142. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  143. Assert.Equal(1, results.Count);
  144. Assert.Equal(2, results[0].Count);
  145. Assert.Equal("companies/1", results[0].Key);
  146. using (var session = store.OpenSession())
  147. {
  148. session.Delete("orders/3");
  149. session.SaveChanges();
  150. }
  151. WaitForIndexing(store);
  152. json = GetIndexKeysStats(store);
  153. Assert.Equal(1, json["Count"]);
  154. results = ((RavenJArray)json["Results"])
  155. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  156. Assert.Equal(1, results.Count);
  157. Assert.Equal(1, results[0].Count);
  158. Assert.Equal("companies/1", results[0].Key);
  159. using (var session = store.OpenSession())
  160. {
  161. session.Delete("orders/1");
  162. session.SaveChanges();
  163. }
  164. WaitForIndexing(store);
  165. json = GetIndexKeysStats(store);
  166. Assert.Equal(0, json["Count"]);
  167. results = ((RavenJArray)json["Results"])
  168. .Deserialize<List<ReduceKeyAndCount>>(store.Conventions);
  169. Assert.Equal(0, results.Count);
  170. }
  171. }
  172. [Theory]
  173. [PropertyData("Storages")]
  174. public void updating_performed_reduce_type_shouldnt_update_if_reduce_key_removed1(string storageType)
  175. {
  176. const int a = 100;
  177. using (var storage = NewTransactionalStorage(requestedStorage: storageType))
  178. {
  179. storage.Batch(accessor =>
  180. {
  181. accessor.Indexing.AddIndex(a, true);
  182. accessor.MapReduce.PutMappedResult(a, "a/1", "a", new RavenJObject());
  183. accessor.MapReduce.PutMappedResult(a, "a/2", "a", new RavenJObject());
  184. accessor.MapReduce.PutMappedResult(a, "a/3", "b", new RavenJObject());
  185. accessor.MapReduce.PutMappedResult(a, "a/4", "b", new RavenJObject());
  186. accessor.MapReduce.IncrementReduceKeyCounter(a, "a", 2);
  187. accessor.MapReduce.IncrementReduceKeyCounter(a, "b", 2);
  188. });
  189. storage.Batch(accessor =>
  190. {
  191. accessor.MapReduce.UpdatePerformedReduceType(a, "a", ReduceType.SingleStep);
  192. accessor.MapReduce.UpdatePerformedReduceType(a, "b", ReduceType.SingleStep);
  193. });
  194. storage.Batch(accessor =>
  195. {
  196. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  197. Assert.Equal(ReduceType.SingleStep, result);
  198. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  199. Assert.Equal(ReduceType.SingleStep, result);
  200. });
  201. storage.Batch(accessor => accessor.Indexing.DeleteIndex(a, new CancellationToken()));
  202. storage.Batch(accessor =>
  203. {
  204. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  205. Assert.Equal(ReduceType.None, result);
  206. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  207. Assert.Equal(ReduceType.None, result);
  208. });
  209. storage.Batch(accessor =>
  210. {
  211. accessor.MapReduce.UpdatePerformedReduceType(a, "a", ReduceType.SingleStep);
  212. accessor.MapReduce.UpdatePerformedReduceType(a, "b", ReduceType.SingleStep);
  213. });
  214. storage.Batch(accessor =>
  215. {
  216. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  217. Assert.Equal(ReduceType.None, result);
  218. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  219. Assert.Equal(ReduceType.None, result);
  220. });
  221. }
  222. }
  223. [Theory]
  224. [PropertyData("Storages")]
  225. public void updating_performed_reduce_type_shouldnt_update_if_reduce_key_removed2(string storageType)
  226. {
  227. const int a = 100;
  228. using (var storage = NewTransactionalStorage(requestedStorage: storageType))
  229. {
  230. storage.Batch(accessor =>
  231. {
  232. accessor.Indexing.AddIndex(a, true);
  233. accessor.MapReduce.PutMappedResult(a, "a/1", "a", new RavenJObject());
  234. accessor.MapReduce.PutMappedResult(a, "a/2", "a", new RavenJObject());
  235. accessor.MapReduce.PutMappedResult(a, "a/3", "b", new RavenJObject());
  236. accessor.MapReduce.PutMappedResult(a, "a/4", "b", new RavenJObject());
  237. accessor.MapReduce.IncrementReduceKeyCounter(a, "a", 2);
  238. accessor.MapReduce.IncrementReduceKeyCounter(a, "b", 2);
  239. });
  240. storage.Batch(accessor =>
  241. {
  242. accessor.MapReduce.UpdatePerformedReduceType(a, "a", ReduceType.MultiStep);
  243. accessor.MapReduce.UpdatePerformedReduceType(a, "b", ReduceType.SingleStep);
  244. });
  245. storage.Batch(accessor =>
  246. {
  247. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  248. Assert.Equal(ReduceType.MultiStep, result);
  249. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  250. Assert.Equal(ReduceType.SingleStep, result);
  251. });
  252. storage.Batch(accessor =>
  253. {
  254. var removed = new Dictionary<ReduceKeyAndBucket, int>();
  255. accessor.MapReduce.DeleteMappedResultsForDocumentId("a/3", a, removed);
  256. accessor.MapReduce.DeleteMappedResultsForDocumentId("a/4", a, removed);
  257. accessor.MapReduce.UpdateRemovedMapReduceStats(a, removed, CancellationToken.None);
  258. var reduceKeys = removed.Keys;
  259. foreach (var reduceKey in reduceKeys)
  260. {
  261. accessor.MapReduce.UpdatePerformedReduceType(a, reduceKey.ReduceKey,
  262. ReduceType.SingleStep, skipAdd: true);
  263. }
  264. });
  265. storage.Batch(accessor =>
  266. {
  267. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  268. Assert.Equal(ReduceType.MultiStep, result);
  269. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  270. Assert.Equal(ReduceType.None, result);
  271. });
  272. storage.Batch(accessor =>
  273. {
  274. var removed = new Dictionary<ReduceKeyAndBucket, int>();
  275. accessor.MapReduce.DeleteMappedResultsForDocumentId("a/1", a, removed);
  276. accessor.MapReduce.DeleteMappedResultsForDocumentId("a/2", a, removed);
  277. accessor.MapReduce.UpdateRemovedMapReduceStats(a, removed, CancellationToken.None);
  278. var reduceKeys = removed.Keys;
  279. foreach (var reduceKey in reduceKeys)
  280. {
  281. accessor.MapReduce.UpdatePerformedReduceType(a, reduceKey.ReduceKey,
  282. ReduceType.SingleStep, skipAdd: true);
  283. }
  284. });
  285. storage.Batch(accessor =>
  286. {
  287. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  288. Assert.Equal(ReduceType.None, result);
  289. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  290. Assert.Equal(ReduceType.None, result);
  291. });
  292. storage.Batch(accessor =>
  293. {
  294. accessor.MapReduce.UpdatePerformedReduceType(a, "a", ReduceType.SingleStep);
  295. accessor.MapReduce.UpdatePerformedReduceType(a, "b", ReduceType.SingleStep);
  296. });
  297. storage.Batch(accessor =>
  298. {
  299. var result = accessor.MapReduce.GetLastPerformedReduceType(a, "a");
  300. Assert.Equal(ReduceType.None, result);
  301. result = accessor.MapReduce.GetLastPerformedReduceType(a, "b");
  302. Assert.Equal(ReduceType.None, result);
  303. });
  304. }
  305. }
  306. private static void CreateIndex(DocumentStore store)
  307. {
  308. store.DatabaseCommands.PutIndex(IndexName, new IndexDefinition
  309. {
  310. Name = IndexName,
  311. Map = @"from order in docs.Orders
  312. select new {order.Company,
  313. Count = 1
  314. }",
  315. Reduce = @"from result in results
  316. group result by result.Company into g
  317. select new {
  318. Company = g.Key,
  319. Count = g.Sum(x => x.Count)
  320. }"
  321. });
  322. }
  323. private static RavenJObject GetIndexKeysStats(DocumentStore store)
  324. {
  325. var request = store.JsonRequestFactory.CreateHttpJsonRequest(
  326. new CreateHttpJsonRequestParams(null,
  327. store.Url + string.Format("/databases/{0}/indexes/{1}?debug=keys", store.DefaultDatabase, IndexName),
  328. HttpMethod.Get,
  329. store.DatabaseCommands.PrimaryCredentials,
  330. store.Conventions));
  331. var json = (RavenJObject)request.ReadResponseJson();
  332. return json;
  333. }
  334. public class Order
  335. {
  336. public string Id { get; set; }
  337. public string Company { get; set; }
  338. }
  339. }
  340. }