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

https://github.com/fitzchak/ravendb · C# · 479 lines · 428 code · 49 blank · 2 comment · 0 complexity · 072d287114b6a83afa252aa72d27af3e MD5 · raw file

  1. using System.IO;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Raven.Abstractions.Data;
  5. using Raven.Abstractions.Indexing;
  6. using Raven.Abstractions.Smuggler;
  7. using Raven.Client;
  8. using Raven.Client.Document;
  9. using Raven.Client.Extensions;
  10. using Raven.Client.Indexes;
  11. using Raven.Database.Extensions;
  12. using Raven.Smuggler;
  13. using Raven.Tests.Helpers;
  14. using Xunit;
  15. namespace Raven.Tests.Issues
  16. {
  17. public class RavenDB_3152 : RavenTestBase
  18. {
  19. [Fact]
  20. public async Task Smuggler_filtering_next_etag()
  21. {
  22. using (var server = GetNewServer())
  23. {
  24. using (var store = new DocumentStore {Url = server.SystemDatabase.Configuration.ServerUrl}.Initialize())
  25. {
  26. store
  27. .DatabaseCommands
  28. .GlobalAdmin
  29. .CreateDatabase(new DatabaseDocument
  30. {
  31. Id = "Dba1",
  32. Settings =
  33. {
  34. {"Raven/DataDir", "Dba1"}
  35. }
  36. });
  37. store.DatabaseCommands.EnsureDatabaseExists("Dba1");
  38. store
  39. .DatabaseCommands
  40. .GlobalAdmin
  41. .CreateDatabase(new DatabaseDocument
  42. {
  43. Id = "Dba2",
  44. Settings =
  45. {
  46. {"Raven/DataDir", "Dba2"}
  47. }
  48. });
  49. store.DatabaseCommands.EnsureDatabaseExists("Dba2");
  50. }
  51. using (var store1 = new DocumentStore
  52. {
  53. Url = server.SystemDatabase.Configuration.ServerUrl,
  54. DefaultDatabase = "Dba1"
  55. }.Initialize())
  56. {
  57. StoreWorkerseDba1(store1);
  58. using (var session = store1.OpenSession())
  59. {
  60. var workers = session.Query<Worker>().ToList();
  61. Assert.Equal(3, workers.Count);
  62. var index1 = store1.DatabaseCommands.GetIndex("WorkerByName");
  63. var index2 = store1.DatabaseCommands.GetIndex("WorkerByAge");
  64. var index3 = store1.DatabaseCommands.GetIndex("WorkerAccountNumber");
  65. Assert.Equal("WorkerByName", index1.Name);
  66. Assert.Equal("WorkerByAge", index2.Name);
  67. Assert.Equal("WorkerAccountNumber", index3.Name);
  68. }
  69. }
  70. SmugglerDatabaseApi smugglerApi = new SmugglerDatabaseApi(new SmugglerDatabaseOptions
  71. {
  72. OperateOnTypes = ItemType.Documents | ItemType.Indexes,
  73. Incremental = false
  74. });
  75. smugglerApi.Options.Filters.Add(new FilterSetting
  76. {
  77. Path = "Name",
  78. ShouldMatch = true,
  79. Values = { "worker/22", "worker/333" }
  80. });
  81. await smugglerApi.Between(
  82. new SmugglerBetweenOptions<RavenConnectionStringOptions>
  83. {
  84. From = new RavenConnectionStringOptions
  85. {
  86. Url = server.SystemDatabase.Configuration.ServerUrl,
  87. DefaultDatabase = "Dba1"
  88. },
  89. To = new RavenConnectionStringOptions
  90. {
  91. Url = server.SystemDatabase.Configuration.ServerUrl,
  92. DefaultDatabase = "Dba2"
  93. }
  94. });
  95. using (var store2 = new DocumentStore
  96. {
  97. Url = server.SystemDatabase.Configuration.ServerUrl,
  98. DefaultDatabase = "Dba2"
  99. }.Initialize())
  100. {
  101. using (var session = store2.OpenSession())
  102. {
  103. var workers = session.Query<Worker>().ToList();
  104. Assert.Equal(0, workers.Count);
  105. var index1 = store2.DatabaseCommands.GetIndex("WorkerByName");
  106. var index2 = store2.DatabaseCommands.GetIndex("WorkerByAge");
  107. var index3 = store2.DatabaseCommands.GetIndex("WorkerAccountNumber");
  108. Assert.Equal("WorkerByName", index1.Name);
  109. Assert.Equal("WorkerByAge", index2.Name);
  110. Assert.Equal("WorkerAccountNumber", index3.Name);
  111. }
  112. }
  113. }
  114. }
  115. [Fact]
  116. public async Task Smuggler_filtering_next_etag_incremental_between()
  117. {
  118. using (var server = GetNewServer())
  119. {
  120. using (var store = new DocumentStore { Url = server.SystemDatabase.Configuration.ServerUrl }.Initialize())
  121. {
  122. store
  123. .DatabaseCommands
  124. .GlobalAdmin
  125. .CreateDatabase(new DatabaseDocument
  126. {
  127. Id = "Dba1",
  128. Settings =
  129. {
  130. {"Raven/DataDir", "Dba1"}
  131. }
  132. });
  133. store.DatabaseCommands.EnsureDatabaseExists("Dba1");
  134. store
  135. .DatabaseCommands
  136. .GlobalAdmin
  137. .CreateDatabase(new DatabaseDocument
  138. {
  139. Id = "Dba2",
  140. Settings =
  141. {
  142. {"Raven/DataDir", "Dba2"}
  143. }
  144. });
  145. store.DatabaseCommands.EnsureDatabaseExists("Dba2");
  146. }
  147. using (var store1 = new DocumentStore
  148. {
  149. Url = server.SystemDatabase.Configuration.ServerUrl,
  150. DefaultDatabase = "Dba1"
  151. }.Initialize())
  152. {
  153. StoreWorkerseDba1(store1);
  154. using (var session = store1.OpenSession())
  155. {
  156. var workers = session.Query<Worker>().ToList();
  157. Assert.Equal(3, workers.Count);
  158. var index1 = store1.DatabaseCommands.GetIndex("WorkerByName");
  159. var index2 = store1.DatabaseCommands.GetIndex("WorkerByAge");
  160. var index3 = store1.DatabaseCommands.GetIndex("WorkerAccountNumber");
  161. Assert.Equal("WorkerByName", index1.Name);
  162. Assert.Equal("WorkerByAge", index2.Name);
  163. Assert.Equal("WorkerAccountNumber", index3.Name);
  164. }
  165. }
  166. SmugglerDatabaseApi smugglerApi = new SmugglerDatabaseApi(new SmugglerDatabaseOptions
  167. {
  168. OperateOnTypes = ItemType.Documents | ItemType.Indexes,
  169. Incremental = false
  170. });
  171. smugglerApi.Options.Filters.Add(new FilterSetting
  172. {
  173. Path = "Name",
  174. ShouldMatch = true,
  175. Values = { "worker/22", "worker/333" }
  176. });
  177. await smugglerApi.Between(
  178. new SmugglerBetweenOptions<RavenConnectionStringOptions>
  179. {
  180. From = new RavenConnectionStringOptions
  181. {
  182. Url = server.SystemDatabase.Configuration.ServerUrl,
  183. DefaultDatabase = "Dba1"
  184. },
  185. To = new RavenConnectionStringOptions
  186. {
  187. Url = server.SystemDatabase.Configuration.ServerUrl,
  188. DefaultDatabase = "Dba2"
  189. }
  190. });
  191. using (var store2 = new DocumentStore
  192. {
  193. Url = server.SystemDatabase.Configuration.ServerUrl,
  194. DefaultDatabase = "Dba2"
  195. }.Initialize())
  196. {
  197. using (var session = store2.OpenSession())
  198. {
  199. var workers = session.Query<Worker>().ToList();
  200. Assert.Equal(0, workers.Count);
  201. var index1 = store2.DatabaseCommands.GetIndex("WorkerByName");
  202. var index2 = store2.DatabaseCommands.GetIndex("WorkerByAge");
  203. var index3 = store2.DatabaseCommands.GetIndex("WorkerAccountNumber");
  204. Assert.Equal("WorkerByName", index1.Name);
  205. Assert.Equal("WorkerByAge", index2.Name);
  206. Assert.Equal("WorkerAccountNumber", index3.Name);
  207. }
  208. }
  209. using (var store1 = new DocumentStore
  210. {
  211. Url = server.SystemDatabase.Configuration.ServerUrl,
  212. DefaultDatabase = "Dba1"
  213. }.Initialize())
  214. {
  215. StoreWorkerseDba1(store1);
  216. }
  217. smugglerApi = new SmugglerDatabaseApi(new SmugglerDatabaseOptions
  218. {
  219. OperateOnTypes = ItemType.Documents | ItemType.Indexes,
  220. Incremental = true
  221. });
  222. smugglerApi.Options.Filters.Add(new FilterSetting
  223. {
  224. Path = "Name",
  225. ShouldMatch = true,
  226. Values = { "worker/22", "worker/33" }
  227. });
  228. await smugglerApi.Between(
  229. new SmugglerBetweenOptions<RavenConnectionStringOptions>
  230. {
  231. From = new RavenConnectionStringOptions
  232. {
  233. Url = server.SystemDatabase.Configuration.ServerUrl,
  234. DefaultDatabase = "Dba1"
  235. },
  236. To = new RavenConnectionStringOptions
  237. {
  238. Url = server.SystemDatabase.Configuration.ServerUrl,
  239. DefaultDatabase = "Dba2"
  240. }
  241. });
  242. using (var store2 = new DocumentStore
  243. {
  244. Url = server.SystemDatabase.Configuration.ServerUrl,
  245. DefaultDatabase = "Dba2"
  246. }.Initialize())
  247. {
  248. using (var session = store2.OpenSession())
  249. {
  250. var workers = session.Query<Worker>().ToList();
  251. Assert.Equal(0, workers.Count);
  252. var index1 = store2.DatabaseCommands.GetIndex("WorkerByName");
  253. var index2 = store2.DatabaseCommands.GetIndex("WorkerByAge");
  254. var index3 = store2.DatabaseCommands.GetIndex("WorkerAccountNumber");
  255. Assert.Equal("WorkerByName", index1.Name);
  256. Assert.Equal("WorkerByAge", index2.Name);
  257. Assert.Equal("WorkerAccountNumber", index3.Name);
  258. }
  259. }
  260. }
  261. }
  262. [Fact]
  263. public async Task Smuggler_filtering_next_etag_incremental_export_to_file()
  264. {
  265. using (var server = GetNewServer())
  266. {
  267. var file = Path.Combine(NewDataPath(), "Incremental");
  268. IOExtensions.DeleteDirectory(file);
  269. using (var store = new DocumentStore { Url = server.SystemDatabase.Configuration.ServerUrl }.Initialize())
  270. {
  271. store
  272. .DatabaseCommands
  273. .GlobalAdmin
  274. .CreateDatabase(new DatabaseDocument
  275. {
  276. Id = "Dba1",
  277. Settings =
  278. {
  279. {"Raven/DataDir", "Dba1"}
  280. }
  281. });
  282. store.DatabaseCommands.EnsureDatabaseExists("Dba1");
  283. }
  284. using (var store1 = new DocumentStore
  285. {
  286. Url = server.SystemDatabase.Configuration.ServerUrl,
  287. DefaultDatabase = "Dba1"
  288. }.Initialize())
  289. {
  290. StoreWorkerseDba1(store1);
  291. using (var session = store1.OpenSession())
  292. {
  293. var workers = session.Query<Worker>().ToList();
  294. Assert.Equal(3, workers.Count);
  295. var index1 = store1.DatabaseCommands.GetIndex("WorkerByName");
  296. var index2 = store1.DatabaseCommands.GetIndex("WorkerByAge");
  297. var index3 = store1.DatabaseCommands.GetIndex("WorkerAccountNumber");
  298. Assert.Equal("WorkerByName", index1.Name);
  299. Assert.Equal("WorkerByAge", index2.Name);
  300. Assert.Equal("WorkerAccountNumber", index3.Name);
  301. }
  302. }
  303. SmugglerDatabaseApi smugglerApi = new SmugglerDatabaseApi(new SmugglerDatabaseOptions
  304. {
  305. OperateOnTypes = ItemType.Documents | ItemType.Indexes,
  306. Incremental = true
  307. });
  308. smugglerApi.Options.Filters.Add(new FilterSetting
  309. {
  310. Path = "Name",
  311. ShouldMatch = true,
  312. Values = { "worker/21", "worker/33" }
  313. });
  314. await smugglerApi.ExportData(
  315. new SmugglerExportOptions<RavenConnectionStringOptions>
  316. {
  317. ToFile = file,
  318. From = new RavenConnectionStringOptions
  319. {
  320. Url = server.SystemDatabase.Configuration.ServerUrl,
  321. DefaultDatabase = "Dba1"
  322. }
  323. });
  324. //check file after first export
  325. using (var store1 = new DocumentStore
  326. {
  327. Url = server.SystemDatabase.Configuration.ServerUrl,
  328. DefaultDatabase = "Dba1"
  329. }.Initialize())
  330. {
  331. StoreWorkerseDba1(store1);
  332. }
  333. //Second time Export
  334. smugglerApi = new SmugglerDatabaseApi(new SmugglerDatabaseOptions
  335. {
  336. OperateOnTypes = ItemType.Documents | ItemType.Indexes,
  337. Incremental = true
  338. });
  339. smugglerApi.Options.Filters.Add(new FilterSetting
  340. {
  341. Path = "Name",
  342. ShouldMatch = true,
  343. Values = { "worker/21", "worker/33" }
  344. });
  345. await smugglerApi.ExportData(
  346. new SmugglerExportOptions<RavenConnectionStringOptions>
  347. {
  348. ToFile = file,
  349. From = new RavenConnectionStringOptions
  350. {
  351. Url = server.SystemDatabase.Configuration.ServerUrl,
  352. DefaultDatabase = "Dba1"
  353. }
  354. });
  355. using (var store2 = new DocumentStore
  356. {
  357. Url = server.SystemDatabase.Configuration.ServerUrl,
  358. DefaultDatabase = "Dba2"
  359. }.Initialize())
  360. {
  361. smugglerApi = new SmugglerDatabaseApi(new SmugglerDatabaseOptions
  362. {
  363. OperateOnTypes = ItemType.Documents | ItemType.Indexes,
  364. Incremental = true
  365. });
  366. await smugglerApi.ImportData(new SmugglerImportOptions<RavenConnectionStringOptions>
  367. {
  368. FromFile = file,
  369. To = new RavenConnectionStringOptions
  370. {
  371. Url = server.SystemDatabase.Configuration.ServerUrl,
  372. DefaultDatabase = "Dba2"
  373. }
  374. });
  375. using (var session = store2.OpenSession())
  376. {
  377. var workers = session.Query<Worker>().ToList();
  378. Assert.Equal(0, workers.Count);
  379. }
  380. }
  381. }
  382. }
  383. public void StoreWorkerseDba1(IDocumentStore docStore)
  384. {
  385. using (var session = docStore.OpenSession())
  386. {
  387. session.Store(new Worker { Name = "worker/1", Age = 20, AccountNumber = 1536 });
  388. session.Store(new Worker { Name = "worker/2", Age = 40, AccountNumber = 2006 });
  389. session.Store(new Worker { Name = "worker/3", Age = 30, AccountNumber = 1106 });
  390. session.SaveChanges();
  391. }
  392. new WorkerByName().Execute(docStore);
  393. new WorkerByAge().Execute(docStore);
  394. new WorkerAccountNumber().Execute(docStore);
  395. WaitForIndexing(docStore);
  396. }
  397. }
  398. public class Worker
  399. {
  400. public string Name { get; set; }
  401. public int Age { get; set; }
  402. public int AccountNumber { get; set; }
  403. }
  404. public class WorkerByName : AbstractIndexCreationTask<Worker>
  405. {
  406. public WorkerByName()
  407. {
  408. Map = workers => from worker in workers
  409. select new { worker.Name };
  410. Index(x => x.Name, FieldIndexing.Analyzed);
  411. }
  412. }
  413. public class WorkerByAge : AbstractIndexCreationTask<Worker>
  414. {
  415. public WorkerByAge()
  416. {
  417. Map = workers => from worker in workers
  418. select new {worker.Age};
  419. Sort(x => x.Age, SortOptions.Int);
  420. }
  421. }
  422. public class WorkerAccountNumber : AbstractIndexCreationTask<Worker>
  423. {
  424. public WorkerAccountNumber()
  425. {
  426. Map = workers => from worker in workers
  427. select new { worker.AccountNumber };
  428. }
  429. }
  430. }