/test/SlowTests/Core/Commands/Querying.cs

https://github.com/fitzchak/ravendb · C# · 367 lines · 313 code · 54 blank · 0 comment · 5 complexity · d76b869728018ab0f9794ebef4341b3f MD5 · raw file

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Text;
  4. using FastTests;
  5. using Raven.Client.Documents;
  6. using Raven.Client.Documents.Indexes;
  7. using Raven.Client.Documents.Operations.Indexes;
  8. using Raven.Client.Documents.Queries;
  9. using Raven.Client.Documents.Queries.Facets;
  10. using Raven.Client.Documents.Queries.Suggestions;
  11. using SlowTests.Core.Utils.Indexes;
  12. using Sparrow.Json;
  13. using Xunit;
  14. using Camera = SlowTests.Core.Utils.Entities.Camera;
  15. using Company = SlowTests.Core.Utils.Entities.Company;
  16. using Contact = SlowTests.Core.Utils.Entities.Contact;
  17. using User = SlowTests.Core.Utils.Entities.User;
  18. namespace SlowTests.Core.Commands
  19. {
  20. public class Querying : RavenTestBase
  21. {
  22. [Fact]
  23. public void CanDoSimpleQueryOnDatabase()
  24. {
  25. const string indexName = "CompaniesByName";
  26. using (var store = GetDocumentStore())
  27. {
  28. var contact1 = new Contact { FirstName = "Expression Name" };
  29. var contact2 = new Contact { FirstName = "Expression First Name" };
  30. var contact3 = new Contact { FirstName = "First Name" };
  31. using (var commands = store.Commands())
  32. {
  33. commands.Put("contacts/1", null, contact1, new Dictionary<string, object> { { "@collection", "Contacts" } });
  34. commands.Put("contacts/2", null, contact2, new Dictionary<string, object> { { "@collection", "Contacts" } });
  35. commands.Put("contacts/3", null, contact3, new Dictionary<string, object> { { "@collection", "Contacts" } });
  36. store.Maintenance.Send(new PutIndexesOperation(new IndexDefinition
  37. {
  38. Maps = { "from contact in docs.Contacts select new { contact.FirstName }" },
  39. Name = indexName
  40. }));
  41. WaitForIndexing(store);
  42. var companies = commands.Query(new IndexQuery { Query = $"FROM INDEX '{indexName}'" });
  43. Assert.Equal(3, companies.TotalResults);
  44. var company = (BlittableJsonReaderObject)companies.Results[0];
  45. string firstName;
  46. Assert.True(company.TryGet("FirstName", out firstName));
  47. Assert.Equal("Expression Name", firstName);
  48. company = (BlittableJsonReaderObject)companies.Results[1];
  49. Assert.True(company.TryGet("FirstName", out firstName));
  50. Assert.Equal("Expression First Name", firstName);
  51. company = (BlittableJsonReaderObject)companies.Results[2];
  52. Assert.True(company.TryGet("FirstName", out firstName));
  53. Assert.Equal("First Name", firstName);
  54. }
  55. }
  56. }
  57. [Fact]
  58. public void CanProcessLongQueryString()
  59. {
  60. using (var store = GetDocumentStore())
  61. {
  62. using (var session = store.OpenSession())
  63. {
  64. var entity1 = new Company { Name = "Async Company #1", Id = "companies/1" };
  65. session.Store(entity1);
  66. var entity2 = new Company { Name = "Async Company #2", Id = "companies/2" };
  67. session.Store(entity2);
  68. session.SaveChanges();
  69. store.Maintenance.Send(new PutIndexesOperation(new[] {new IndexDefinition
  70. {
  71. Maps = { "from doc in docs.Companies select new { doc.Name }" },
  72. Name = "Test"
  73. }}));
  74. WaitForIndexing(store);
  75. }
  76. var stringBuilder = new StringBuilder("FROM INDEX 'Test' WHERE");
  77. while (stringBuilder.Length < 16 * 1024)
  78. {
  79. stringBuilder.Append(@" (Name = 'Async Company #1') OR");
  80. }
  81. stringBuilder.Append(@" (Name = 'Async Company #2')");
  82. var indexQuery = new IndexQuery { Start = 0, PageSize = 50, Query = stringBuilder.ToString() };
  83. using (var commands = store.Commands())
  84. {
  85. var queryResult = commands.Query(indexQuery);
  86. Assert.Equal(2, queryResult.TotalResults);
  87. }
  88. }
  89. }
  90. [Fact]
  91. public void CanStreamQueryResult()
  92. {
  93. using (var store = GetDocumentStore())
  94. {
  95. var index = new Users_ByName();
  96. index.Execute(store);
  97. using (var commands = store.Commands())
  98. {
  99. for (int i = 0; i < 30; i++)
  100. {
  101. commands.Put("users/" + i, null, new User { Name = "Name" + i }, new Dictionary<string, object> { { "@collection", "Users" } });
  102. }
  103. }
  104. WaitForIndexing(store);
  105. var count = 0;
  106. using (var session = store.OpenSession())
  107. {
  108. var enumerator = session.Advanced.Stream(session.Query<User, Users_ByName>());
  109. while (enumerator.MoveNext())
  110. {
  111. count++;
  112. }
  113. }
  114. Assert.Equal(30, count);
  115. }
  116. }
  117. [Fact]
  118. public void CanGetFacets()
  119. {
  120. using (var store = GetDocumentStore())
  121. {
  122. var index = new CameraCost();
  123. index.Execute(store);
  124. using (var commands = store.Commands())
  125. {
  126. for (var i = 0; i < 10; i++)
  127. {
  128. commands.Put(
  129. "cameras/" + i,
  130. null,
  131. new Camera
  132. {
  133. Id = "cameras/" + i,
  134. Manufacturer = i % 2 == 0 ? "Manufacturer1" : "Manufacturer2",
  135. Cost = i * 100D,
  136. Megapixels = i * 1D
  137. },
  138. new Dictionary<string, object> { { "@collection", "Cameras" } });
  139. }
  140. WaitForIndexing(store);
  141. var facets = new List<Facet>
  142. {
  143. new Facet
  144. {
  145. FieldName = "Manufacturer"
  146. }
  147. };
  148. var rangeFacets = new List<RangeFacet>
  149. {
  150. new RangeFacet
  151. {
  152. Ranges =
  153. {
  154. "Cost <= 200",
  155. "Cost >= 300 and Cost <= 400",
  156. "Cost >= 500 and Cost <= 600",
  157. "Cost >= 700 and Cost <= 800",
  158. "Cost >= 900"
  159. }
  160. },
  161. new RangeFacet
  162. {
  163. Ranges =
  164. {
  165. "Megapixels <= 3",
  166. "Megapixels >= 4 and Megapixels <= 7",
  167. "Megapixels >= 8 and Megapixels <= 10",
  168. "Megapixels >= 11",
  169. }
  170. }
  171. };
  172. commands.Put(
  173. "facets/CameraFacets",
  174. null,
  175. new FacetSetup { Id = "facets/CameraFacets", Facets = facets, RangeFacets = rangeFacets },
  176. null);
  177. WaitForIndexing(store);
  178. using (var session = store.OpenSession())
  179. {
  180. var facetResults = session
  181. .Query<Camera, CameraCost>()
  182. .AggregateUsing("facets/CameraFacets")
  183. .Execute();
  184. Assert.Equal(3, facetResults.Count);
  185. Assert.Equal(2, facetResults["Manufacturer"].Values.Count);
  186. Assert.Equal("manufacturer1", facetResults["Manufacturer"].Values[0].Range);
  187. Assert.Equal(5, facetResults["Manufacturer"].Values[0].Count);
  188. Assert.Equal("manufacturer2", facetResults["Manufacturer"].Values[1].Range);
  189. Assert.Equal(5, facetResults["Manufacturer"].Values[1].Count);
  190. Assert.Equal(5, facetResults["Cost"].Values.Count);
  191. Assert.Equal("Cost <= 200", facetResults["Cost"].Values[0].Range);
  192. Assert.Equal(3, facetResults["Cost"].Values[0].Count);
  193. Assert.Equal("Cost >= 300 and Cost <= 400", facetResults["Cost"].Values[1].Range);
  194. Assert.Equal(2, facetResults["Cost"].Values[1].Count);
  195. Assert.Equal("Cost >= 500 and Cost <= 600", facetResults["Cost"].Values[2].Range);
  196. Assert.Equal(2, facetResults["Cost"].Values[2].Count);
  197. Assert.Equal("Cost >= 700 and Cost <= 800", facetResults["Cost"].Values[3].Range);
  198. Assert.Equal(2, facetResults["Cost"].Values[3].Count);
  199. Assert.Equal("Cost >= 900", facetResults["Cost"].Values[4].Range);
  200. Assert.Equal(1, facetResults["Cost"].Values[4].Count);
  201. Assert.Equal(4, facetResults["Megapixels"].Values.Count);
  202. Assert.Equal("Megapixels <= 3", facetResults["Megapixels"].Values[0].Range);
  203. Assert.Equal(4, facetResults["Megapixels"].Values[0].Count);
  204. Assert.Equal("Megapixels >= 4 and Megapixels <= 7", facetResults["Megapixels"].Values[1].Range);
  205. Assert.Equal(4, facetResults["Megapixels"].Values[1].Count);
  206. Assert.Equal("Megapixels >= 8 and Megapixels <= 10", facetResults["Megapixels"].Values[2].Range);
  207. Assert.Equal(2, facetResults["Megapixels"].Values[2].Count);
  208. Assert.Equal("Megapixels >= 11", facetResults["Megapixels"].Values[3].Range);
  209. Assert.Equal(0, facetResults["Megapixels"].Values[3].Count);
  210. }
  211. using (var session = store.OpenSession())
  212. {
  213. var r1 = session.Query<Camera, CameraCost>()
  214. .Where(x => x.Cost < 200)
  215. .AggregateUsing("facets/CameraFacets")
  216. .Execute();
  217. var r2 = session.Query<Camera, CameraCost>()
  218. .Where(x => x.Megapixels < 3)
  219. .AggregateUsing("facets/CameraFacets")
  220. .Execute();
  221. var multiFacetResults = new[] { r1, r2 };
  222. Assert.Equal(3, multiFacetResults[0].Count);
  223. Assert.Equal(2, multiFacetResults[0]["Manufacturer"].Values.Count);
  224. Assert.Equal("manufacturer1", multiFacetResults[0]["Manufacturer"].Values[0].Range);
  225. Assert.Equal(1, multiFacetResults[0]["Manufacturer"].Values[0].Count);
  226. Assert.Equal("manufacturer2", multiFacetResults[0]["Manufacturer"].Values[1].Range);
  227. Assert.Equal(1, multiFacetResults[0]["Manufacturer"].Values[1].Count);
  228. Assert.Equal(5, multiFacetResults[0]["Cost"].Values.Count);
  229. Assert.Equal("Cost <= 200", multiFacetResults[0]["Cost"].Values[0].Range);
  230. Assert.Equal(2, multiFacetResults[0]["Cost"].Values[0].Count);
  231. Assert.Equal("Cost >= 300 and Cost <= 400", multiFacetResults[0]["Cost"].Values[1].Range);
  232. Assert.Equal(0, multiFacetResults[0]["Cost"].Values[1].Count);
  233. Assert.Equal("Cost >= 500 and Cost <= 600", multiFacetResults[0]["Cost"].Values[2].Range);
  234. Assert.Equal(0, multiFacetResults[0]["Cost"].Values[2].Count);
  235. Assert.Equal("Cost >= 700 and Cost <= 800", multiFacetResults[0]["Cost"].Values[3].Range);
  236. Assert.Equal(0, multiFacetResults[0]["Cost"].Values[3].Count);
  237. Assert.Equal("Cost >= 900", multiFacetResults[0]["Cost"].Values[4].Range);
  238. Assert.Equal(0, multiFacetResults[0]["Cost"].Values[4].Count);
  239. Assert.Equal(4, multiFacetResults[0]["Megapixels"].Values.Count);
  240. Assert.Equal("Megapixels <= 3", multiFacetResults[0]["Megapixels"].Values[0].Range);
  241. Assert.Equal(2, multiFacetResults[0]["Megapixels"].Values[0].Count);
  242. Assert.Equal("Megapixels >= 4 and Megapixels <= 7", multiFacetResults[0]["Megapixels"].Values[1].Range);
  243. Assert.Equal(0, multiFacetResults[0]["Megapixels"].Values[1].Count);
  244. Assert.Equal("Megapixels >= 8 and Megapixels <= 10", multiFacetResults[0]["Megapixels"].Values[2].Range);
  245. Assert.Equal(0, multiFacetResults[0]["Megapixels"].Values[2].Count);
  246. Assert.Equal("Megapixels >= 11", multiFacetResults[0]["Megapixels"].Values[3].Range);
  247. Assert.Equal(0, multiFacetResults[0]["Megapixels"].Values[3].Count);
  248. Assert.Equal(3, multiFacetResults[1].Count);
  249. Assert.Equal(2, multiFacetResults[1]["Manufacturer"].Values.Count);
  250. Assert.Equal("manufacturer1", multiFacetResults[1]["Manufacturer"].Values[0].Range);
  251. Assert.Equal(2, multiFacetResults[1]["Manufacturer"].Values[0].Count);
  252. Assert.Equal("manufacturer2", multiFacetResults[1]["Manufacturer"].Values[1].Range);
  253. Assert.Equal(1, multiFacetResults[1]["Manufacturer"].Values[1].Count);
  254. Assert.Equal(5, multiFacetResults[1]["Cost"].Values.Count);
  255. Assert.Equal("Cost <= 200", multiFacetResults[1]["Cost"].Values[0].Range);
  256. Assert.Equal(3, multiFacetResults[1]["Cost"].Values[0].Count);
  257. Assert.Equal("Cost >= 300 and Cost <= 400", multiFacetResults[1]["Cost"].Values[1].Range);
  258. Assert.Equal(0, multiFacetResults[1]["Cost"].Values[1].Count);
  259. Assert.Equal("Cost >= 500 and Cost <= 600", multiFacetResults[1]["Cost"].Values[2].Range);
  260. Assert.Equal(0, multiFacetResults[1]["Cost"].Values[2].Count);
  261. Assert.Equal("Cost >= 700 and Cost <= 800", multiFacetResults[1]["Cost"].Values[3].Range);
  262. Assert.Equal(0, multiFacetResults[1]["Cost"].Values[3].Count);
  263. Assert.Equal("Cost >= 900", multiFacetResults[1]["Cost"].Values[4].Range);
  264. Assert.Equal(0, multiFacetResults[1]["Cost"].Values[4].Count);
  265. Assert.Equal(4, multiFacetResults[1]["Megapixels"].Values.Count);
  266. Assert.Equal("Megapixels <= 3", multiFacetResults[1]["Megapixels"].Values[0].Range);
  267. Assert.Equal(3, multiFacetResults[1]["Megapixels"].Values[0].Count);
  268. Assert.Equal("Megapixels >= 4 and Megapixels <= 7", multiFacetResults[1]["Megapixels"].Values[1].Range);
  269. Assert.Equal(0, multiFacetResults[1]["Megapixels"].Values[1].Count);
  270. Assert.Equal("Megapixels >= 8 and Megapixels <= 10", multiFacetResults[1]["Megapixels"].Values[2].Range);
  271. Assert.Equal(0, multiFacetResults[1]["Megapixels"].Values[2].Count);
  272. Assert.Equal("Megapixels >= 11", multiFacetResults[1]["Megapixels"].Values[3].Range);
  273. Assert.Equal(0, multiFacetResults[1]["Megapixels"].Values[3].Count);
  274. }
  275. }
  276. }
  277. }
  278. [Fact]
  279. public void CanGetSuggestions()
  280. {
  281. using (var store = GetDocumentStore())
  282. {
  283. var index = new Users_ByName();
  284. index.Execute(store);
  285. using (var commands = store.Commands())
  286. {
  287. commands.Put("users/1", null, new User { Name = "John Smith" }, new Dictionary<string, object> { { "@collection", "Users" } });
  288. commands.Put("users/2", null, new User { Name = "Jack Johnson" }, new Dictionary<string, object> { { "@collection", "Users" } });
  289. commands.Put("users/3", null, new User { Name = "Robery Jones" }, new Dictionary<string, object> { { "@collection", "Users" } });
  290. commands.Put("users/4", null, new User { Name = "David Jones" }, new Dictionary<string, object> { { "@collection", "Users" } });
  291. }
  292. WaitForIndexing(store);
  293. using (var session = store.OpenSession())
  294. {
  295. var suggestions = session.Query<User, Users_ByName>()
  296. .SuggestUsing(f => f.ByField("Name", new[] { "johne", "davi" }).WithOptions(new SuggestionOptions
  297. {
  298. PageSize = 5,
  299. Distance = StringDistanceTypes.JaroWinkler,
  300. SortMode = SuggestionSortMode.Popularity,
  301. Accuracy = 0.4f
  302. }))
  303. .Execute();
  304. Assert.Equal("john", suggestions["Name"].Suggestions[0]);
  305. Assert.Equal("jones", suggestions["Name"].Suggestions[1]);
  306. Assert.Equal("johnson", suggestions["Name"].Suggestions[2]);
  307. Assert.Equal("david", suggestions["Name"].Suggestions[3]);
  308. Assert.Equal("jack", suggestions["Name"].Suggestions[4]);
  309. }
  310. }
  311. }
  312. }
  313. }