/ToMigrate/Raven.Tests.FileSystem/ClientApi/FileQueryTests.cs

https://github.com/fitzchak/ravendb · C# · 1138 lines · 937 code · 201 blank · 0 comment · 3 complexity · 8369af410c9e43b9d631da308ff85ae7 MD5 · raw file

  1. using Raven.Abstractions.FileSystem;
  2. using Raven.Json.Linq;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using Raven.Client.FileSystem;
  8. using Raven.Tests.Common;
  9. using Xunit;
  10. using Xunit.Extensions;
  11. namespace Raven.Tests.FileSystem.ClientApi
  12. {
  13. public class FileQueryTests : RavenFilesTestWithLogs
  14. {
  15. [Fact]
  16. public async Task CanQueryByName()
  17. {
  18. var store = this.NewStore();
  19. using (var session = store.OpenAsyncSession())
  20. {
  21. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  22. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  23. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  24. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  25. await session.SaveChangesAsync();
  26. FilesQueryStatistics stats;
  27. var query = await session.Query()
  28. .Statistics(out stats)
  29. .WhereEquals(x => x.Name, "test.fil")
  30. .ToListAsync();
  31. Assert.Equal(1, stats.TotalResults);
  32. Assert.True(query.Any());
  33. Assert.Equal(1, query.Count());
  34. Assert.Equal("test.fil", query.First().Name);
  35. }
  36. }
  37. [Fact]
  38. public async Task CanQueryByStartingWith()
  39. {
  40. var store = this.NewStore();
  41. using (var session = store.OpenAsyncSession())
  42. {
  43. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  44. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  45. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  46. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  47. await session.SaveChangesAsync();
  48. FilesQueryStatistics stats;
  49. var query = await session.Query()
  50. .Statistics(out stats)
  51. .WhereStartsWith(x => x.Name, "test.fil")
  52. .ToListAsync();
  53. Assert.Equal(2, stats.TotalResults);
  54. Assert.Equal(2, query.Count);
  55. query = await session.Query()
  56. .Statistics(out stats)
  57. .WhereStartsWith(x => x.Name, "test.")
  58. .ToListAsync();
  59. Assert.Equal(4, stats.TotalResults);
  60. Assert.Equal(4, query.Count);
  61. query = await session.Query()
  62. .Statistics(out stats)
  63. .WhereStartsWith(x => x.Name, "test.fi")
  64. .ToListAsync();
  65. Assert.Equal(3, stats.TotalResults);
  66. Assert.Equal(3, query.Count);
  67. }
  68. }
  69. [Theory]
  70. [InlineData(150)]
  71. [InlineData(1500)]
  72. [InlineData(2000)]
  73. [InlineData(3000)]
  74. public async Task CanGetFullStats(int total)
  75. {
  76. var store = this.NewStore();
  77. using (var session = store.OpenAsyncSession())
  78. {
  79. session.Advanced.MaxNumberOfRequestsPerSession = total;
  80. for (var i = 0; i < total; i++)
  81. session.RegisterUpload("test.file" + i, CreateUniformFileStream(1));
  82. await session.SaveChangesAsync();
  83. }
  84. using (var session = store.OpenAsyncSession())
  85. {
  86. FilesQueryStatistics stats;
  87. var query = await session.Query()
  88. .Statistics(out stats)
  89. .WhereStartsWith(x => x.Name, "test.file")
  90. .ToListAsync();
  91. Assert.Equal(total, stats.TotalResults);
  92. Assert.Equal(Math.Min(total, 1024), query.Count);
  93. }
  94. }
  95. [Fact]
  96. public async Task CanQueryAll()
  97. {
  98. var store = this.NewStore();
  99. using (var session = store.OpenAsyncSession())
  100. {
  101. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  102. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  103. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  104. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  105. await session.SaveChangesAsync();
  106. var query = await session.Query()
  107. .ToListAsync();
  108. Assert.True(query.Any());
  109. Assert.Equal(4, query.Count());
  110. }
  111. }
  112. [Fact]
  113. public async Task CanQueryAllOnDirectory()
  114. {
  115. var store = this.NewStore();
  116. using (var session = store.OpenAsyncSession())
  117. {
  118. session.RegisterUpload("a/test.file", CreateUniformFileStream(10));
  119. session.RegisterUpload("b/test.fil", CreateUniformFileStream(10));
  120. session.RegisterUpload("b/test.fi", CreateUniformFileStream(10));
  121. session.RegisterUpload("b/test.f", CreateUniformFileStream(10));
  122. await session.SaveChangesAsync();
  123. var query = await session.Query()
  124. .OnDirectory("/b/")
  125. .ToListAsync();
  126. Assert.True(query.Any());
  127. Assert.Equal(3, query.Count());
  128. }
  129. }
  130. [Fact]
  131. public async Task CanQueryRootDirectoryWithoutRecursive()
  132. {
  133. var store = this.NewStore();
  134. using (var session = store.OpenAsyncSession())
  135. {
  136. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  137. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  138. session.RegisterUpload("b/test.fi", CreateUniformFileStream(10));
  139. session.RegisterUpload("b/test.f", CreateUniformFileStream(10));
  140. await session.SaveChangesAsync();
  141. var query = await session.Query()
  142. .OnDirectory()
  143. .ToListAsync();
  144. Assert.True(query.Any());
  145. Assert.Equal(2, query.Count());
  146. }
  147. }
  148. [Fact]
  149. public async Task CanQueryByMultipleWithOrStatement()
  150. {
  151. var store = this.NewStore();
  152. using (var session = store.OpenAsyncSession())
  153. {
  154. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  155. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  156. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  157. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  158. await session.SaveChangesAsync();
  159. var query = await session.Query()
  160. .WhereEquals(x => x.Name, "test.fil")
  161. .OrElse()
  162. .WhereEquals(x => x.Name, "test.file")
  163. .ToListAsync();
  164. Assert.True(query.Any());
  165. Assert.Equal(2, query.Count());
  166. Assert.Contains("test.fil", query.Select(x => x.Name));
  167. Assert.Contains("test.file", query.Select(x => x.Name));
  168. }
  169. }
  170. [Fact]
  171. public async Task CanQueryWhereIn()
  172. {
  173. var store = this.NewStore();
  174. using (var session = store.OpenAsyncSession())
  175. {
  176. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  177. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  178. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  179. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  180. await session.SaveChangesAsync();
  181. var query = await session.Query()
  182. .WhereIn(x => x.Name, new[] { "test.fil", "test.file" })
  183. .ToListAsync();
  184. Assert.True(query.Any());
  185. Assert.Equal(2, query.Count());
  186. Assert.Contains("test.fil", query.Select(x => x.Name));
  187. Assert.Contains("test.file", query.Select(x => x.Name));
  188. }
  189. }
  190. [Fact]
  191. public async Task CanQueryWhereInWithComplexOrClause()
  192. {
  193. var store = this.NewStore();
  194. using (var session = store.OpenAsyncSession())
  195. {
  196. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  197. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  198. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  199. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  200. await session.SaveChangesAsync();
  201. var query = await session.Query()
  202. .WhereIn(x => x.Name, new[] { "test.fil", "test.file" })
  203. .OrElse()
  204. .WhereEquals(x => x.Name, "test.fi")
  205. .ToListAsync();
  206. Assert.True(query.Any());
  207. Assert.Equal(3, query.Count());
  208. Assert.Contains("test.fi", query.Select(x => x.Name));
  209. Assert.Contains("test.fil", query.Select(x => x.Name));
  210. Assert.Contains("test.file", query.Select(x => x.Name));
  211. }
  212. }
  213. [Fact]
  214. public async Task CanQueryWhereInWithComplexOrClauseInverted()
  215. {
  216. var store = this.NewStore();
  217. using (var session = store.OpenAsyncSession())
  218. {
  219. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  220. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  221. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  222. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  223. await session.SaveChangesAsync();
  224. var query = await session.Query()
  225. .WhereEquals(x => x.Name, "test.fi")
  226. .OrElse()
  227. .WhereIn(x => x.Name, new[] { "test.fil", "test.file" })
  228. .ToListAsync();
  229. Assert.True(query.Any());
  230. Assert.Equal(3, query.Count());
  231. Assert.Contains("test.fi", query.Select(x => x.Name));
  232. Assert.Contains("test.fil", query.Select(x => x.Name));
  233. Assert.Contains("test.file", query.Select(x => x.Name));
  234. }
  235. }
  236. [Fact]
  237. public async Task CanQueryWhereInWithComplexAndClause()
  238. {
  239. var store = this.NewStore();
  240. using (var session = store.OpenAsyncSession())
  241. {
  242. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  243. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  244. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  245. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  246. await session.SaveChangesAsync();
  247. var query = await session.Query()
  248. .WhereIn(x => x.Name, new[] { "test.fil", "test.file" })
  249. .AndAlso()
  250. .WhereEquals(x => x.Name, "test.fil")
  251. .ToListAsync();
  252. Assert.True(query.Any());
  253. Assert.Equal(1, query.Count());
  254. Assert.Contains("test.fil", query.Select(x => x.Name));
  255. }
  256. }
  257. [Fact]
  258. public async Task CanQueryWhereInWithComplexAndClauseInverted()
  259. {
  260. var store = this.NewStore();
  261. using (var session = store.OpenAsyncSession())
  262. {
  263. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  264. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  265. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  266. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  267. await session.SaveChangesAsync();
  268. var query = await session.Query()
  269. .WhereEquals(x => x.Name, "test.fil")
  270. .AndAlso()
  271. .WhereIn(x => x.Name, new[] { "test.fil", "test.file" })
  272. .ToListAsync();
  273. Assert.True(query.Any());
  274. Assert.Equal(1, query.Count());
  275. Assert.Contains("test.fil", query.Select(x => x.Name));
  276. }
  277. }
  278. [Fact]
  279. public async Task CanQueryWhereInWithComplexStartWithClause()
  280. {
  281. var store = this.NewStore();
  282. using (var session = store.OpenAsyncSession())
  283. {
  284. session.RegisterUpload("file.test", CreateUniformFileStream(10));
  285. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  286. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  287. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  288. await session.SaveChangesAsync();
  289. var query = await session.Query()
  290. .WhereIn(x => x.Name, new[] { "test.fil", "file.test" })
  291. .AndAlso()
  292. .WhereStartsWith(x => x.Name, "test")
  293. .ToListAsync();
  294. Assert.True(query.Any());
  295. Assert.Equal(1, query.Count());
  296. Assert.Contains("test.fil", query.Select(x => x.Name));
  297. }
  298. }
  299. [Fact]
  300. public async Task CanQueryWhereInWithComplexStartWithClauseInverted()
  301. {
  302. var store = this.NewStore();
  303. using (var session = store.OpenAsyncSession())
  304. {
  305. session.RegisterUpload("file.test", CreateUniformFileStream(10));
  306. session.RegisterUpload("file.test.fil", CreateUniformFileStream(10));
  307. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  308. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  309. await session.SaveChangesAsync();
  310. var query = await session.Query()
  311. .WhereStartsWith(x => x.Name, "test")
  312. .OrElse()
  313. .WhereIn(x => x.Name, new[] { "file.test.fil", "file.test" })
  314. .ToListAsync();
  315. Assert.True(query.Any());
  316. Assert.Equal(4, query.Count());
  317. }
  318. }
  319. [Fact]
  320. public async Task CanQueryInsideDirectory()
  321. {
  322. var store = this.NewStore();
  323. using (var session = store.OpenAsyncSession())
  324. {
  325. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  326. session.RegisterUpload("dir/test.file", CreateUniformFileStream(10));
  327. session.RegisterUpload("dir/test.file1", CreateUniformFileStream(10));
  328. session.RegisterUpload("dir/another/test.file", CreateUniformFileStream(10));
  329. session.RegisterUpload("dir/another/test.file1", CreateUniformFileStream(10));
  330. await session.SaveChangesAsync();
  331. var query = await session.Query()
  332. .OnDirectory("dir", recursive: true)
  333. .WhereEquals(x => x.Name, "test.file")
  334. .ToListAsync();
  335. Assert.True(query.Any());
  336. Assert.Equal(2, query.Count());
  337. }
  338. }
  339. [Fact]
  340. public async Task CanQueryStoppingAtDirectory()
  341. {
  342. var store = this.NewStore();
  343. using (var session = store.OpenAsyncSession())
  344. {
  345. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  346. session.RegisterUpload("dir/test.file", CreateUniformFileStream(10));
  347. session.RegisterUpload("dir/test.file1", CreateUniformFileStream(10));
  348. session.RegisterUpload("dir/another/test.file", CreateUniformFileStream(10));
  349. session.RegisterUpload("dir/another/test.file1", CreateUniformFileStream(10));
  350. await session.SaveChangesAsync();
  351. var query = await session.Query()
  352. .OnDirectory("dir")
  353. .WhereEquals(x => x.Name, "test.file")
  354. .ToListAsync();
  355. Assert.True(query.Any());
  356. Assert.Equal(1, query.Count());
  357. }
  358. }
  359. [Fact]
  360. public async Task CanQueryByExtension()
  361. {
  362. var store = this.NewStore();
  363. using (var session = store.OpenAsyncSession())
  364. {
  365. session.RegisterUpload("test.file", CreateUniformFileStream(10));
  366. session.RegisterUpload("test.fil", CreateUniformFileStream(10));
  367. session.RegisterUpload("test.fi", CreateUniformFileStream(10));
  368. session.RegisterUpload("test.f", CreateUniformFileStream(10));
  369. await session.SaveChangesAsync();
  370. Assert.Throws<NotSupportedException>(() => session.Query().WhereEquals(x => x.Extension, "fil"));
  371. var query = await session.Query().WhereEndsWith(x => x.Name, ".fil").ToListAsync();
  372. Assert.True(query.Any());
  373. Assert.Equal(1, query.Count());
  374. Assert.Equal("test.fil", query.First().Name);
  375. }
  376. }
  377. [Fact]
  378. public async Task CanQueryByMetadata()
  379. {
  380. var store = this.NewStore();
  381. using (var session = store.OpenAsyncSession())
  382. {
  383. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  384. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  385. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  386. await session.SaveChangesAsync();
  387. var file1 = await session.LoadFileAsync("test.file");
  388. file1.Metadata["Test"] = true;
  389. var file2 = await session.LoadFileAsync("test.fil");
  390. file2.Metadata["Test"] = false;
  391. await session.SaveChangesAsync();
  392. var query = await session.Query()
  393. .WhereEquals("Test", true)
  394. .ToListAsync();
  395. Assert.True(query.Any());
  396. Assert.Equal(1, query.Count());
  397. Assert.Contains("test.file", query.Select(x => x.Name));
  398. query = await session.Query()
  399. .WhereEquals("Test", false)
  400. .ToListAsync();
  401. Assert.Equal(1, query.Count());
  402. Assert.Contains("test.fil", query.Select(x => x.Name));
  403. }
  404. }
  405. [Fact]
  406. public async Task CanQueryBySize()
  407. {
  408. var store = this.NewStore();
  409. using (var session = store.OpenAsyncSession())
  410. {
  411. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  412. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  413. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  414. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  415. await session.SaveChangesAsync();
  416. var query = await session.Query()
  417. .WhereGreaterThan(x => x.TotalSize, 150)
  418. .ToListAsync();
  419. Assert.True(query.Any());
  420. Assert.Equal(2, query.Count());
  421. Assert.Contains("test.file", query.Select(x => x.Name));
  422. Assert.Contains("test.f", query.Select(x => x.Name));
  423. query = await session.Query()
  424. .WhereEquals(x => x.TotalSize, 150)
  425. .ToListAsync();
  426. Assert.True(query.Any());
  427. Assert.Equal(1, query.Count());
  428. Assert.Contains("test.fil", query.Select(x => x.Name));
  429. query = await session.Query()
  430. .WhereLessThan(x => x.TotalSize, 150)
  431. .ToListAsync();
  432. Assert.Equal(1, query.Count());
  433. Assert.Contains("test.fi", query.Select(x => x.Name));
  434. }
  435. }
  436. [Fact]
  437. public async Task CanUseFirst()
  438. {
  439. var store = this.NewStore();
  440. using (var session = store.OpenAsyncSession())
  441. {
  442. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  443. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  444. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  445. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  446. await session.SaveChangesAsync();
  447. FilesQueryStatistics stats;
  448. var value = await session.Query()
  449. .Statistics(out stats)
  450. .WhereGreaterThan(x => x.TotalSize, 150)
  451. .FirstAsync();
  452. Assert.Equal(2, stats.TotalResults);
  453. var query = await session.Query()
  454. .WhereGreaterThan(x => x.TotalSize, 150)
  455. .ToListAsync();
  456. Assert.True(query.Any());
  457. Assert.Equal(value.Name, query[0].Name);
  458. await AssertAsync.Throws<InvalidOperationException>(async () =>
  459. await session.Query()
  460. .Statistics(out stats)
  461. .WhereGreaterThan(x => x.TotalSize, 800)
  462. .FirstAsync());
  463. Assert.Equal(0, stats.TotalResults);
  464. }
  465. }
  466. [Fact]
  467. public async Task CanUseFirstOrDefault()
  468. {
  469. var store = this.NewStore();
  470. using (var session = store.OpenAsyncSession())
  471. {
  472. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  473. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  474. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  475. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  476. await session.SaveChangesAsync();
  477. FilesQueryStatistics stats;
  478. var fileHeader = session.Query()
  479. .Statistics(out stats)
  480. .WhereGreaterThan(x => x.TotalSize, 10)
  481. .FirstOrDefaultAsync()
  482. .Result;
  483. Assert.Equal(4, stats.TotalResults);
  484. Assert.NotNull(fileHeader);
  485. Assert.Null(session.Query()
  486. .Statistics(out stats)
  487. .WhereGreaterThan(x => x.TotalSize, 700)
  488. .FirstOrDefaultAsync()
  489. .Result);
  490. Assert.Equal(0, stats.TotalResults);
  491. }
  492. }
  493. [Fact]
  494. public async Task CanUseSingle()
  495. {
  496. var store = this.NewStore();
  497. using (var session = store.OpenAsyncSession())
  498. {
  499. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  500. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  501. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  502. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  503. await session.SaveChangesAsync();
  504. FilesQueryStatistics stats;
  505. var fileHeader = session.Query()
  506. .Statistics(out stats)
  507. .WhereGreaterThan(x => x.TotalSize, 550)
  508. .SingleAsync()
  509. .Result;
  510. Assert.NotNull(fileHeader);
  511. Assert.Equal(1, stats.TotalResults);
  512. await AssertAsync.Throws<InvalidOperationException>(async () =>
  513. await session.Query()
  514. .Statistics(out stats)
  515. .WhereGreaterThan(x => x.TotalSize, 150)
  516. .SingleAsync());
  517. Assert.Equal(2, stats.TotalResults);
  518. await AssertAsync.Throws<InvalidOperationException>(async () =>
  519. await session.Query()
  520. .Statistics(out stats)
  521. .WhereGreaterThan(x => x.TotalSize, 700)
  522. .SingleAsync());
  523. Assert.Equal(0, stats.TotalResults);
  524. }
  525. }
  526. [Fact]
  527. public async Task CanUseSingleOrDefault()
  528. {
  529. var store = this.NewStore();
  530. using (var session = store.OpenAsyncSession())
  531. {
  532. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  533. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  534. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  535. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  536. await session.SaveChangesAsync();
  537. FilesQueryStatistics stats;
  538. var fileHeader = session.Query()
  539. .Statistics(out stats)
  540. .WhereGreaterThan(x => x.TotalSize, 550)
  541. .SingleOrDefaultAsync()
  542. .Result;
  543. Assert.NotNull(fileHeader);
  544. Assert.Equal(1, stats.TotalResults);
  545. Assert.Null(
  546. session.Query()
  547. .Statistics(out stats)
  548. .WhereGreaterThan(x => x.TotalSize, 700)
  549. .SingleOrDefaultAsync()
  550. .Result);
  551. Assert.Equal(0, stats.TotalResults);
  552. await AssertAsync.Throws<InvalidOperationException>(async () =>
  553. await session.Query()
  554. .Statistics(out stats)
  555. .WhereGreaterThan(x => x.TotalSize, 150)
  556. .SingleOrDefaultAsync());
  557. Assert.Equal(2, stats.TotalResults);
  558. }
  559. }
  560. [Fact]
  561. public async Task CanUseOrderBySize()
  562. {
  563. var store = this.NewStore();
  564. using (var session = store.OpenAsyncSession())
  565. {
  566. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  567. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  568. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  569. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  570. await session.SaveChangesAsync();
  571. var query = await session.Query()
  572. .OrderBy(x => x.TotalSize)
  573. .ToListAsync();
  574. var queryAll = await session.Query()
  575. .ToListAsync();
  576. var queryOrderAfter = queryAll.OrderBy(x => x.TotalSize);
  577. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  578. foreach (var pair in inPairs)
  579. {
  580. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  581. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  582. }
  583. }
  584. }
  585. [Fact]
  586. public async Task CanUseOrderByDescendingSize()
  587. {
  588. var store = this.NewStore();
  589. using (var session = store.OpenAsyncSession())
  590. {
  591. session.RegisterUpload("test.file", CreateUniformFileStream(600));
  592. session.RegisterUpload("test.fil", CreateUniformFileStream(150));
  593. session.RegisterUpload("test.fi", CreateUniformFileStream(16));
  594. session.RegisterUpload("test.f", CreateUniformFileStream(330));
  595. await session.SaveChangesAsync();
  596. var query = await session.Query()
  597. .OrderByDescending(x => x.TotalSize)
  598. .ToListAsync();
  599. var queryAll = await session.Query()
  600. .ToListAsync();
  601. var queryOrderAfter = queryAll.OrderByDescending(x => x.TotalSize);
  602. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  603. foreach (var pair in inPairs)
  604. {
  605. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  606. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  607. }
  608. }
  609. }
  610. [Fact]
  611. public async Task CanUseOrderByName()
  612. {
  613. var store = this.NewStore();
  614. using (var session = store.OpenAsyncSession())
  615. {
  616. session.RegisterUpload("d.file", CreateUniformFileStream(100));
  617. session.RegisterUpload("c.file", CreateUniformFileStream(101));
  618. session.RegisterUpload("a.file", CreateUniformFileStream(102));
  619. session.RegisterUpload("b.file", CreateUniformFileStream(103));
  620. await session.SaveChangesAsync();
  621. var query = await session.Query()
  622. .OrderBy(x => x.Name)
  623. .ToListAsync();
  624. var queryAll = await session.Query()
  625. .ToListAsync();
  626. var queryOrderAfter = queryAll.OrderBy(x => x.Name);
  627. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  628. foreach (var pair in inPairs)
  629. {
  630. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  631. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  632. }
  633. }
  634. }
  635. [Fact]
  636. public async Task CanUseOrderByDescendingName()
  637. {
  638. var store = this.NewStore();
  639. using (var session = store.OpenAsyncSession())
  640. {
  641. session.RegisterUpload("a.file", CreateUniformFileStream(100));
  642. session.RegisterUpload("b.file", CreateUniformFileStream(101));
  643. session.RegisterUpload("c.file", CreateUniformFileStream(102));
  644. session.RegisterUpload("d.file", CreateUniformFileStream(103));
  645. await session.SaveChangesAsync();
  646. var query = await session.Query()
  647. .OrderByDescending(x => x.Name)
  648. .ToListAsync();
  649. var queryAll = await session.Query()
  650. .ToListAsync();
  651. var queryOrderAfter = queryAll.OrderByDescending(x => x.Name);
  652. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  653. foreach (var pair in inPairs)
  654. {
  655. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  656. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  657. }
  658. }
  659. }
  660. [Fact]
  661. public async Task CanUseOrderByMultipleConditionsOnDescending()
  662. {
  663. var store = this.NewStore();
  664. using (var session = store.OpenAsyncSession())
  665. {
  666. session.RegisterUpload("b.file", CreateUniformFileStream(100));
  667. session.RegisterUpload("a.file", CreateUniformFileStream(101));
  668. session.RegisterUpload("d.file", CreateUniformFileStream(101));
  669. session.RegisterUpload("c.file", CreateUniformFileStream(102));
  670. await session.SaveChangesAsync();
  671. var query = await session.Query()
  672. .OrderBy(x => x.TotalSize)
  673. .ThenByDescending(x => x.Name)
  674. .ToListAsync();
  675. var queryAll = await session.Query()
  676. .ToListAsync();
  677. var queryOrderAfter = queryAll.OrderBy(x => x.TotalSize)
  678. .ThenByDescending(x => x.Name);
  679. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  680. foreach (var pair in inPairs)
  681. {
  682. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  683. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  684. }
  685. }
  686. }
  687. [Fact]
  688. public async Task CanUseOrderByMultipleConditions()
  689. {
  690. var store = this.NewStore();
  691. using (var session = store.OpenAsyncSession())
  692. {
  693. session.RegisterUpload("b.file", CreateUniformFileStream(100));
  694. session.RegisterUpload("a.file", CreateUniformFileStream(101));
  695. session.RegisterUpload("d.file", CreateUniformFileStream(101));
  696. session.RegisterUpload("c.file", CreateUniformFileStream(102));
  697. await session.SaveChangesAsync();
  698. var query = await session.Query()
  699. .OrderBy(x => x.TotalSize)
  700. .ThenBy(x => x.Name)
  701. .ToListAsync();
  702. var queryAll = await session.Query()
  703. .ToListAsync();
  704. var queryOrderAfter = queryAll.OrderBy(x => x.TotalSize)
  705. .ThenBy(x => x.Name);
  706. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  707. foreach (var pair in inPairs)
  708. {
  709. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  710. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  711. }
  712. }
  713. }
  714. [Fact]
  715. public async Task CanUseOrderByMultipleGroupConditions()
  716. {
  717. var store = this.NewStore();
  718. using (var session = store.OpenAsyncSession())
  719. {
  720. session.RegisterUpload("a.file", CreateUniformFileStream(100));
  721. session.RegisterUpload("b.file", CreateUniformFileStream(101));
  722. session.RegisterUpload("c.file", CreateUniformFileStream(101));
  723. session.RegisterUpload("d.file", CreateUniformFileStream(102));
  724. await session.SaveChangesAsync();
  725. var query = await session.Query()
  726. .OrderBy(x => x.TotalSize)
  727. .OrderByDescending(x => x.Name)
  728. .ToListAsync();
  729. var queryAll = await session.Query().ToListAsync();
  730. var queryOrderAfter = queryAll.OrderByDescending(x => x.Name);
  731. var inPairs = query.Zip(queryOrderAfter, (x, y) => new Tuple<FileHeader, FileHeader>(x, y));
  732. foreach (var pair in inPairs)
  733. {
  734. Assert.Equal(pair.Item1.Name, pair.Item2.Name);
  735. Assert.Equal(pair.Item1.TotalSize, pair.Item2.TotalSize);
  736. }
  737. }
  738. }
  739. [Fact]
  740. public async Task CanUseContainsAll()
  741. {
  742. var store = this.NewStore();
  743. using (var session = store.OpenAsyncSession())
  744. {
  745. session.RegisterUpload("a.file", CreateUniformFileStream(100));
  746. session.RegisterUpload("b.file", CreateUniformFileStream(101));
  747. await session.SaveChangesAsync();
  748. var fileA = await session.LoadFileAsync("a.file");
  749. fileA.Metadata["Test"] = new RavenJArray("test1", "test2", "test3");
  750. var fileB = await session.LoadFileAsync("b.file");
  751. fileB.Metadata["Test"] = new RavenJArray("test1", "test3");
  752. await session.SaveChangesAsync();
  753. var query = await session.Query()
  754. .ContainsAll("Test", new string[] { "test1", "test2" })
  755. .ToListAsync();
  756. Assert.Equal(1, query.Count);
  757. }
  758. }
  759. [Fact]
  760. public async Task CanUseContainsAny()
  761. {
  762. var store = this.NewStore();
  763. using (var session = store.OpenAsyncSession())
  764. {
  765. session.RegisterUpload("a.file", CreateUniformFileStream(100));
  766. session.RegisterUpload("b.file", CreateUniformFileStream(101));
  767. session.RegisterUpload("c.file", CreateUniformFileStream(103));
  768. await session.SaveChangesAsync();
  769. var fileA = await session.LoadFileAsync("a.file");
  770. fileA.Metadata["Test"] = new RavenJArray(new string[] { "test3" });
  771. var fileB = await session.LoadFileAsync("b.file");
  772. fileB.Metadata["Test"] = new RavenJArray("test1", "test3");
  773. var fileC = await session.LoadFileAsync("c.file");
  774. fileC.Metadata["Test"] = new RavenJArray("test2", "test3");
  775. await session.SaveChangesAsync();
  776. var query = await session.Query()
  777. .ContainsAny("Test", new string[] { "test1", "test2" })
  778. .ToListAsync();
  779. Assert.Equal(2, query.Count);
  780. }
  781. }
  782. [Fact]
  783. public async Task CanUseTakeAndSkip()
  784. {
  785. var store = this.NewStore();
  786. for (int i = 0; i < 20; i++)
  787. {
  788. using (var session = store.OpenAsyncSession())
  789. {
  790. session.RegisterUpload(i + ".file", CreateRandomFileStream(i));
  791. session.RegisterUpload(i + ".txt", CreateRandomFileStream(i));
  792. await session.SaveChangesAsync();
  793. }
  794. }
  795. int pageSize = 5;
  796. var files = new List<FileHeader>();
  797. using (var session = store.OpenAsyncSession())
  798. {
  799. for (int i = 0; i < 4; i++)
  800. {
  801. var results = await session.Query().WhereEndsWith(x => x.Name, ".file").Skip(i * pageSize).Take(pageSize).ToListAsync();
  802. files.AddRange(results);
  803. }
  804. Assert.Equal(20, files.Count);
  805. Assert.Equal(20, files.Select(x => x.Name).Distinct().Count());
  806. }
  807. }
  808. [Fact]
  809. public async Task CanSearchByNumericMetadataFields()
  810. {
  811. using (var store = NewStore())
  812. {
  813. using (var session = store.OpenAsyncSession())
  814. {
  815. var metadata = new RavenJObject();
  816. metadata.Add("Int", 5);
  817. metadata.Add("Long", 5L);
  818. metadata.Add("Float", 5.0f);
  819. metadata.Add("Double", 5.0);
  820. metadata.Add("Uint", 5u);
  821. metadata.Add("Ulong", 5UL);
  822. metadata.Add("Short", (short) 5);
  823. metadata.Add("Ushort", (ushort) 5);
  824. metadata.Add("Decimal", 5m);
  825. session.RegisterUpload("test-1.file", CreateRandomFileStream(10), metadata);
  826. var metadata2 = new RavenJObject();
  827. metadata2.Add("Int", 10);
  828. metadata2.Add("Long", 10L);
  829. metadata2.Add("Float", 10.0f);
  830. metadata2.Add("Double", 10.0);
  831. metadata2.Add("Uint", 10u);
  832. metadata2.Add("Ulong", 10UL);
  833. metadata2.Add("Short", (short) 10);
  834. metadata2.Add("Ushort", (ushort) 10);
  835. metadata2.Add("Decimal", 10m);
  836. session.RegisterUpload("test-2.file", CreateRandomFileStream(10), metadata2);
  837. await session.SaveChangesAsync();
  838. }
  839. var metadataKeys = new[]
  840. {
  841. "Int", "Long", "Float", "Double", "Uint", "Ulong", "Short", "Ushort", "Decimal"
  842. };
  843. foreach (var key in metadataKeys)
  844. {
  845. using (var session = store.OpenAsyncSession())
  846. {
  847. Assert.Equal(1, (await session.Query().WhereEquals(key, 5).ToListAsync()).Count);
  848. Assert.Equal(1, (await session.Query().WhereGreaterThan(key, 5).ToListAsync()).Count);
  849. Assert.Equal(2, (await session.Query().WhereGreaterThanOrEqual(key, 5).ToListAsync()).Count);
  850. Assert.Equal(1, (await session.Query().WhereLessThan(key, 10).ToListAsync()).Count);
  851. Assert.Equal(2, (await session.Query().WhereLessThanOrEqual(key, 10).ToListAsync()).Count);
  852. Assert.Equal(0, (await session.Query().WhereBetween(key, 5, 10).ToListAsync()).Count);
  853. Assert.Equal(1, (await session.Query().WhereBetween(key, 0, 10).ToListAsync()).Count);
  854. Assert.Equal(1, (await session.Query().WhereBetween(key, 5, 20).ToListAsync()).Count);
  855. Assert.Equal(2, (await session.Query().WhereBetweenOrEqual(key, 5, 10).ToListAsync()).Count);
  856. }
  857. }
  858. }
  859. }
  860. [Fact]
  861. public async Task CanSearchInMetadataArrayFields1()
  862. {
  863. var store = this.NewStore();
  864. using (var session = store.OpenAsyncSession())
  865. {
  866. var metadata = new RavenJObject
  867. {
  868. {"Test", new RavenJArray { 1, 2 } }
  869. };
  870. session.RegisterUpload("test.file", CreateUniformFileStream(10), metadata);
  871. await session.SaveChangesAsync();
  872. FilesQueryStatistics stats;
  873. var query = await session.Query()
  874. .Statistics(out stats)
  875. .WhereEquals("Test", 1)
  876. .ToListAsync();
  877. Assert.Equal(1, stats.TotalResults);
  878. Assert.True(query.Any());
  879. Assert.Equal(1, query.Count());
  880. Assert.Equal("test.file", query.First().Name);
  881. query = await session.Query()
  882. .Statistics(out stats)
  883. .WhereEquals("Test", 2)
  884. .ToListAsync();
  885. Assert.Equal(1, stats.TotalResults);
  886. Assert.True(query.Any());
  887. Assert.Equal(1, query.Count());
  888. Assert.Equal("test.file", query.First().Name);
  889. }
  890. }
  891. [Fact]
  892. public async Task CanSearchInMetadataArrayFields2()
  893. {
  894. var store = this.NewStore();
  895. using (var session = store.OpenAsyncSession())
  896. {
  897. var metadata1 = new RavenJObject
  898. {
  899. {"Test", new RavenJArray { 1, 2 } }
  900. };
  901. session.RegisterUpload("test1.file", CreateUniformFileStream(10), metadata1);
  902. var metadata2 = new RavenJObject
  903. {
  904. {"Test", new RavenJArray { 1, 3 } }
  905. };
  906. session.RegisterUpload("test2.file", CreateUniformFileStream(10), metadata2);
  907. await session.SaveChangesAsync();
  908. FilesQueryStatistics stats;
  909. var query = await session.Query()
  910. .Statistics(out stats)
  911. .WhereEquals("Test", 1)
  912. .ToListAsync();
  913. Assert.Equal(2, stats.TotalResults);
  914. Assert.True(query.Any());
  915. Assert.Equal(2, query.Count());
  916. Assert.Equal("test1.file", query[0].Name);
  917. Assert.Equal("test2.file", query[1].Name);
  918. query = await session.Query()
  919. .Statistics(out stats)
  920. .WhereEquals("Test", 2)
  921. .ToListAsync();
  922. Assert.Equal(1, stats.TotalResults);
  923. Assert.True(query.Any());
  924. Assert.Equal(1, query.Count());
  925. Assert.Equal("test1.file", query.First().Name);
  926. query = await session.Query()
  927. .Statistics(out stats)
  928. .WhereEquals("Test", 3)
  929. .ToListAsync();
  930. Assert.Equal(1, stats.TotalResults);
  931. Assert.True(query.Any());
  932. Assert.Equal(1, query.Count());
  933. Assert.Equal("test2.file", query.First().Name);
  934. }
  935. }
  936. }
  937. }