PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/query/src/test/java/org/infinispan/query/queries/phrases/QueryPhrasesTest.java

https://gitlab.com/Guy1394/infinispan
Java | 561 lines | 404 code | 148 blank | 9 comment | 0 complexity | 11bc9e8a6478a2140ca80420046d3f60 MD5 | raw file
  1. package org.infinispan.query.queries.phrases;
  2. import org.junit.Assert;
  3. import org.apache.lucene.queryparser.classic.ParseException;
  4. import org.apache.lucene.search.Query;
  5. import org.hibernate.search.exception.SearchException;
  6. import org.infinispan.configuration.cache.ConfigurationBuilder;
  7. import org.infinispan.configuration.cache.Index;
  8. import org.infinispan.manager.EmbeddedCacheManager;
  9. import org.infinispan.query.CacheQuery;
  10. import org.infinispan.query.Search;
  11. import org.infinispan.query.queries.NumericType;
  12. import org.infinispan.query.test.AnotherGrassEater;
  13. import org.infinispan.query.test.Person;
  14. import org.infinispan.test.SingleCacheManagerTest;
  15. import org.infinispan.test.fwk.TestCacheManagerFactory;
  16. import org.testng.AssertJUnit;
  17. import org.testng.annotations.Test;
  18. import java.util.List;
  19. import static org.infinispan.query.helper.TestQueryHelperFactory.createQueryParser;
  20. /**
  21. * Tests and verifies that the querying using keywords, phrases, etc works properly.
  22. *
  23. * @author Anna Manukyan
  24. */
  25. @Test(groups = {"functional", "smoke"}, testName = "query.queries.phrases.QueryPhrasesTest")
  26. public class QueryPhrasesTest extends SingleCacheManagerTest {
  27. private Person person1;
  28. private Person person2;
  29. private Person person3;
  30. private Person person4;
  31. protected String key1 = "test1";
  32. protected String key2 = "test2";
  33. protected String key3 = "test3";
  34. private NumericType type1;
  35. private NumericType type2;
  36. private NumericType type3;
  37. public QueryPhrasesTest() {
  38. cleanup = CleanupPhase.AFTER_METHOD;
  39. }
  40. @Override
  41. protected EmbeddedCacheManager createCacheManager() throws Exception {
  42. ConfigurationBuilder cfg = getDefaultStandaloneCacheConfig(true);
  43. cfg
  44. .indexing().index(Index.ALL)
  45. .addIndexedEntity(NumericType.class)
  46. .addIndexedEntity(Person.class)
  47. .addIndexedEntity(AnotherGrassEater.class)
  48. .addProperty("default.directory_provider", "ram")
  49. .addProperty("lucene_version", "LUCENE_CURRENT");
  50. return TestCacheManagerFactory.createCacheManager(cfg);
  51. }
  52. public void testBooleanQueriesMustNot() throws ParseException {
  53. loadTestingData();
  54. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().bool()
  55. .must(createQueryParser("name").parse("Goat")).not().createQuery();
  56. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  57. List<Object> found = cacheQuery.list();
  58. Assert.assertEquals(1, found.size());
  59. assert found.contains(person1);
  60. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().bool()
  61. .must(createQueryParser("name").parse("Goat")).createQuery();
  62. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  63. found = cacheQuery.list();
  64. Assert.assertEquals(2, found.size());
  65. assert found.contains(person2);
  66. assert found.contains(person3);
  67. }
  68. public void testBooleanQueriesOnMultipleTables() throws ParseException {
  69. loadTestingData();
  70. AnotherGrassEater anotherGrassEater = new AnotherGrassEater("Another grass-eater", "Eats grass");
  71. cache.put("key4", anotherGrassEater);
  72. Query subQuery = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().range()
  73. .onField("age").below(20).createQuery();
  74. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(AnotherGrassEater.class).get().bool()
  75. .should(createQueryParser("name").parse("grass")).should(subQuery).createQuery();
  76. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  77. List<Object> found = cacheQuery.list();
  78. Assert.assertEquals(2, found.size());
  79. assert found.contains(person1);
  80. assert found.contains(anotherGrassEater);
  81. }
  82. public void testBooleanQueriesShould() throws ParseException {
  83. loadTestingData();
  84. Query subQuery = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().range()
  85. .onField("age").below(20).createQuery();
  86. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().bool()
  87. .should(createQueryParser("name").parse("Goat")).should(subQuery).createQuery();
  88. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  89. List<Object> found = cacheQuery.list();
  90. Assert.assertEquals(3, found.size());
  91. assert found.contains(person1);
  92. assert found.contains(person2);
  93. assert found.contains(person3);
  94. subQuery = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().range()
  95. .onField("age").below(20).excludeLimit().createQuery();
  96. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().bool()
  97. .should(createQueryParser("name").parse("Goat")).should(subQuery).createQuery();
  98. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  99. found = cacheQuery.list();
  100. Assert.assertEquals(2, found.size());
  101. assert found.contains(person2);
  102. assert found.contains(person3);
  103. }
  104. public void testBooleanQueriesShouldNot() throws ParseException {
  105. loadTestingData();
  106. Query subQuery1 = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get()
  107. .keyword().onField("name").boostedTo(0.5f)
  108. .matching("Goat").createQuery();
  109. Query subQuery2 = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get()
  110. .range().onField("age").boostedTo(2f).below(20).createQuery();
  111. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().bool()
  112. .should(subQuery1).should(subQuery2).createQuery();
  113. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  114. List<Object> found = cacheQuery.list();
  115. Assert.assertEquals(3, found.size());
  116. assert found.get(0).equals(person1);
  117. assert found.get(1).equals(person2);
  118. assert found.get(2).equals(person3);
  119. subQuery1 = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get()
  120. .keyword().onField("name").boostedTo(3.5f)
  121. .matching("Goat").createQuery();
  122. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().bool()
  123. .should(subQuery1).should(subQuery2).createQuery();
  124. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  125. found = cacheQuery.list();
  126. Assert.assertEquals(3, found.size());
  127. assert found.get(0).equals(person2);
  128. assert found.get(1).equals(person3);
  129. assert found.get(2).equals(person1);
  130. }
  131. public void testFuzzyOnFieldsAndField() {
  132. loadTestingData();
  133. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().fuzzy().
  134. onField("name").matching("Goat").createQuery();
  135. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  136. List<Object> found = cacheQuery.list();
  137. Assert.assertEquals(2, found.size());
  138. assert found.contains(person2);
  139. assert found.contains(person3);
  140. person4 = new Person();
  141. person4.setName("Test");
  142. person4.setBlurb("Test goat");
  143. cache.put("testKey", person4);
  144. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().fuzzy().
  145. onField("name").andField("blurb").matching("goat").createQuery();
  146. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  147. found = cacheQuery.list();
  148. Assert.assertEquals(3, found.size());
  149. assert found.contains(person2);
  150. assert found.contains(person3);
  151. assert found.contains(person4);
  152. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().fuzzy().
  153. onFields("name", "blurb").matching("goat").createQuery();
  154. List<Object> foundOnFields = Search.getSearchManager(cache).getQuery(query).list();
  155. AssertJUnit.assertEquals(3, found.size());
  156. assert found.contains(person2);
  157. assert found.contains(person3);
  158. assert found.contains(person4);
  159. }
  160. public void testFuzzyWithThresholdWithPrefixLength() {
  161. person1 = new Person("yyJohn", "Eat anything", 10);
  162. person2 = new Person("yyJonn", "Eat anything", 10);
  163. cache.put(key1, person1);
  164. cache.put(key2, person2);
  165. //Ignore "yy" at the beginning (prefix==2), the difference between the remaining parts of two terms
  166. //must be no more than edit distance -> return only 1 person
  167. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword()
  168. .fuzzy().withEditDistanceUpTo(1).withPrefixLength(2).onField("name").matching("yyJohny").createQuery();
  169. List<Object> found = Search.getSearchManager(cache).getQuery(query).list();
  170. AssertJUnit.assertEquals(1, found.size());
  171. AssertJUnit.assertTrue(found.contains(person1));
  172. //return all as edit distance excluding the prefix fit all documents
  173. Query queryReturnAll = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword()
  174. .fuzzy().withEditDistanceUpTo(2).withPrefixLength(2).onField("name").matching("yyJohn").createQuery();
  175. List<Object> foundWithLowerThreshold = Search.getSearchManager(cache).getQuery(queryReturnAll).list();
  176. AssertJUnit.assertEquals(2, foundWithLowerThreshold.size());
  177. AssertJUnit.assertTrue(foundWithLowerThreshold.contains(person1));
  178. AssertJUnit.assertTrue(foundWithLowerThreshold.contains(person2));
  179. }
  180. public void testQueryingRangeWithAnd() {
  181. NumericType type1 = new NumericType(10, 20);
  182. NumericType type2 = new NumericType(20, 10);
  183. NumericType type3 = new NumericType(10, 10);
  184. cache.put(key1, type1);
  185. cache.put(key2, type2);
  186. cache.put(key3, type3);
  187. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class)
  188. .get().range().onField("num1").andField("num2").below(20).excludeLimit().createQuery();
  189. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  190. List<Object> found = cacheQuery.list();
  191. AssertJUnit.assertEquals(3, found.size()); //<------ All entries should be here, because andField is executed as SHOULD;
  192. assert found.contains(type1);
  193. assert found.contains(type2);
  194. assert found.contains(type3);
  195. NumericType type4 = new NumericType(11, 10);
  196. cache.put("newKey", type4);
  197. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  198. found = cacheQuery.list();
  199. Assert.assertEquals(4, found.size());
  200. assert found.contains(type3);
  201. assert found.contains(type2);
  202. assert found.contains(type1);
  203. assert found.contains(type4);
  204. //@TODO write here another case with not-matching entries
  205. }
  206. @Test(expectedExceptions = SearchException.class)
  207. public void testWildcardWithWrongName() {
  208. loadTestingData();
  209. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().wildcard()
  210. .onField("wrongname").matching("Goat").createQuery();
  211. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  212. List<Object> found = cacheQuery.list();
  213. Assert.assertEquals(2, found.size());
  214. }
  215. public void testWildcard() {
  216. loadNumericTypes();
  217. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().keyword().wildcard()
  218. .onField("name").matching("*wildcard*").createQuery();
  219. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  220. List<Object> found = cacheQuery.list();
  221. Assert.assertEquals(3, found.size());
  222. assert found.contains(type1);
  223. assert found.contains(type2);
  224. assert found.contains(type3);
  225. query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().keyword().wildcard()
  226. .onField("name").matching("nothing*").createQuery();
  227. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  228. found = cacheQuery.list();
  229. Assert.assertEquals(0, found.size());
  230. NumericType type4 = new NumericType(35, 40);
  231. type4.setName("nothing special.");
  232. cache.put("otherKey", type4);
  233. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  234. found = cacheQuery.list();
  235. Assert.assertEquals(1, found.size());
  236. assert found.contains(type4);
  237. query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().keyword().wildcard()
  238. .onField("name").matching("*nothing*").createQuery();
  239. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  240. found = cacheQuery.list();
  241. Assert.assertEquals(2, found.size());
  242. assert found.contains(type2);
  243. assert found.contains(type4);
  244. }
  245. public void testKeyword() {
  246. loadTestingData();
  247. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().onField("name")
  248. .andField("blurb").matching("Eats").createQuery();
  249. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  250. List<Object> found = cacheQuery.list();
  251. Assert.assertEquals(2, found.size());
  252. person4 = new Person();
  253. person4.setName("Some name with Eats");
  254. person4.setBlurb("Description without keyword.");
  255. cache.put("someKey", person4);
  256. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  257. found = cacheQuery.list();
  258. Assert.assertEquals(3, found.size());
  259. assert found.contains(person2);
  260. assert found.contains(person3);
  261. assert found.contains(person4);
  262. }
  263. public void testPhraseSentence() {
  264. loadTestingData();
  265. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().phrase()
  266. .onField("blurb").sentence("Eats grass").createQuery();
  267. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  268. List<Object> found = cacheQuery.list();
  269. Assert.assertEquals(1, found.size());
  270. assert found.contains(person2);
  271. person4 = new Person();
  272. person4.setName("Another goat");
  273. person4.setBlurb("Eats grass and drinks water.");
  274. cache.put("anotherKey", person4);
  275. found = cacheQuery.list();
  276. Assert.assertEquals(2, found.size());
  277. assert found.contains(person2);
  278. assert found.contains(person4);
  279. }
  280. public void testPhraseSentenceForNonAnalyzedEntries() {
  281. loadNumericTypes();
  282. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().phrase()
  283. .onField("name").sentence("Some string").createQuery();
  284. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  285. List<Object> found = cacheQuery.list();
  286. Assert.assertEquals(0, found.size());
  287. NumericType type4 = new NumericType(45,50);
  288. type4.setName("Some string");
  289. cache.put("otherKey", type4);
  290. found = cacheQuery.list();
  291. Assert.assertEquals(1, found.size());
  292. assert found.contains(type4);
  293. }
  294. public void testPhraseWithSlop() {
  295. loadTestingData();
  296. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().phrase().withSlop(3)
  297. .onField("blurb").sentence("Eats grass").createQuery();
  298. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  299. List<Object> found = cacheQuery.list();
  300. Assert.assertEquals(1, found.size());
  301. assert found.contains(person2);
  302. person4 = new Person();
  303. person4.setName("other goat");
  304. person4.setBlurb("Eats green grass.");
  305. cache.put("otherKey", person4);
  306. found = cacheQuery.list();
  307. Assert.assertEquals(2, found.size());
  308. assert found.contains(person2);
  309. assert found.contains(person4);
  310. person4.setBlurb("Eats green tasty grass.");
  311. cache.put("otherKey", person4);
  312. found = cacheQuery.list();
  313. Assert.assertEquals(2, found.size());
  314. assert found.contains(person2);
  315. assert found.contains(person4);
  316. person4.setBlurb("Eats green, tasty, juicy grass.");
  317. cache.put("otherKey", person4);
  318. found = cacheQuery.list();
  319. Assert.assertEquals(2, found.size());
  320. assert found.contains(person2);
  321. assert found.contains(person4);
  322. person4.setBlurb("Eats green, tasty, juicy, fresh grass.");
  323. cache.put("otherKey", person4);
  324. found = cacheQuery.list();
  325. Assert.assertEquals(1, found.size());
  326. assert found.contains(person2);
  327. }
  328. public void testPhraseWithSlopWithoutAnalyzer() {
  329. loadNumericTypes();
  330. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().phrase().withSlop(1)
  331. .onField("name").sentence("Some string").createQuery();
  332. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  333. List<Object> found = cacheQuery.list();
  334. Assert.assertEquals(0, found.size());
  335. NumericType type = new NumericType(10, 60);
  336. type.setName("Some string");
  337. cache.put("otherKey", type);
  338. found = cacheQuery.list();
  339. Assert.assertEquals(1, found.size());
  340. assert found.contains(type);
  341. NumericType type1 = new NumericType(20, 60);
  342. type1.setName("Some other string");
  343. cache.put("otherKey1", type1);
  344. found = cacheQuery.list();
  345. Assert.assertEquals(1, found.size());
  346. assert found.contains(type);
  347. }
  348. public void testAllExcept() {
  349. loadTestingData();
  350. Query subQuery = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword()
  351. .onField("name").matching("Goat").createQuery();
  352. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().all().except().createQuery();
  353. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  354. List<Object> found = cacheQuery.list();
  355. Assert.assertEquals(3, found.size());
  356. assert found.contains(person2);
  357. assert found.contains(person1);
  358. assert found.contains(person3);
  359. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().all().except(query).createQuery();
  360. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  361. found = cacheQuery.list();
  362. Assert.assertEquals(0, found.size());
  363. query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().all().except(subQuery).createQuery();
  364. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  365. found = cacheQuery.list();
  366. Assert.assertEquals(1, found.size());
  367. assert found.contains(person1);
  368. }
  369. public void testAllExceptWithoutAnalyzer() {
  370. loadNumericTypes();
  371. Query subQuery = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().keyword()
  372. .wildcard().onField("name").matching("*string*").createQuery();
  373. Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().all().except().createQuery();
  374. CacheQuery cacheQuery = Search.getSearchManager(cache).getQuery(query);
  375. List<Object> found = cacheQuery.list();
  376. Assert.assertEquals(3, found.size());
  377. assert found.contains(type1);
  378. assert found.contains(type2);
  379. assert found.contains(type3);
  380. query = Search.getSearchManager(cache).buildQueryBuilderForClass(NumericType.class).get().all().except(subQuery).createQuery();
  381. cacheQuery = Search.getSearchManager(cache).getQuery(query);
  382. found = cacheQuery.list();
  383. Assert.assertEquals(0, found.size());
  384. }
  385. protected void loadTestingData() {
  386. person1 = new Person();
  387. person1.setName("Navin Surtani");
  388. person1.setBlurb("Likes playing WoW");
  389. person1.setAge(20);
  390. person2 = new Person();
  391. person2.setName("Big Goat");
  392. person2.setBlurb("Eats grass");
  393. person2.setAge(30);
  394. person3 = new Person();
  395. person3.setName("Mini Goat");
  396. person3.setBlurb("Eats cheese");
  397. person3.setAge(25);
  398. cache.put(key1, person1);
  399. cache.put(key2, person2);
  400. cache.put(key3, person3);
  401. }
  402. private void loadNumericTypes() {
  403. type1 = new NumericType(10, 20);
  404. type1.setName("Some string for testing wildcards.");
  405. type2 = new NumericType(15, 25);
  406. type2.setName("This string has nothing to do with wildcards.");
  407. type3 = new NumericType(20, 30);
  408. type3.setName("Some other string for testing wildcards.");
  409. cache.put(key1, type1);
  410. cache.put(key2, type2);
  411. cache.put(key3, type3);
  412. }
  413. }