SqlParserWhereConditionTest.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package org.elasticsearch;
  2. import org.elasticsearch.action.search.SearchAction;
  3. import org.elasticsearch.action.search.SearchRequestBuilder;
  4. import org.elasticsearch.dsl.bean.ElasticSqlParseResult;
  5. import org.elasticsearch.dsl.parser.syntax.ElasticSql2DslParser;
  6. import org.elasticsearch.index.query.NestedQueryBuilder;
  7. import org.elasticsearch.index.query.QueryBuilder;
  8. import org.elasticsearch.index.query.QueryBuilders;
  9. import org.elasticsearch.search.aggregations.AbstractAggregationBuilder;
  10. import org.elasticsearch.search.aggregations.AggregationBuilders;
  11. import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
  12. import org.elasticsearch.util.ElasticMockClient;
  13. import org.junit.Assert;
  14. import org.junit.Test;
  15. public class SqlParserWhereConditionTest {
  16. @Test
  17. public void testParseEqExpr() {
  18. String sql = "select id,status from index.order t where t.status='SUCCESS'";
  19. ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
  20. ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
  21. QueryBuilder targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("status", "SUCCESS"));
  22. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  23. System.out.println(parseResult.toDsl());
  24. sql = "select id,status from index.order t where t.price='123.4'";
  25. parseResult = sql2DslParser.parse(sql);
  26. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("price", "123.4"));
  27. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  28. System.out.println(parseResult.toDsl());
  29. sql = "select id,status from index.order t where product.price='123.4'";
  30. parseResult = sql2DslParser.parse(sql);
  31. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("product.price", "123.4"));
  32. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  33. System.out.println(parseResult.toDsl());
  34. sql = "select id,status from index.order t where $product.price='123.4'";
  35. parseResult = sql2DslParser.parse(sql);
  36. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.nestedQuery("product", QueryBuilders.termQuery("product.price", "123.4")));
  37. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  38. System.out.println(parseResult.toDsl());
  39. sql = "select id,status from index.order t where t.$product.price='123.4'";
  40. parseResult = sql2DslParser.parse(sql);
  41. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.nestedQuery("product", QueryBuilders.termQuery("product.price", "123.4")));
  42. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  43. System.out.println(parseResult.toDsl());
  44. sql = "select id,status from index.order t where abc.t.$product.price='123.4'";
  45. parseResult = sql2DslParser.parse(sql);
  46. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.nestedQuery("abc.t.product", QueryBuilders.termQuery("abc.t.product.price", "123.4")));
  47. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  48. System.out.println(parseResult.toDsl());
  49. sql = "select id,status from index.order t where t.product.price='123.4'";
  50. parseResult = sql2DslParser.parse(sql);
  51. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("product.price", "123.4"));
  52. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  53. System.out.println(parseResult.toDsl());
  54. }
  55. @Test
  56. public void testParseGtExpr() {
  57. ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
  58. String sql = "select id,status from index.order t where t.price > 123.4";
  59. ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
  60. QueryBuilder targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("price").gt(123.4));
  61. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  62. System.out.println(parseResult.toDsl());
  63. sql = "select id,status from index.order t where product.price > 123.4";
  64. parseResult = sql2DslParser.parse(sql);
  65. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("product.price").gt(123.4));
  66. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  67. System.out.println(parseResult.toDsl());
  68. sql = "select id,status from index.order t where $product.price > 123.4";
  69. parseResult = sql2DslParser.parse(sql);
  70. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.nestedQuery("product", QueryBuilders.rangeQuery("product.price").gt(123.4)));
  71. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  72. System.out.println(parseResult.toDsl());
  73. }
  74. @Test
  75. public void testParseDateExpr() {
  76. ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
  77. String sql = "select id,status from index.order t where t.lastUpdateTime > '2017-01-25'";
  78. ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
  79. QueryBuilder targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("lastUpdateTime").gt("2017-01-25T00:00:00.000+0800"));
  80. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  81. System.out.println(parseResult.toDsl());
  82. sql = "select id,status from index.order t where t.lastUpdateTime > '2017-01-25 13:32'";
  83. parseResult = sql2DslParser.parse(sql);
  84. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("lastUpdateTime").gt("2017-01-25T13:32:00.000+0800"));
  85. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  86. System.out.println(parseResult.toDsl());
  87. sql = "select id,status from index.order t where t.lastUpdateTime > '2017-01-25 13:32:59'";
  88. parseResult = sql2DslParser.parse(sql);
  89. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("lastUpdateTime").gt("2017-01-25T13:32:59.000+0800"));
  90. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  91. System.out.println(parseResult.toDsl());
  92. sql = "select id,status from index.order t where t.lastUpdateTime > date('yyyy/MM/dd hh:mm:ss', '2017/01/25 13:32:59')";
  93. parseResult = sql2DslParser.parse(sql);
  94. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("lastUpdateTime").gt("2017-01-25T13:32:59.000+0800"));
  95. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  96. System.out.println(parseResult.toDsl());
  97. sql = "select id,status from index.order t where t.lastUpdateTime > date('yyyy/MM/dd hh-mm', '2017/01/25 13-32')";
  98. parseResult = sql2DslParser.parse(sql);
  99. targetFilter = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("lastUpdateTime").gt("2017-01-25T13:32:00.000+0800"));
  100. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  101. System.out.println(parseResult.toDsl());
  102. sql = "select id,status from index.order t where t.lastUpdateTime between date('yyyy/MM/dd hh-mm', '2017/01/25 13-32') and '2018-10-25'";
  103. parseResult = sql2DslParser.parse(sql);
  104. targetFilter = QueryBuilders.boolQuery().must(
  105. QueryBuilders.rangeQuery("lastUpdateTime")
  106. .gte("2017-01-25T13:32:00.000+0800")
  107. .lte("2018-10-25T00:00:00.000+0800")
  108. );
  109. Assert.assertEquals(parseResult.getWhereCondition().toString(), targetFilter.toString());
  110. System.out.println(parseResult.toDsl());
  111. }
  112. @Test
  113. public void test$Expr() {
  114. String sql = "select * from index where a.$b.c.$d.e > 2";
  115. ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
  116. ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
  117. System.out.println(parseResult.toDsl());
  118. }
  119. @Test
  120. public void testCreateSearchDsl() {
  121. SearchRequestBuilder searchReq = new SearchRequestBuilder(new ElasticMockClient(), SearchAction.INSTANCE);
  122. NestedQueryBuilder categoryNameTerm = QueryBuilders.nestedQuery("bookCategories", QueryBuilders.termQuery("bookCategories.categoryName", "ART"));
  123. NestedQueryBuilder bookAuthorNestedFilter = QueryBuilders.nestedQuery("bookCategories.books", QueryBuilders.termQuery("bookCategories.books.bookAuthor", "bibicx"));
  124. NestedQueryBuilder bookPublisherCodeNestedFilter = QueryBuilders.nestedQuery("bookCategories.books", QueryBuilders.termQuery("bookCategories.books.bookPublisher.publisherCode", "PUB_03"));
  125. NestedQueryBuilder bookProviderNameNestedFilter = QueryBuilders.nestedQuery("bookCategories.books.bookPublisher.bookProvider", QueryBuilders.termQuery("bookCategories.books.bookPublisher.bookProvider.providerName", "PVD_01"));
  126. QueryBuilder topFilter = QueryBuilders.boolQuery().must(categoryNameTerm).must(bookAuthorNestedFilter).must(bookPublisherCodeNestedFilter).must(bookProviderNameNestedFilter);
  127. searchReq.setQuery(QueryBuilders.boolQuery().filter(topFilter));
  128. }
  129. @Test
  130. public void testCreateAggDsl() {
  131. SearchRequestBuilder searchReq = new SearchRequestBuilder(new ElasticMockClient(), SearchAction.INSTANCE);
  132. searchReq.setSize(0);
  133. //NestedQueryBuilder categoryNameTerm = QueryBuilders.nestedQuery("bookCategories", QueryBuilders.termQuery("bookCategories.categoryName", "ART"));
  134. TermsBuilder categoryNameAgg = AggregationBuilders.terms("agg_bookCategories.categoryName").field("bookCategories.categoryName");
  135. AbstractAggregationBuilder topAgg = AggregationBuilders.nested("nested_bookCategories.categoryName").path("bookCategories").subAggregation(categoryNameAgg);
  136. AbstractAggregationBuilder rtnAgg = AggregationBuilders.reverseNested("rtn_root").subAggregation(AggregationBuilders.terms("agg_name").field("name"));
  137. categoryNameAgg.subAggregation(rtnAgg);
  138. //NestedQueryBuilder bookAuthorNestedFilter = QueryBuilders.nestedQuery("bookCategories.books", QueryBuilders.termsFilter("bookCategories.books.bookAuthor", "bibicx"));
  139. //TermsBuilder bookAuthorAgg = AggregationBuilders.terms("agg_bookCategories.books.bookAuthor").field("bookCategories.books.bookAuthor");
  140. //AbstractAggregationBuilder secNestedAgg = AggregationBuilders.nested("nested_bookCategories.books.bookAuthor").path("bookCategories.books").subAggregation(bookAuthorAgg);
  141. //categoryNameAgg.subAggregation(secNestedAgg);
  142. //NestedQueryBuilder bookPublisherCodeNestedFilter = QueryBuilders.nestedQuery("bookCategories.books", QueryBuilders.termsFilter("bookCategories.books.bookPublisher.publisherCode", "PUB_03"));
  143. //NestedQueryBuilder bookProviderNameNestedFilter = QueryBuilders.nestedQuery("bookCategories.books.bookPublisher.bookProvider", QueryBuilders.termsFilter("bookCategories.books.bookPublisher.bookProvider.providerName", "PVD_01"));
  144. //QueryBuilder topFilter = QueryBuilders.boolQuery().must(categoryNameTerm).must(bookAuthorNestedFilter).must(bookPublisherCodeNestedFilter).must(bookProviderNameNestedFilter);
  145. searchReq.addAggregation(topAgg);
  146. }
  147. @Test
  148. public void testNotExpr() {
  149. String sql = "select * from index.order where not(c = 0)";
  150. ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
  151. ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);
  152. QueryBuilder f1 = QueryBuilders.boolQuery().must(
  153. QueryBuilders.boolQuery().mustNot(
  154. QueryBuilders.boolQuery().must(
  155. QueryBuilders.termQuery("c", 0)
  156. )
  157. )
  158. );
  159. QueryBuilder f2 = parseResult.getWhereCondition();
  160. Assert.assertEquals(f1.toString(), f2.toString());
  161. sql = "select * from index.order where a > 0 and not(c = 0)";
  162. sql2DslParser = new ElasticSql2DslParser();
  163. parseResult = sql2DslParser.parse(sql);
  164. f1 = QueryBuilders.boolQuery().must(
  165. QueryBuilders.rangeQuery("a").gt(0)).must(
  166. QueryBuilders.boolQuery().mustNot(
  167. QueryBuilders.boolQuery().must(
  168. QueryBuilders.termQuery("c", 0)
  169. )
  170. )
  171. );
  172. f2 = parseResult.getWhereCondition();
  173. Assert.assertEquals(f1.toString(), f2.toString());
  174. sql = "select * from index.order where a > 0 and not(c = 0 or b = 1)";
  175. sql2DslParser = new ElasticSql2DslParser();
  176. parseResult = sql2DslParser.parse(sql);
  177. f1 = QueryBuilders.boolQuery().must(
  178. QueryBuilders.rangeQuery("a").gt(0)).must(
  179. QueryBuilders.boolQuery().mustNot(
  180. QueryBuilders.boolQuery().should(
  181. QueryBuilders.termQuery("c", 0)).should(
  182. QueryBuilders.termQuery("b", 1)
  183. )
  184. )
  185. );
  186. f2 = parseResult.getWhereCondition();
  187. Assert.assertEquals(f1.toString(), f2.toString());
  188. sql = "select * from index.order where a > 0 and not(c = 0 or not(b = 1))";
  189. sql2DslParser = new ElasticSql2DslParser();
  190. parseResult = sql2DslParser.parse(sql);
  191. f1 = QueryBuilders.boolQuery().must(
  192. QueryBuilders.rangeQuery("a").gt(0)).must(
  193. QueryBuilders.boolQuery().mustNot(
  194. QueryBuilders.boolQuery().should(
  195. QueryBuilders.termQuery("c", 0)).should(
  196. QueryBuilders.boolQuery().mustNot(
  197. QueryBuilders.boolQuery().must(
  198. QueryBuilders.termQuery("b", 1)
  199. )
  200. )
  201. )
  202. )
  203. );
  204. f2 = parseResult.getWhereCondition();
  205. Assert.assertEquals(f1.toString(), f2.toString());
  206. }
  207. }