|
| 1 | +/** |
| 2 | + * Licensed to the Apache Software Foundation (ASF) under one |
| 3 | + * or more contributor license agreements. See the NOTICE file |
| 4 | + * distributed with this work for additional information |
| 5 | + * regarding copyright ownership. The ASF licenses this file |
| 6 | + * to you under the Apache License, Version 2.0 (the |
| 7 | + * "License"); you may not use this file except in compliance |
| 8 | + * with the License. You may obtain a copy of the License at |
| 9 | + * |
| 10 | + * http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | + * |
| 12 | + * Unless required by applicable law or agreed to in writing, software |
| 13 | + * distributed under the License is distributed on an "AS IS" BASIS, |
| 14 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 15 | + * See the License for the specific language governing permissions and |
| 16 | + * limitations under the License. |
| 17 | + */ |
| 18 | + |
1 | 19 | package com.dtstack.flink.sql.side.elasticsearch6; |
2 | 20 |
|
3 | 21 | import org.apache.flink.api.java.typeutils.RowTypeInfo; |
4 | 22 |
|
5 | 23 | import com.dtstack.flink.sql.side.*; |
6 | | -import com.dtstack.flink.sql.side.elasticsearch6.table.Elasticsearch6SideTableInfo; |
7 | 24 | import com.dtstack.flink.sql.util.ParseUtils; |
8 | 25 | import com.google.common.collect.Lists; |
9 | 26 | import org.apache.calcite.sql.SqlNode; |
10 | 27 | import org.apache.commons.collections.CollectionUtils; |
11 | | -import org.apache.commons.lang3.StringUtils; |
| 28 | +import org.elasticsearch.index.query.BoolQueryBuilder; |
| 29 | +import org.elasticsearch.index.query.QueryBuilders; |
12 | 30 | import org.elasticsearch.search.builder.SearchSourceBuilder; |
13 | 31 |
|
14 | | -import java.util.Arrays; |
15 | 32 | import java.util.List; |
16 | | -import java.util.stream.Collectors; |
17 | 33 |
|
18 | 34 | /** |
19 | 35 | * @author yinxi |
20 | 36 | * @date 2020/1/13 - 1:01 |
21 | 37 | */ |
22 | 38 | public class Elasticsearch6AllSideInfo extends SideInfo { |
23 | 39 |
|
| 40 | + public static SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); |
| 41 | + |
24 | 42 | public Elasticsearch6AllSideInfo(RowTypeInfo rowTypeInfo, JoinInfo joinInfo, List<FieldInfo> outFieldInfoList, SideTableInfo sideTableInfo) { |
25 | 43 | super(rowTypeInfo, joinInfo, outFieldInfoList, sideTableInfo); |
26 | 44 | } |
27 | 45 |
|
28 | 46 | @Override |
29 | 47 | public void buildEqualInfo(JoinInfo joinInfo, SideTableInfo sideTableInfo) { |
30 | | - Elasticsearch6SideTableInfo es6SideTableInfo = (Elasticsearch6SideTableInfo) sideTableInfo; |
31 | | - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); |
32 | 48 |
|
| 49 | + getSelectFromStatement(sideTableInfo.getPredicateInfoes()); |
33 | 50 |
|
34 | | - sqlCondition = getSelectFromStatement(getEstype(es6SideTableInfo), Arrays.asList(sideSelectFields.split(",")), sideTableInfo.getPredicateInfoes()); |
35 | | - System.out.println("-------- all side sql query-------\n" + sqlCondition); |
36 | 51 | } |
37 | 52 |
|
38 | | - //基于rdb开发side,但是那些between,in,not in之类的不知道怎么处理 |
| 53 | + private void getSelectFromStatement(List<PredicateInfo> predicateInfoes) { |
39 | 54 |
|
40 | | - public String getAdditionalWhereClause() { |
41 | | - return ""; |
42 | | - } |
| 55 | + if (predicateInfoes.size() != 0) { |
| 56 | + BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); |
| 57 | + for (PredicateInfo info : sideTableInfo.getPredicateInfoes()) { |
| 58 | + boolQueryBuilder = buildFilterCondition(boolQueryBuilder, info); |
| 59 | + } |
| 60 | + |
| 61 | + searchSourceBuilder.query(boolQueryBuilder); |
| 62 | + } |
43 | 63 |
|
44 | | - private String getSelectFromStatement(String tableName, List<String> selectFields, List<PredicateInfo> predicateInfoes) { |
45 | | - String fromClause = selectFields.stream().map(this::quoteIdentifier).collect(Collectors.joining(", ")); |
46 | | - String predicateClause = predicateInfoes.stream().map(this::buildFilterCondition).collect(Collectors.joining(" AND ")); |
47 | | - String whereClause = buildWhereClause(predicateClause); |
48 | | - String sql = "SELECT " + fromClause + " FROM " + tableName + whereClause; |
49 | | - return sql; |
50 | 64 | } |
51 | 65 |
|
52 | | - private String buildWhereClause(String predicateClause) { |
53 | | - String additionalWhereClause = getAdditionalWhereClause(); |
54 | | - String whereClause = (!StringUtils.isEmpty(predicateClause) || !StringUtils.isEmpty(additionalWhereClause) ? " WHERE " + predicateClause : ""); |
55 | | - whereClause += (StringUtils.isEmpty(predicateClause)) ? additionalWhereClause.replaceFirst("AND", "") : additionalWhereClause; |
56 | | - return whereClause; |
| 66 | + public BoolQueryBuilder buildFilterCondition(BoolQueryBuilder boolQueryBuilder, PredicateInfo info){ |
| 67 | + switch (info.getOperatorKind()) { |
| 68 | + case "GREATER_THAN_OR_EQUAL": |
| 69 | + return boolQueryBuilder.must(QueryBuilders.rangeQuery(info.getFieldName()).gte(info.getCondition())); |
| 70 | + case "GREATER_THAN": |
| 71 | + return boolQueryBuilder.must(QueryBuilders.rangeQuery(info.getFieldName()).gt(info.getCondition())); |
| 72 | + case "LESS_THAN_OR_EQUAL": |
| 73 | + return boolQueryBuilder.must(QueryBuilders.rangeQuery(info.getFieldName()).lte(info.getCondition())); |
| 74 | + case "LESS_THAN": |
| 75 | + return boolQueryBuilder.must(QueryBuilders.rangeQuery(info.getFieldName()).lt(info.getCondition())); |
| 76 | + case "EQUALS": |
| 77 | + return boolQueryBuilder.must(QueryBuilders.termQuery(info.getFieldName(), info.getCondition())); |
| 78 | + default: |
| 79 | + try { |
| 80 | + throw new Exception("Predicate does not match!"); |
| 81 | + } catch (Exception e) { |
| 82 | + e.printStackTrace(); |
| 83 | + } |
| 84 | + } |
| 85 | + |
| 86 | + return boolQueryBuilder; |
57 | 87 | } |
58 | 88 |
|
59 | 89 | @Override |
@@ -108,28 +138,4 @@ public void parseSelectFields(JoinInfo joinInfo) { |
108 | 138 | sideSelectFields = String.join(",", fields); |
109 | 139 | } |
110 | 140 |
|
111 | | - public String buildFilterCondition(PredicateInfo info) { |
112 | | - switch (info.getOperatorKind()) { |
113 | | - case "IN": |
114 | | - case "NOT_IN": |
115 | | - return quoteIdentifier(info.getFieldName()) + " " + info.getOperatorName() + " ( " + info.getCondition() + " )"; |
116 | | - case "NOT_EQUALS": |
117 | | - return quoteIdentifier(info.getFieldName()) + " != " + info.getCondition(); |
118 | | - case "BETWEEN": |
119 | | - return quoteIdentifier(info.getFieldName()) + " BETWEEN " + info.getCondition(); |
120 | | - case "IS_NOT_NULL": |
121 | | - case "IS_NULL": |
122 | | - return quoteIdentifier(info.getFieldName()) + " " + info.getOperatorName(); |
123 | | - default: |
124 | | - return quoteIdentifier(info.getFieldName()) + " " + info.getOperatorName() + " " + info.getCondition(); |
125 | | - } |
126 | | - } |
127 | | - |
128 | | - public String getEstype(Elasticsearch6SideTableInfo es6SdideTableInfo) { |
129 | | - return es6SdideTableInfo.getEsType(); |
130 | | - } |
131 | | - |
132 | | - public String quoteIdentifier(String identifier) { |
133 | | - return " " + identifier + " "; |
134 | | - } |
135 | 141 | } |
0 commit comments