|
21 | 21 | package com.dtstack.flink.sql.side; |
22 | 22 |
|
23 | 23 | import com.dtstack.flink.sql.side.cache.AbstractSideCache; |
24 | | -import org.apache.calcite.sql.JoinType; |
25 | | -import org.apache.calcite.sql.SqlBasicCall; |
26 | | -import org.apache.calcite.sql.SqlIdentifier; |
27 | | -import org.apache.calcite.sql.SqlKind; |
28 | | -import org.apache.calcite.sql.SqlNode; |
| 24 | +import com.google.common.base.Preconditions; |
| 25 | +import com.google.common.collect.Sets; |
| 26 | +import org.apache.calcite.sql.*; |
29 | 27 | import org.apache.flink.api.java.typeutils.RowTypeInfo; |
30 | 28 | import com.google.common.collect.Lists; |
31 | 29 | import com.google.common.collect.Maps; |
32 | 30 |
|
33 | 31 | import java.io.Serializable; |
34 | 32 | import java.util.List; |
35 | 33 | import java.util.Map; |
| 34 | +import java.util.Set; |
36 | 35 |
|
37 | 36 | /** |
38 | 37 | * Reason: |
@@ -126,51 +125,80 @@ public void dealOneEqualCon(SqlNode sqlNode, String sideTableName) { |
126 | 125 | throw new RuntimeException("not compare operator."); |
127 | 126 | } |
128 | 127 |
|
129 | | - SqlIdentifier left = (SqlIdentifier) ((SqlBasicCall) sqlNode).getOperands()[0]; |
130 | | - SqlIdentifier right = (SqlIdentifier) ((SqlBasicCall) sqlNode).getOperands()[1]; |
| 128 | + SqlNode leftNode = ((SqlBasicCall) sqlNode).getOperands()[0]; |
| 129 | + SqlNode rightNode = ((SqlBasicCall) sqlNode).getOperands()[1]; |
| 130 | + if (leftNode.getKind() == SqlKind.LITERAL) { |
| 131 | + SqlLiteral literal = (SqlLiteral) leftNode; |
| 132 | + SqlIdentifier identifier = (SqlIdentifier) rightNode; |
| 133 | + evalConstantEquation(literal, identifier); |
| 134 | + } else if(rightNode.getKind() == SqlKind.LITERAL) { |
| 135 | + SqlLiteral literal = (SqlLiteral) rightNode; |
| 136 | + SqlIdentifier identifier = (SqlIdentifier) leftNode; |
| 137 | + evalConstantEquation(literal, identifier); |
| 138 | + } else { |
| 139 | + SqlIdentifier left = (SqlIdentifier) leftNode; |
| 140 | + SqlIdentifier right = (SqlIdentifier) rightNode; |
| 141 | + evalEquation(left, right, sideTableName, sqlNode); |
| 142 | + } |
| 143 | + } |
131 | 144 |
|
| 145 | + /** |
| 146 | + * deal normal equation etc. foo.id = bar.id |
| 147 | + * @param left |
| 148 | + * @param right |
| 149 | + * @param sideTableName |
| 150 | + * @param sqlNode |
| 151 | + */ |
| 152 | + private void evalEquation(SqlIdentifier left, SqlIdentifier right, String sideTableName, SqlNode sqlNode) { |
132 | 153 | String leftTableName = left.getComponent(0).getSimple(); |
133 | 154 | String leftField = left.getComponent(1).getSimple(); |
134 | 155 |
|
135 | 156 | String rightTableName = right.getComponent(0).getSimple(); |
136 | 157 | String rightField = right.getComponent(1).getSimple(); |
137 | 158 |
|
138 | 159 | if (leftTableName.equalsIgnoreCase(sideTableName)) { |
139 | | - equalFieldList.add(leftField); |
140 | | - int equalFieldIndex = -1; |
141 | | - for (int i = 0; i < rowTypeInfo.getFieldNames().length; i++) { |
142 | | - String fieldName = rowTypeInfo.getFieldNames()[i]; |
143 | | - if (fieldName.equalsIgnoreCase(rightField)) { |
144 | | - equalFieldIndex = i; |
145 | | - } |
146 | | - } |
147 | | - if (equalFieldIndex == -1) { |
148 | | - throw new RuntimeException("can't deal equal field: " + sqlNode); |
149 | | - } |
150 | | - |
151 | | - equalValIndex.add(equalFieldIndex); |
152 | | - |
| 160 | + associateField(rightField, leftField, sqlNode); |
153 | 161 | } else if (rightTableName.equalsIgnoreCase(sideTableName)) { |
154 | | - |
155 | | - equalFieldList.add(rightField); |
156 | | - int equalFieldIndex = -1; |
157 | | - for (int i = 0; i < rowTypeInfo.getFieldNames().length; i++) { |
158 | | - String fieldName = rowTypeInfo.getFieldNames()[i]; |
159 | | - if (fieldName.equalsIgnoreCase(leftField)) { |
160 | | - equalFieldIndex = i; |
161 | | - } |
162 | | - } |
163 | | - if (equalFieldIndex == -1) { |
164 | | - throw new RuntimeException("can't deal equal field: " + sqlNode.toString()); |
165 | | - } |
166 | | - |
167 | | - equalValIndex.add(equalFieldIndex); |
168 | | - |
| 162 | + associateField(leftField, rightField, sqlNode); |
169 | 163 | } else { |
170 | 164 | throw new RuntimeException("resolve equalFieldList error:" + sqlNode.toString()); |
171 | 165 | } |
172 | 166 | } |
173 | 167 |
|
| 168 | + /** |
| 169 | + * deal with equation with constant etc. foo.id = 1 |
| 170 | + * @param literal |
| 171 | + * @param identifier |
| 172 | + */ |
| 173 | + private void evalConstantEquation(SqlLiteral literal, SqlIdentifier identifier) { |
| 174 | + String tableName = identifier.getComponent(0).getSimple(); |
| 175 | + String fieldName = identifier.getComponent(1).getSimple(); |
| 176 | + Object constant = literal.getValue(); |
| 177 | + List<PredicateInfo> predicateInfos = sideTableInfo.getPredicateInfoes(); |
| 178 | + PredicateInfo predicate = PredicateInfo.builder() |
| 179 | + .setOperatorName("=") |
| 180 | + .setOperatorKind("EQUALS") |
| 181 | + .setOwnerTable(tableName) |
| 182 | + .setFieldName(fieldName) |
| 183 | + .setCondition(constant.toString()) |
| 184 | + .build(); |
| 185 | + predicateInfos.add(predicate); |
| 186 | + } |
| 187 | + |
| 188 | + private void associateField(String sourceTableField, String sideTableField, SqlNode sqlNode) { |
| 189 | + String errorMsg = "can't deal equal field: " + sqlNode; |
| 190 | + equalFieldList.add(sideTableField); |
| 191 | + int equalFieldIndex = -1; |
| 192 | + for (int i = 0; i < rowTypeInfo.getFieldNames().length; i++) { |
| 193 | + String fieldName = rowTypeInfo.getFieldNames()[i]; |
| 194 | + if (fieldName.equalsIgnoreCase(sourceTableField)) { |
| 195 | + equalFieldIndex = i; |
| 196 | + } |
| 197 | + } |
| 198 | + Preconditions.checkState(equalFieldIndex != -1, errorMsg); |
| 199 | + equalValIndex.add(equalFieldIndex); |
| 200 | + } |
| 201 | + |
174 | 202 | public abstract void buildEqualInfo(JoinInfo joinInfo, AbstractSideTableInfo sideTableInfo); |
175 | 203 |
|
176 | 204 | public RowTypeInfo getRowTypeInfo() { |
|
0 commit comments