/test/SlowTests/Tests/Linq/WhereClause.cs

https://github.com/fitzchak/ravendb · C# · 1258 lines · 1101 code · 148 blank · 9 comment · 58 complexity · 8c1b427f3c9b99a974cf9a8242be165a MD5 · raw file

  1. //-----------------------------------------------------------------------
  2. // <copyright file="WhereClause.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System;
  7. using System.Linq;
  8. using FastTests;
  9. using Newtonsoft.Json;
  10. using Raven.Client.Documents.Linq;
  11. using Raven.Client.Documents.Session;
  12. using Xunit;
  13. namespace SlowTests.Tests.Linq
  14. {
  15. public class WhereClause : RavenTestBase
  16. {
  17. private class Renamed
  18. {
  19. [JsonProperty("Yellow")]
  20. public string Name { get; set; }
  21. }
  22. [Fact]
  23. public void WillRespectRenames()
  24. {
  25. using (var store = GetDocumentStore())
  26. {
  27. using (var session = store.OpenSession())
  28. {
  29. var q = Queryable.Where(session.Query<Renamed>(), x => x.Name == "red");
  30. var iq = RavenTestHelper.GetIndexQuery(q);
  31. Assert.Equal("from Renameds where Yellow = $p0", iq.Query);
  32. Assert.Equal("red", iq.QueryParameters["p0"]);
  33. }
  34. }
  35. }
  36. [Fact]
  37. public void HandlesNegative()
  38. {
  39. using (var store = GetDocumentStore())
  40. {
  41. using (var session = store.OpenSession())
  42. {
  43. var indexedUsers = GetRavenQueryInspector(session);
  44. var q = indexedUsers.Where(x => !x.IsActive);
  45. var iq = RavenTestHelper.GetIndexQuery(q);
  46. Assert.Equal("from IndexedUsers where IsActive = $p0", iq.Query);
  47. Assert.Equal(false, iq.QueryParameters["p0"]);
  48. }
  49. }
  50. }
  51. [Fact]
  52. public void HandlesNegativeEquality()
  53. {
  54. using (var store = GetDocumentStore())
  55. {
  56. using (var session = store.OpenSession())
  57. {
  58. var indexedUsers = GetRavenQueryInspector(session);
  59. var q = indexedUsers.Where(x => x.IsActive == false);
  60. var iq = RavenTestHelper.GetIndexQuery(q);
  61. Assert.Equal("from IndexedUsers where IsActive = $p0", iq.Query);
  62. Assert.Equal(false, iq.QueryParameters["p0"]);
  63. }
  64. }
  65. }
  66. [Fact]
  67. public void HandleDoubleRangeSearch()
  68. {
  69. using (var store = GetDocumentStore())
  70. {
  71. using (var session = store.OpenSession())
  72. {
  73. var indexedUsers = GetRavenQueryInspector(session);
  74. double min = 1246.434565380224, max = 1246.434565380226;
  75. var q = indexedUsers.Where(x => x.Rate >= min && x.Rate <= max);
  76. var iq = RavenTestHelper.GetIndexQuery(q);
  77. Assert.Equal("from IndexedUsers where Rate between $p0 and $p1", q.ToString());
  78. Assert.Equal(min, iq.QueryParameters["p0"]);
  79. Assert.Equal(max, iq.QueryParameters["p1"]);
  80. }
  81. }
  82. }
  83. [Fact]
  84. public void CanHandleCasts()
  85. {
  86. using (var store = GetDocumentStore())
  87. {
  88. using (var session = store.OpenSession())
  89. {
  90. var indexedUsers = GetRavenQueryInspector(session);
  91. var q = indexedUsers.Where(x => ((Dog)x.Animal).Color == "black");
  92. var iq = RavenTestHelper.GetIndexQuery(q);
  93. Assert.Equal("from IndexedUsers where Animal.Color = $p0", q.ToString());
  94. Assert.Equal("black", iq.QueryParameters["p0"]);
  95. }
  96. }
  97. }
  98. [Fact]
  99. public void StartsWith()
  100. {
  101. using (var store = GetDocumentStore())
  102. {
  103. using (var session = store.OpenSession())
  104. {
  105. var indexedUsers = GetRavenQueryInspector(session);
  106. var q = indexedUsers.Where(user => user.Name.StartsWith("foo"));
  107. var iq = RavenTestHelper.GetIndexQuery(q);
  108. Assert.Equal("from IndexedUsers where startsWith(Name, $p0)", iq.Query);
  109. Assert.Equal("foo", iq.QueryParameters["p0"]);
  110. }
  111. }
  112. }
  113. [Fact]
  114. public void StartsWithEqTrue()
  115. {
  116. using (var store = GetDocumentStore())
  117. {
  118. using (var session = store.OpenSession())
  119. {
  120. var indexedUsers = GetRavenQueryInspector(session);
  121. var q = indexedUsers.Where(user => user.Name.StartsWith("foo") == true);
  122. var iq = RavenTestHelper.GetIndexQuery(q);
  123. Assert.Equal("from IndexedUsers where startsWith(Name, $p0)", iq.Query);
  124. Assert.Equal("foo", iq.QueryParameters["p0"]);
  125. }
  126. }
  127. }
  128. [Fact]
  129. public void StartsWithEqFalse()
  130. {
  131. using (var store = GetDocumentStore())
  132. {
  133. using (var session = store.OpenSession())
  134. {
  135. var indexedUsers = GetRavenQueryInspector(session);
  136. var q = indexedUsers.Where(user => user.Name.StartsWith("foo") == false);
  137. var iq = RavenTestHelper.GetIndexQuery(q);
  138. Assert.Equal("from IndexedUsers where (true and not startsWith(Name, $p0))", iq.Query);
  139. Assert.Equal("foo", iq.QueryParameters["p0"]);
  140. }
  141. }
  142. }
  143. [Fact]
  144. public void StartsWithNegated()
  145. {
  146. using (var store = GetDocumentStore())
  147. {
  148. using (var session = store.OpenSession())
  149. {
  150. var indexedUsers = GetRavenQueryInspector(session);
  151. var q = indexedUsers.Where(user => !user.Name.StartsWith("foo"));
  152. var iq = RavenTestHelper.GetIndexQuery(q);
  153. Assert.Equal("from IndexedUsers where (true and not startsWith(Name, $p0))", iq.Query);
  154. Assert.Equal("foo", iq.QueryParameters["p0"]);
  155. }
  156. }
  157. }
  158. [Fact]
  159. public void IsNullOrEmpty()
  160. {
  161. using (var store = GetDocumentStore())
  162. {
  163. using (var session = store.OpenSession())
  164. {
  165. var indexedUsers = GetRavenQueryInspector(session);
  166. var q = indexedUsers.Where(user => string.IsNullOrEmpty(user.Name));
  167. var iq = RavenTestHelper.GetIndexQuery(q);
  168. Assert.Equal("from IndexedUsers where (Name = $p0 or Name = $p1)", iq.Query);
  169. Assert.Equal(null, iq.QueryParameters["p0"]);
  170. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  171. }
  172. }
  173. }
  174. [Fact]
  175. public void IsNullOrEmptyEqTrue()
  176. {
  177. using (var store = GetDocumentStore())
  178. {
  179. using (var session = store.OpenSession())
  180. {
  181. var indexedUsers = GetRavenQueryInspector(session);
  182. var q = indexedUsers.Where(user => string.IsNullOrEmpty(user.Name) == true);
  183. var iq = RavenTestHelper.GetIndexQuery(q);
  184. Assert.Equal("from IndexedUsers where (Name = $p0 or Name = $p1)", iq.Query);
  185. Assert.Equal(null, iq.QueryParameters["p0"]);
  186. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  187. }
  188. }
  189. }
  190. [Fact]
  191. public void IsNullOrEmptyEqFalse()
  192. {
  193. using (var store = GetDocumentStore())
  194. {
  195. using (var session = store.OpenSession())
  196. {
  197. var indexedUsers = GetRavenQueryInspector(session);
  198. var q = indexedUsers.Where(user => string.IsNullOrEmpty(user.Name) == false);
  199. var iq = RavenTestHelper.GetIndexQuery(q);
  200. Assert.Equal("from IndexedUsers where (true and not (Name = $p0 or Name = $p1))", iq.Query);
  201. Assert.Equal(null, iq.QueryParameters["p0"]);
  202. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  203. }
  204. }
  205. }
  206. [Fact]
  207. public void IsNullOrEmptyNegated()
  208. {
  209. using (var store = GetDocumentStore())
  210. {
  211. using (var session = store.OpenSession())
  212. {
  213. var indexedUsers = GetRavenQueryInspector(session);
  214. var q = indexedUsers.Where(user => !string.IsNullOrEmpty(user.Name));
  215. var iq = RavenTestHelper.GetIndexQuery(q);
  216. Assert.Equal("from IndexedUsers where (true and not (Name = $p0 or Name = $p1))", iq.Query);
  217. Assert.Equal(null, iq.QueryParameters["p0"]);
  218. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  219. }
  220. }
  221. }
  222. [Fact]
  223. public void IsNullOrEmpty_Any()
  224. {
  225. using (var store = GetDocumentStore())
  226. {
  227. using (var session = store.OpenSession())
  228. {
  229. var indexedUsers = GetRavenQueryInspector(session);
  230. var q = indexedUsers.Where(user => user.Name.Any());
  231. var iq = RavenTestHelper.GetIndexQuery(q);
  232. Assert.Equal("from IndexedUsers where (Name != $p0 and Name != $p1)", iq.Query);
  233. Assert.Equal(null, iq.QueryParameters["p0"]);
  234. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  235. }
  236. }
  237. }
  238. [Fact]
  239. public void IsNullOrEmpty_Any_Negated_Not_Supported()
  240. {
  241. using (var store = GetDocumentStore())
  242. {
  243. using (var session = store.OpenSession())
  244. {
  245. var indexedUsers = GetRavenQueryInspector(session);
  246. var q = indexedUsers.Where(user => !user.Name.Any());
  247. var exception = Assert.Throws<InvalidOperationException>(() => q.ToString());
  248. Assert.Equal("Cannot process negated Any(), see RavenDB-732 http://issues.hibernatingrhinos.com/issue/RavenDB-732", exception.Message);
  249. }
  250. }
  251. }
  252. [Fact]
  253. public void IsNullOrEmpty_AnyEqTrue()
  254. {
  255. using (var store = GetDocumentStore())
  256. {
  257. using (var session = store.OpenSession())
  258. {
  259. var indexedUsers = GetRavenQueryInspector(session);
  260. var q = indexedUsers.Where(user => user.Name.Any() == true);
  261. var iq = RavenTestHelper.GetIndexQuery(q);
  262. Assert.Equal("from IndexedUsers where (Name != $p0 and Name != $p1)", iq.Query);
  263. Assert.Equal(null, iq.QueryParameters["p0"]);
  264. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  265. }
  266. }
  267. }
  268. [Fact]
  269. public void IsNullOrEmpty_AnyEqFalse()
  270. {
  271. using (var store = GetDocumentStore())
  272. {
  273. using (var session = store.OpenSession())
  274. {
  275. var indexedUsers = GetRavenQueryInspector(session);
  276. var q = indexedUsers.Where(user => user.Name.Any() == false);
  277. var iq = RavenTestHelper.GetIndexQuery(q);
  278. Assert.Equal("from IndexedUsers where (true and not (Name != $p0 and Name != $p1))", iq.Query);
  279. Assert.Equal(null, iq.QueryParameters["p0"]);
  280. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  281. }
  282. }
  283. }
  284. [Fact]
  285. public void IsNullOrEmpty_AnyNegated()
  286. {
  287. using (var store = GetDocumentStore())
  288. {
  289. using (var session = store.OpenSession())
  290. {
  291. var indexedUsers = GetRavenQueryInspector(session);
  292. var q = indexedUsers.Where(user => user.Name.Any() == false);
  293. var iq = RavenTestHelper.GetIndexQuery(q);
  294. Assert.Equal("from IndexedUsers where (true and not (Name != $p0 and Name != $p1))", iq.Query);
  295. Assert.Equal(null, iq.QueryParameters["p0"]);
  296. Assert.Equal(string.Empty, iq.QueryParameters["p1"]);
  297. // Note: this can be generated also a smaller query:
  298. // Assert.Equal("*:* and (Name:[[NULL_VALUE]] or Name:[[EMPTY_STRING]])", q.ToString());
  299. }
  300. }
  301. }
  302. [Fact]
  303. public void AnyWithPredicateShouldBeNotSupported()
  304. {
  305. using (var store = GetDocumentStore())
  306. {
  307. using (var session = store.OpenSession())
  308. {
  309. var indexedUsers = GetRavenQueryInspector(session);
  310. var q = indexedUsers.Where(user => user.Name.Any(char.IsUpper));
  311. var exception = Assert.Throws<NotSupportedException>(() => q.ToString());
  312. Assert.Contains("Method not supported", exception.InnerException.Message);
  313. }
  314. }
  315. }
  316. [Fact]
  317. public void BracesOverrideOperatorPrecedence_second_method()
  318. {
  319. using (var store = GetDocumentStore())
  320. {
  321. using (var session = store.OpenSession())
  322. {
  323. var indexedUsers = GetRavenQueryInspector(session);
  324. var q = indexedUsers.Where(user => user.Name == "ayende" && (user.Name == "rob" || user.Name == "dave"));
  325. var iq = RavenTestHelper.GetIndexQuery(q);
  326. Assert.Equal("from IndexedUsers where Name = $p0 and (Name = $p1 or Name = $p2)", iq.Query);
  327. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  328. Assert.Equal("rob", iq.QueryParameters["p1"]);
  329. Assert.Equal("dave", iq.QueryParameters["p2"]);
  330. // Note: this can be generated also a smaller query:
  331. // Assert.Equal("*:* and (Name:[[NULL_VALUE]] or Name:[[EMPTY_STRING]])", q.ToString());
  332. }
  333. }
  334. }
  335. [Fact]
  336. public void BracesOverrideOperatorPrecedence_third_method()
  337. {
  338. using (var store = GetDocumentStore())
  339. {
  340. using (var session = store.OpenSession())
  341. {
  342. var indexedUsers = GetRavenQueryInspector(session);
  343. var q = indexedUsers.Where(user => user.Name == "ayende");
  344. q = q.Where(user => (user.Name == "rob" || user.Name == "dave"));
  345. var iq = RavenTestHelper.GetIndexQuery(q);
  346. Assert.Equal("from IndexedUsers where (Name = $p0) and (Name = $p1 or Name = $p2)", iq.Query);
  347. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  348. Assert.Equal("rob", iq.QueryParameters["p1"]);
  349. Assert.Equal("dave", iq.QueryParameters["p2"]);
  350. }
  351. }
  352. }
  353. [Fact]
  354. public void CanForceUsingIgnoreCase()
  355. {
  356. using (var store = GetDocumentStore())
  357. {
  358. using (var session = store.OpenSession())
  359. {
  360. var indexedUsers = GetRavenQueryInspector(session);
  361. var q = from user in indexedUsers
  362. where user.Name.Equals("ayende", StringComparison.OrdinalIgnoreCase)
  363. select user;
  364. var iq = RavenTestHelper.GetIndexQuery(q);
  365. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  366. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  367. }
  368. }
  369. }
  370. [Fact]
  371. public void CanCompareValueThenPropertyGT()
  372. {
  373. using (var store = GetDocumentStore())
  374. {
  375. using (var session = store.OpenSession())
  376. {
  377. var indexedUsers = GetRavenQueryInspector(session);
  378. var q = from user in indexedUsers
  379. where 15 > user.Age
  380. select user;
  381. var iq = RavenTestHelper.GetIndexQuery(q);
  382. Assert.Equal("from IndexedUsers where Age < $p0", iq.Query);
  383. Assert.Equal(15, iq.QueryParameters["p0"]);
  384. }
  385. }
  386. }
  387. [Fact]
  388. public void CanCompareValueThenPropertyGE()
  389. {
  390. using (var store = GetDocumentStore())
  391. {
  392. using (var session = store.OpenSession())
  393. {
  394. var indexedUsers = GetRavenQueryInspector(session);
  395. var q = from user in indexedUsers
  396. where 15 >= user.Age
  397. select user;
  398. var iq = RavenTestHelper.GetIndexQuery(q);
  399. Assert.Equal("from IndexedUsers where Age <= $p0", iq.Query);
  400. Assert.Equal(15, iq.QueryParameters["p0"]);
  401. }
  402. }
  403. }
  404. [Fact]
  405. public void CanCompareValueThenPropertyLT()
  406. {
  407. using (var store = GetDocumentStore())
  408. {
  409. using (var session = store.OpenSession())
  410. {
  411. var indexedUsers = GetRavenQueryInspector(session);
  412. var q = from user in indexedUsers
  413. where 15 < user.Age
  414. select user;
  415. var iq = RavenTestHelper.GetIndexQuery(q);
  416. Assert.Equal("from IndexedUsers where Age > $p0", iq.Query);
  417. Assert.Equal(15, iq.QueryParameters["p0"]);
  418. }
  419. }
  420. }
  421. [Fact]
  422. public void CanCompareValueThenPropertyLE()
  423. {
  424. using (var store = GetDocumentStore())
  425. {
  426. using (var session = store.OpenSession())
  427. {
  428. var indexedUsers = GetRavenQueryInspector(session);
  429. var q = from user in indexedUsers
  430. where 15 <= user.Age
  431. select user;
  432. var iq = RavenTestHelper.GetIndexQuery(q);
  433. Assert.Equal("from IndexedUsers where Age >= $p0", iq.Query);
  434. Assert.Equal(15, iq.QueryParameters["p0"]);
  435. }
  436. }
  437. }
  438. [Fact]
  439. public void CanCompareValueThenPropertyEQ()
  440. {
  441. using (var store = GetDocumentStore())
  442. {
  443. using (var session = store.OpenSession())
  444. {
  445. var indexedUsers = GetRavenQueryInspector(session);
  446. var q = from user in indexedUsers
  447. where 15 == user.Age
  448. select user;
  449. var iq = RavenTestHelper.GetIndexQuery(q);
  450. Assert.Equal("from IndexedUsers where Age = $p0", iq.Query);
  451. Assert.Equal(15, iq.QueryParameters["p0"]);
  452. }
  453. }
  454. }
  455. [Fact]
  456. public void CanCompareValueThenPropertyNE()
  457. {
  458. using (var store = GetDocumentStore())
  459. {
  460. using (var session = store.OpenSession())
  461. {
  462. var indexedUsers = GetRavenQueryInspector(session);
  463. var q = from user in indexedUsers
  464. where 15 != user.Age
  465. select user;
  466. var iq = RavenTestHelper.GetIndexQuery(q);
  467. Assert.Equal("from IndexedUsers where Age != $p0", iq.Query);
  468. Assert.Equal(15, iq.QueryParameters["p0"]);
  469. }
  470. }
  471. }
  472. [Fact]
  473. public void CanUnderstandSimpleEquality()
  474. {
  475. using (var store = GetDocumentStore())
  476. {
  477. using (var session = store.OpenSession())
  478. {
  479. var indexedUsers = GetRavenQueryInspector(session);
  480. var q = from user in indexedUsers
  481. where user.Name == "ayende"
  482. select user;
  483. var iq = RavenTestHelper.GetIndexQuery(q);
  484. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  485. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  486. }
  487. }
  488. }
  489. private static RavenQueryInspector<IndexedUser> GetRavenQueryInspector(IDocumentSession session)
  490. {
  491. return (RavenQueryInspector<IndexedUser>)session.Query<IndexedUser>();
  492. }
  493. private static RavenQueryInspector<IndexedUser> GetRavenQueryInspectorStatic(IDocumentSession session)
  494. {
  495. return (RavenQueryInspector<IndexedUser>)session.Query<IndexedUser>("static");
  496. }
  497. [Fact]
  498. public void CanUnderstandSimpleEqualityWithVariable()
  499. {
  500. using (var store = GetDocumentStore())
  501. {
  502. using (var session = store.OpenSession())
  503. {
  504. var indexedUsers = GetRavenQueryInspector(session);
  505. var ayende = "ayende" + 1;
  506. var q = from user in indexedUsers
  507. where user.Name == ayende
  508. select user;
  509. var iq = RavenTestHelper.GetIndexQuery(q);
  510. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  511. Assert.Equal(ayende, iq.QueryParameters["p0"]);
  512. }
  513. }
  514. }
  515. [Fact]
  516. public void CanUnderstandSimpleContains()
  517. {
  518. using (var store = GetDocumentStore())
  519. {
  520. using (var session = store.OpenSession())
  521. {
  522. var indexedUsers = GetRavenQueryInspector(session);
  523. var q = from user in indexedUsers
  524. where user.Name == ("ayende")
  525. select user;
  526. var iq = RavenTestHelper.GetIndexQuery(q);
  527. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  528. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  529. }
  530. }
  531. }
  532. [Fact]
  533. public void CanUnderstandSimpleContainsWithClauses()
  534. {
  535. using (var store = GetDocumentStore())
  536. {
  537. using (var session = store.OpenSession())
  538. {
  539. var indexedUsers = GetRavenQueryInspector(session);
  540. var q = from x in indexedUsers
  541. where x.Name == ("ayende")
  542. select x;
  543. Assert.NotNull(q);
  544. var iq = RavenTestHelper.GetIndexQuery(q);
  545. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  546. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  547. }
  548. }
  549. }
  550. [Fact]
  551. public void CanUnderstandSimpleContainsInExpression1()
  552. {
  553. using (var store = GetDocumentStore())
  554. {
  555. using (var session = store.OpenSession())
  556. {
  557. var indexedUsers = GetRavenQueryInspector(session);
  558. var q = from x in indexedUsers
  559. where x.Name == ("ayende")
  560. select x;
  561. Assert.NotNull(q);
  562. var iq = RavenTestHelper.GetIndexQuery(q);
  563. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  564. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  565. }
  566. }
  567. }
  568. [Fact]
  569. public void CanUnderstandSimpleContainsInExpression2()
  570. {
  571. using (var store = GetDocumentStore())
  572. {
  573. using (var session = store.OpenSession())
  574. {
  575. var indexedUsers = GetRavenQueryInspector(session);
  576. var q = from x in indexedUsers
  577. where x.Name == ("ayende")
  578. select x;
  579. Assert.NotNull(q);
  580. var iq = RavenTestHelper.GetIndexQuery(q);
  581. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  582. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  583. }
  584. }
  585. }
  586. [Fact]
  587. public void CanUnderstandSimpleStartsWithInExpression1()
  588. {
  589. using (var store = GetDocumentStore())
  590. {
  591. using (var session = store.OpenSession())
  592. {
  593. var indexedUsers = GetRavenQueryInspector(session);
  594. var q = from x in indexedUsers
  595. where x.Name.StartsWith("ayende")
  596. select x;
  597. Assert.NotNull(q);
  598. var iq = RavenTestHelper.GetIndexQuery(q);
  599. Assert.Equal("from IndexedUsers where startsWith(Name, $p0)", iq.Query);
  600. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  601. }
  602. }
  603. }
  604. [Fact]
  605. public void CanUnderstandSimpleStartsWithInExpression2()
  606. {
  607. using (var store = GetDocumentStore())
  608. {
  609. using (var session = store.OpenSession())
  610. {
  611. var indexedUsers = GetRavenQueryInspector(session);
  612. var q = from indexedUser in indexedUsers
  613. where indexedUser.Name.StartsWith("ayende")
  614. select indexedUser;
  615. Assert.NotNull(q);
  616. var iq = RavenTestHelper.GetIndexQuery(q);
  617. Assert.Equal("from IndexedUsers where startsWith(Name, $p0)", iq.Query);
  618. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  619. }
  620. }
  621. }
  622. [Fact]
  623. public void CanUnderstandSimpleContainsWithVariable()
  624. {
  625. using (var store = GetDocumentStore())
  626. {
  627. using (var session = store.OpenSession())
  628. {
  629. var indexedUsers = GetRavenQueryInspector(session);
  630. var ayende = "ayende" + 1;
  631. var q = from user in indexedUsers
  632. where user.Name == (ayende)
  633. select user;
  634. var iq = RavenTestHelper.GetIndexQuery(q);
  635. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  636. Assert.Equal("ayende1", iq.QueryParameters["p0"]);
  637. }
  638. }
  639. }
  640. [Fact]
  641. public void NoOpShouldProduceEmptyString()
  642. {
  643. using (var store = GetDocumentStore())
  644. {
  645. using (var session = store.OpenSession())
  646. {
  647. var indexedUsers = GetRavenQueryInspector(session);
  648. var q = from user in indexedUsers
  649. select user;
  650. Assert.Equal("from IndexedUsers", q.ToString());
  651. }
  652. }
  653. }
  654. [Fact]
  655. public void CanUnderstandAnd()
  656. {
  657. using (var store = GetDocumentStore())
  658. {
  659. using (var session = store.OpenSession())
  660. {
  661. var indexedUsers = GetRavenQueryInspector(session);
  662. var q = from user in indexedUsers
  663. where user.Name == ("ayende") && user.Email == ("ayende@ayende.com")
  664. select user;
  665. var iq = RavenTestHelper.GetIndexQuery(q);
  666. Assert.Equal("from IndexedUsers where Name = $p0 and Email = $p1", iq.Query);
  667. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  668. Assert.Equal("ayende@ayende.com", iq.QueryParameters["p1"]);
  669. }
  670. }
  671. }
  672. [Fact]
  673. public void CanUnderstandOr()
  674. {
  675. using (var store = GetDocumentStore())
  676. {
  677. using (var session = store.OpenSession())
  678. {
  679. var indexedUsers = GetRavenQueryInspector(session);
  680. var q = from user in indexedUsers
  681. where user.Name == ("ayende") || user.Email == ("ayende@ayende.com")
  682. select user;
  683. var iq = RavenTestHelper.GetIndexQuery(q);
  684. Assert.Equal("from IndexedUsers where Name = $p0 or Email = $p1", iq.Query);
  685. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  686. Assert.Equal("ayende@ayende.com", iq.QueryParameters["p1"]);
  687. }
  688. }
  689. }
  690. [Fact]
  691. public void WithNoBracesOperatorPrecedenceIsHonored()
  692. {
  693. using (var store = GetDocumentStore())
  694. {
  695. using (var session = store.OpenSession())
  696. {
  697. var indexedUsers = GetRavenQueryInspector(session);
  698. var q = from user in indexedUsers
  699. where user.Name == "ayende" && user.Name == "rob" || user.Name == "dave"
  700. select user;
  701. var iq = RavenTestHelper.GetIndexQuery(q);
  702. Assert.Equal("from IndexedUsers where (Name = $p0 and Name = $p1) or Name = $p2", iq.Query);
  703. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  704. Assert.Equal("rob", iq.QueryParameters["p1"]);
  705. Assert.Equal("dave", iq.QueryParameters["p2"]);
  706. }
  707. }
  708. }
  709. [Fact]
  710. public void BracesOverrideOperatorPrecedence()
  711. {
  712. using (var store = GetDocumentStore())
  713. {
  714. using (var session = store.OpenSession())
  715. {
  716. var indexedUsers = GetRavenQueryInspector(session);
  717. var q = from user in indexedUsers
  718. where user.Name == "ayende" && (user.Name == "rob" || user.Name == "dave")
  719. select user;
  720. var iq = RavenTestHelper.GetIndexQuery(q);
  721. Assert.Equal("from IndexedUsers where Name = $p0 and (Name = $p1 or Name = $p2)", iq.Query);
  722. Assert.Equal("ayende", iq.QueryParameters["p0"]);
  723. Assert.Equal("rob", iq.QueryParameters["p1"]);
  724. Assert.Equal("dave", iq.QueryParameters["p2"]);
  725. }
  726. }
  727. }
  728. [Fact]
  729. public void CanUnderstandLessThan()
  730. {
  731. using (var store = GetDocumentStore())
  732. {
  733. using (var session = store.OpenSession())
  734. {
  735. var indexedUsers = GetRavenQueryInspector(session);
  736. var q = from user in indexedUsers
  737. where user.Birthday < new DateTime(2010, 05, 15)
  738. select user;
  739. var iq = RavenTestHelper.GetIndexQuery(q);
  740. Assert.Equal("from IndexedUsers where Birthday < $p0", iq.Query);
  741. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  742. }
  743. }
  744. }
  745. [Fact]
  746. public void NegatingSubClauses()
  747. {
  748. using (var store = GetDocumentStore())
  749. {
  750. using (var session = store.OpenSession())
  751. {
  752. var query = ((IDocumentQuery<object>)new DocumentQuery<object>(null, null, "IndexedUsers", false)).Not
  753. .OpenSubclause()
  754. .WhereEquals("IsPublished", true)
  755. .AndAlso()
  756. .WhereEquals("Tags.Length", 0)
  757. .CloseSubclause();
  758. var iq = query.GetIndexQuery();
  759. Assert.Equal("from IndexedUsers where true and not (IsPublished = $p0 and Tags.Length = $p1)", iq.Query);
  760. Assert.Equal(true, iq.QueryParameters["p0"]);
  761. Assert.Equal(0, iq.QueryParameters["p1"]);
  762. }
  763. }
  764. }
  765. [Fact]
  766. public void CanUnderstandEqualOnDate()
  767. {
  768. using (var store = GetDocumentStore())
  769. {
  770. using (var session = store.OpenSession())
  771. {
  772. var indexedUsers = GetRavenQueryInspector(session);
  773. var q = from user in indexedUsers
  774. where user.Birthday == new DateTime(2010, 05, 15)
  775. select user;
  776. var iq = RavenTestHelper.GetIndexQuery(q);
  777. Assert.Equal("from IndexedUsers where Birthday = $p0", q.ToString());
  778. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  779. }
  780. }
  781. }
  782. [Fact]
  783. public void CanUnderstandLessThanOrEqualsTo()
  784. {
  785. using (var store = GetDocumentStore())
  786. {
  787. using (var session = store.OpenSession())
  788. {
  789. var indexedUsers = GetRavenQueryInspector(session);
  790. var q = from user in indexedUsers
  791. where user.Birthday <= new DateTime(2010, 05, 15)
  792. select user;
  793. var iq = RavenTestHelper.GetIndexQuery(q);
  794. Assert.Equal("from IndexedUsers where Birthday <= $p0", q.ToString());
  795. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  796. }
  797. }
  798. }
  799. [Fact]
  800. public void CanUnderstandGreaterThan()
  801. {
  802. using (var store = GetDocumentStore())
  803. {
  804. using (var session = store.OpenSession())
  805. {
  806. var indexedUsers = GetRavenQueryInspector(session);
  807. var q = from user in indexedUsers
  808. where user.Birthday > new DateTime(2010, 05, 15)
  809. select user;
  810. var iq = RavenTestHelper.GetIndexQuery(q);
  811. Assert.Equal("from IndexedUsers where Birthday > $p0", q.ToString());
  812. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  813. }
  814. }
  815. }
  816. [Fact]
  817. public void CanUnderstandGreaterThanOrEqualsTo()
  818. {
  819. using (var store = GetDocumentStore())
  820. {
  821. using (var session = store.OpenSession())
  822. {
  823. var indexedUsers = GetRavenQueryInspector(session);
  824. var q = from user in indexedUsers
  825. where user.Birthday >= new DateTime(2010, 05, 15)
  826. select user;
  827. var iq = RavenTestHelper.GetIndexQuery(q);
  828. Assert.Equal("from IndexedUsers where Birthday >= $p0", q.ToString());
  829. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  830. }
  831. }
  832. }
  833. [Fact]
  834. public void CanUnderstandProjectionOfOneField()
  835. {
  836. using (var store = GetDocumentStore())
  837. {
  838. using (var session = store.OpenSession())
  839. {
  840. var indexedUsers = GetRavenQueryInspector(session);
  841. var q = from user in indexedUsers
  842. where user.Birthday >= new DateTime(2010, 05, 15)
  843. select user.Name;
  844. var iq = RavenTestHelper.GetIndexQuery(q);
  845. Assert.Equal("from IndexedUsers where Birthday >= $p0 select Name", iq.Query);
  846. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  847. }
  848. }
  849. }
  850. [Fact]
  851. public void CanUnderstandProjectionOfMultipleFields()
  852. {
  853. using (var store = GetDocumentStore())
  854. {
  855. using (var session = store.OpenSession())
  856. {
  857. var indexedUsers = GetRavenQueryInspector(session);
  858. var dateTime = new DateTime(2010, 05, 15);
  859. var q = from user in indexedUsers
  860. where user.Birthday >= dateTime
  861. select new { user.Name, user.Age };
  862. var iq = RavenTestHelper.GetIndexQuery(q);
  863. Assert.Equal("from IndexedUsers where Birthday >= $p0 select Name, Age", iq.Query);
  864. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  865. }
  866. }
  867. }
  868. [Fact]
  869. public void CanUnderstandSimpleEqualityOnInt()
  870. {
  871. using (var store = GetDocumentStore())
  872. {
  873. using (var session = store.OpenSession())
  874. {
  875. var indexedUsers = GetRavenQueryInspector(session);
  876. var q = from user in indexedUsers
  877. where user.Age == 3
  878. select user;
  879. var iq = RavenTestHelper.GetIndexQuery(q);
  880. Assert.Equal("from IndexedUsers where Age = $p0", iq.Query);
  881. Assert.Equal(3, iq.QueryParameters["p0"]);
  882. }
  883. }
  884. }
  885. [Fact]
  886. public void CanUnderstandGreaterThanOnInt()
  887. {
  888. using (var store = GetDocumentStore())
  889. {
  890. using (var session = store.OpenSession())
  891. {
  892. var indexedUsers = GetRavenQueryInspector(session);
  893. var q = from user in indexedUsers
  894. where user.Age > 3
  895. select user;
  896. var iq = RavenTestHelper.GetIndexQuery(q);
  897. Assert.Equal("from IndexedUsers where Age > $p0", q.ToString());
  898. Assert.Equal(3, iq.QueryParameters["p0"]);
  899. }
  900. }
  901. }
  902. [Fact]
  903. public void CanUnderstandMethodCalls()
  904. {
  905. using (var store = GetDocumentStore())
  906. {
  907. using (var session = store.OpenSession())
  908. {
  909. var indexedUsers = GetRavenQueryInspector(session);
  910. var q = from user in indexedUsers
  911. where user.Birthday >= DateTime.Parse("2010-05-15")
  912. select new { user.Name, user.Age };
  913. var iq = RavenTestHelper.GetIndexQuery(q);
  914. Assert.Equal("from IndexedUsers where Birthday >= $p0 select Name, Age", iq.Query);
  915. Assert.Equal(new DateTime(2010, 05, 15), iq.QueryParameters["p0"]);
  916. }
  917. }
  918. }
  919. [Fact]
  920. public void CanUnderstandConvertExpressions()
  921. {
  922. using (var store = GetDocumentStore())
  923. {
  924. using (var session = store.OpenSession())
  925. {
  926. var indexedUsers = GetRavenQueryInspector(session);
  927. var q = from user in indexedUsers
  928. where user.Age == Convert.ToInt16("3")
  929. select user;
  930. var iq = RavenTestHelper.GetIndexQuery(q);
  931. Assert.Equal("from IndexedUsers where Age = $p0", q.ToString());
  932. Assert.Equal(3, iq.QueryParameters["p0"]);
  933. }
  934. }
  935. }
  936. [Fact]
  937. public void CanChainMultipleWhereClauses()
  938. {
  939. using (var store = GetDocumentStore())
  940. {
  941. using (var session = store.OpenSession())
  942. {
  943. var indexedUsers = GetRavenQueryInspector(session);
  944. var q = indexedUsers
  945. .Where(x => x.Age == 3)
  946. .Where(x => x.Name == "ayende");
  947. var iq = RavenTestHelper.GetIndexQuery(q);
  948. Assert.Equal("from IndexedUsers where (Age = $p0) and (Name = $p1)", iq.Query);
  949. Assert.Equal(3, iq.QueryParameters["p0"]);
  950. Assert.Equal("ayende", iq.QueryParameters["p1"]);
  951. }
  952. }
  953. }
  954. [Fact]
  955. public void CanUnderstandSimpleAny_Dynamic()
  956. {
  957. using (var store = GetDocumentStore())
  958. {
  959. using (var session = store.OpenSession())
  960. {
  961. var indexedUsers = GetRavenQueryInspector(session);
  962. var q = indexedUsers.Where(x => x.Properties.Any(y => y.Key == "first"));
  963. var iq = RavenTestHelper.GetIndexQuery(q);
  964. Assert.Equal("from IndexedUsers where Properties[].Key = $p0", iq.Query);
  965. Assert.Equal("first", iq.QueryParameters["p0"]);
  966. }
  967. }
  968. }
  969. [Fact]
  970. public void CanUnderstandSimpleAny_Static()
  971. {
  972. using (var store = GetDocumentStore())
  973. {
  974. using (var session = store.OpenSession())
  975. {
  976. var indexedUsers = GetRavenQueryInspectorStatic(session);
  977. var q = indexedUsers.Where(x => x.Properties.Any(y => y.Key == "first"));
  978. var iq = RavenTestHelper.GetIndexQuery(q);
  979. Assert.Equal("from index 'static' where Properties_Key = $p0", iq.Query);
  980. Assert.Equal("first", iq.QueryParameters["p0"]);
  981. }
  982. }
  983. }
  984. [Fact]
  985. public void AnyOnCollection()
  986. {
  987. using (var store = GetDocumentStore())
  988. {
  989. using (var session = store.OpenSession())
  990. {
  991. var indexedUsers = GetRavenQueryInspector(session);
  992. var q = indexedUsers.Where(x => x.Properties.Any());
  993. var iq = RavenTestHelper.GetIndexQuery(q);
  994. Assert.Equal("from IndexedUsers where exists(Properties)", iq.Query);
  995. }
  996. }
  997. }
  998. [Fact]
  999. public void AnyOnCollectionEqTrue()
  1000. {
  1001. using (var store = GetDocumentStore())
  1002. {
  1003. using (var session = store.OpenSession())
  1004. {
  1005. var indexedUsers = GetRavenQueryInspector(session);
  1006. var q = indexedUsers.Where(x => x.Properties.Any() == true);
  1007. var iq = RavenTestHelper.GetIndexQuery(q);
  1008. Assert.Equal("from IndexedUsers where exists(Properties)", iq.Query);
  1009. }
  1010. }
  1011. }
  1012. [Fact]
  1013. public void AnyOnCollectionEqFalse()
  1014. {
  1015. using (var store = GetDocumentStore())
  1016. {
  1017. using (var session = store.OpenSession())
  1018. {
  1019. var indexedUsers = GetRavenQueryInspector(session);
  1020. var q = indexedUsers.Where(x => x.Properties.Any() == false);
  1021. var iq = RavenTestHelper.GetIndexQuery(q);
  1022. Assert.Equal("from IndexedUsers where (true and not exists(Properties))", iq.Query);
  1023. }
  1024. }
  1025. }
  1026. [Fact]
  1027. public void WillWrapLuceneSaveKeyword_NOT()
  1028. {
  1029. using (var store = GetDocumentStore())
  1030. {
  1031. using (var session = store.OpenSession())
  1032. {
  1033. var indexedUsers = GetRavenQueryInspector(session);
  1034. var q = indexedUsers.Where(x => x.Name == "NOT");
  1035. var iq = RavenTestHelper.GetIndexQuery(q);
  1036. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  1037. Assert.Equal("NOT", iq.QueryParameters["p0"]);
  1038. }
  1039. }
  1040. }
  1041. [Fact]
  1042. public void WillWrapLuceneSaveKeyword_OR()
  1043. {
  1044. using (var store = GetDocumentStore())
  1045. {
  1046. using (var session = store.OpenSession())
  1047. {
  1048. var indexedUsers = GetRavenQueryInspector(session);
  1049. var q = indexedUsers.Where(x => x.Name == "OR");
  1050. var iq = RavenTestHelper.GetIndexQuery(q);
  1051. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  1052. Assert.Equal("OR", iq.QueryParameters["p0"]);
  1053. }
  1054. }
  1055. }
  1056. [Fact]
  1057. public void WillWrapLuceneSaveKeyword_AND()
  1058. {
  1059. using (var store = GetDocumentStore())
  1060. {
  1061. using (var session = store.OpenSession())
  1062. {
  1063. var indexedUsers = GetRavenQueryInspector(session);
  1064. var q = indexedUsers.Where(x => x.Name == "AND");
  1065. var iq = RavenTestHelper.GetIndexQuery(q);
  1066. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  1067. Assert.Equal("AND", iq.QueryParameters["p0"]);
  1068. }
  1069. }
  1070. }
  1071. [Fact]
  1072. public void WillNotWrapCaseNotMatchedLuceneSaveKeyword_And()
  1073. {
  1074. using (var store = GetDocumentStore())
  1075. {
  1076. using (var session = store.OpenSession())
  1077. {
  1078. var indexedUsers = GetRavenQueryInspector(session);
  1079. var q = indexedUsers.Where(x => x.Name == "And");
  1080. var iq = RavenTestHelper.GetIndexQuery(q);
  1081. Assert.Equal("from IndexedUsers where Name = $p0", iq.Query);
  1082. Assert.Equal("And", iq.QueryParameters["p0"]);
  1083. }
  1084. }
  1085. }
  1086. private class IndexedUser
  1087. {
  1088. public int Age { get; set; }
  1089. public DateTime Birthday { get; set; }
  1090. public string Name { get; set; }
  1091. public string Email { get; set; }
  1092. public UserProperty[] Properties { get; set; }
  1093. public bool IsActive { get; set; }
  1094. public IAnimal Animal { get; set; }
  1095. public double Rate { get; set; }
  1096. }
  1097. private interface IAnimal
  1098. {
  1099. }
  1100. private class Dog : IAnimal
  1101. {
  1102. public string Color { get; set; }
  1103. }
  1104. private class UserProperty
  1105. {
  1106. public string Key { get; set; }
  1107. public string Value { get; set; }
  1108. }
  1109. }
  1110. }