|
| 1 | +package com.dtstack.flink.sql.side.elasticsearch6; |
| 2 | + |
| 3 | +import org.apache.flink.api.java.typeutils.RowTypeInfo; |
| 4 | + |
| 5 | +import com.dtstack.flink.sql.side.*; |
| 6 | +import com.dtstack.flink.sql.side.elasticsearch6.table.Elasticsearch6SideTableInfo; |
| 7 | +import com.dtstack.flink.sql.util.ParseUtils; |
| 8 | +import com.google.common.collect.Lists; |
| 9 | +import org.apache.calcite.sql.SqlNode; |
| 10 | +import org.apache.commons.collections.CollectionUtils; |
| 11 | +import org.apache.commons.lang3.StringUtils; |
| 12 | +import org.elasticsearch.search.builder.SearchSourceBuilder; |
| 13 | + |
| 14 | +import java.util.Arrays; |
| 15 | +import java.util.List; |
| 16 | +import java.util.stream.Collectors; |
| 17 | + |
| 18 | +/** |
| 19 | + * @author yinxi |
| 20 | + * @date 2020/1/13 - 1:01 |
| 21 | + */ |
| 22 | +public class Elasticsearch6AllSideInfo extends SideInfo { |
| 23 | + |
| 24 | + public Elasticsearch6AllSideInfo(RowTypeInfo rowTypeInfo, JoinInfo joinInfo, List<FieldInfo> outFieldInfoList, SideTableInfo sideTableInfo) { |
| 25 | + super(rowTypeInfo, joinInfo, outFieldInfoList, sideTableInfo); |
| 26 | + } |
| 27 | + |
| 28 | + @Override |
| 29 | + public void buildEqualInfo(JoinInfo joinInfo, SideTableInfo sideTableInfo) { |
| 30 | + Elasticsearch6SideTableInfo es6SideTableInfo = (Elasticsearch6SideTableInfo) sideTableInfo; |
| 31 | + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); |
| 32 | + |
| 33 | + |
| 34 | + sqlCondition = getSelectFromStatement(getEstype(es6SideTableInfo), Arrays.asList(sideSelectFields.split(",")), sideTableInfo.getPredicateInfoes()); |
| 35 | + System.out.println("-------- all side sql query-------\n" + sqlCondition); |
| 36 | + } |
| 37 | + |
| 38 | + //基于rdb开发side,但是那些between,in,not in之类的不知道怎么处理 |
| 39 | + |
| 40 | + public String getAdditionalWhereClause() { |
| 41 | + return ""; |
| 42 | + } |
| 43 | + |
| 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 | + } |
| 51 | + |
| 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; |
| 57 | + } |
| 58 | + |
| 59 | + @Override |
| 60 | + public void parseSelectFields(JoinInfo joinInfo) { |
| 61 | + String sideTableName = joinInfo.getSideTableName(); |
| 62 | + String nonSideTableName = joinInfo.getNonSideTable(); |
| 63 | + List<String> fields = Lists.newArrayList(); |
| 64 | + |
| 65 | + int sideIndex = 0; |
| 66 | + for (int i = 0; i < outFieldInfoList.size(); i++) { |
| 67 | + FieldInfo fieldInfo = outFieldInfoList.get(i); |
| 68 | + if (fieldInfo.getTable().equalsIgnoreCase(sideTableName)) { |
| 69 | + fields.add(fieldInfo.getFieldName()); |
| 70 | + sideFieldIndex.put(i, sideIndex); |
| 71 | + sideFieldNameIndex.put(i, fieldInfo.getFieldName()); |
| 72 | + sideIndex++; |
| 73 | + } else if (fieldInfo.getTable().equalsIgnoreCase(nonSideTableName)) { |
| 74 | + int nonSideIndex = rowTypeInfo.getFieldIndex(fieldInfo.getFieldName()); |
| 75 | + inFieldIndex.put(i, nonSideIndex); |
| 76 | + } else { |
| 77 | + throw new RuntimeException("unknown table " + fieldInfo.getTable()); |
| 78 | + } |
| 79 | + } |
| 80 | + |
| 81 | + if (fields.size() == 0) { |
| 82 | + throw new RuntimeException("select non field from table " + sideTableName); |
| 83 | + } |
| 84 | + |
| 85 | + //add join on condition field to select fields |
| 86 | + SqlNode conditionNode = joinInfo.getCondition(); |
| 87 | + |
| 88 | + List<SqlNode> sqlNodeList = Lists.newArrayList(); |
| 89 | + |
| 90 | + ParseUtils.parseAnd(conditionNode, sqlNodeList); |
| 91 | + |
| 92 | + for (SqlNode sqlNode : sqlNodeList) { |
| 93 | + dealOneEqualCon(sqlNode, sideTableName); |
| 94 | + } |
| 95 | + |
| 96 | + if (CollectionUtils.isEmpty(equalFieldList)) { |
| 97 | + throw new RuntimeException("no join condition found after table " + joinInfo.getLeftTableName()); |
| 98 | + } |
| 99 | + |
| 100 | + for (String equalField : equalFieldList) { |
| 101 | + if (fields.contains(equalField)) { |
| 102 | + continue; |
| 103 | + } |
| 104 | + |
| 105 | + fields.add(equalField); |
| 106 | + } |
| 107 | + |
| 108 | + sideSelectFields = String.join(",", fields); |
| 109 | + } |
| 110 | + |
| 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 | +} |
0 commit comments