@@ -81,12 +81,15 @@ public JoinNodeDealer(SideSQLParser sideSQLParser){
81
81
* @param tableRef 存储构建临时表查询后源表和新表之间的关联关系
82
82
* @return
83
83
*/
84
- public JoinInfo dealJoinNode (SqlJoin joinNode , Set <String > sideTableSet ,
85
- Queue <Object > queueInfo , SqlNode parentWhere ,
84
+ public JoinInfo dealJoinNode (SqlJoin joinNode ,
85
+ Set <String > sideTableSet ,
86
+ Queue <Object > queueInfo ,
87
+ SqlNode parentWhere ,
86
88
SqlNodeList parentSelectList ,
87
89
Set <Tuple2 <String , String >> joinFieldSet ,
88
90
Map <String , String > tableRef ,
89
91
Map <String , String > fieldRef ) {
92
+
90
93
SqlNode leftNode = joinNode .getLeft ();
91
94
SqlNode rightNode = joinNode .getRight ();
92
95
JoinType joinType = joinNode .getJoinType ();
@@ -95,8 +98,8 @@ public JoinInfo dealJoinNode(SqlJoin joinNode, Set<String> sideTableSet,
95
98
String leftTbAlias = "" ;
96
99
String rightTableName = "" ;
97
100
String rightTableAlias = "" ;
98
- boolean leftTbisTmp = false ;
99
- //TODO 这个是啥东西
101
+
102
+ //TODO 含义需要更明确
100
103
HashBiMap <String , String > fieldReplaceRef = HashBiMap .create ();
101
104
102
105
//如果是连续join 判断是否已经处理过添加到执行队列
@@ -109,14 +112,12 @@ public JoinInfo dealJoinNode(SqlJoin joinNode, Set<String> sideTableSet,
109
112
dealNestJoin (joinNode , sideTableSet ,
110
113
queueInfo , parentWhere , parentSelectList , joinFieldSet , tableRef , fieldRef , parentSelectList , fieldReplaceRef );
111
114
leftNode = joinNode .getLeft ();
112
-
113
115
}
114
116
115
117
if (leftNode .getKind () == AS ) {
116
118
AliasInfo aliasInfo = (AliasInfo ) sideSQLParser .parseSql (leftNode , sideTableSet , queueInfo , parentWhere , parentSelectList );
117
119
leftTbName = aliasInfo .getName ();
118
120
leftTbAlias = aliasInfo .getAlias ();
119
-
120
121
}
121
122
122
123
boolean leftIsSide = checkIsSideTable (leftTbName , sideTableSet );
@@ -146,69 +147,20 @@ public JoinInfo dealJoinNode(SqlJoin joinNode, Set<String> sideTableSet,
146
147
tableInfo .setRightTableAlias (rightTableAlias );
147
148
}
148
149
149
-
150
- tableInfo .setLeftIsTmpTable (leftTbisTmp );
151
150
tableInfo .setLeftIsSideTable (leftIsSide );
152
151
tableInfo .setRightIsSideTable (rightIsSide );
153
152
tableInfo .setLeftNode (leftNode );
154
153
tableInfo .setRightNode (rightNode );
155
154
tableInfo .setJoinType (joinType );
156
- tableInfo .setFieldRefInfo (fieldReplaceRef );
157
155
158
156
tableInfo .setCondition (joinNode .getCondition ());
159
157
TableUtils .replaceJoinFieldRefTableName (joinNode .getCondition (), fieldRef );
160
158
161
159
//extract 需要查询的字段信息
162
- //TODO 抽取===========================
163
160
if (rightIsSide ){
164
- Set <String > fromTableNameSet = Sets .newHashSet ();
165
- TableUtils .getFromTableInfo (leftNode , fromTableNameSet );
166
- Set <String > extractCondition = Sets .newHashSet ();
167
- extractWhereCondition (fromTableNameSet , (SqlBasicCall ) parentWhere , extractCondition );
168
- Set <String > extractSelectField = extractSelectFields (parentSelectList , fromTableNameSet , tableRef );
169
- Set <String > fieldFromJoinCondition = extractSelectFieldFromJoinCondition (joinFieldSet , fromTableNameSet , tableRef );
170
-
171
- extractSelectField .addAll (extractCondition );
172
- extractSelectField .addAll (fieldFromJoinCondition );
173
-
174
- Set <String > rightFromTableNameSet = Sets .newHashSet ();
175
- TableUtils .getFromTableInfo (rightNode , rightFromTableNameSet );
176
- Set <String > extractRightCondition = Sets .newHashSet ();
177
- extractWhereCondition (rightFromTableNameSet , (SqlBasicCall ) parentWhere , extractRightCondition );
178
- Set <String > rightExtractSelectField = extractSelectFields (parentSelectList , rightFromTableNameSet , tableRef );
179
- Set <String > rightFieldFromJoinCondition = extractSelectFieldFromJoinCondition (joinFieldSet , rightFromTableNameSet , tableRef );
180
- rightExtractSelectField .addAll (extractRightCondition );
181
- rightExtractSelectField .addAll (rightFieldFromJoinCondition );
182
-
183
- //重命名right 中和 left 重名的
184
- Map <String , String > leftTbSelectField = Maps .newHashMap ();
185
- Map <String , String > rightTbSelectField = Maps .newHashMap ();
186
- String newTableName = tableInfo .getNewTableAlias ();
187
-
188
- for (String tmpField : extractSelectField ){
189
- String [] tmpFieldSplit = StringUtils .split (tmpField , '.' );
190
- leftTbSelectField .put (tmpFieldSplit [1 ], tmpFieldSplit [1 ]);
191
- fieldRef .put (tmpField , TableUtils .buildTableField (newTableName , tmpFieldSplit [1 ]));
192
- }
193
-
194
- for (String tmpField : rightExtractSelectField ){
195
- String [] tmpFieldSplit = StringUtils .split (tmpField , '.' );
196
- String originalFieldName = tmpFieldSplit [1 ];
197
- String targetFieldName = originalFieldName ;
198
- if (leftTbSelectField .containsKey (originalFieldName )){
199
- targetFieldName = ParseUtils .dealDuplicateFieldName (leftTbSelectField , originalFieldName );
200
- }
201
-
202
- rightTbSelectField .put (originalFieldName , targetFieldName );
203
- fieldRef .put (tmpField , TableUtils .buildTableField (newTableName , targetFieldName ));
204
- }
205
-
206
- tableInfo .setLeftSelectFieldInfo (leftTbSelectField );
207
- tableInfo .setRightSelectFieldInfo (rightTbSelectField );
208
-
161
+ extractJoinNeedSelectField (leftNode , rightNode , parentWhere , parentSelectList , tableRef , joinFieldSet , fieldRef , tableInfo );
209
162
}
210
163
211
- //=========================================
212
164
if (tableInfo .getLeftNode ().getKind () != AS ){
213
165
return tableInfo ;
214
166
}
@@ -222,19 +174,80 @@ public JoinInfo dealJoinNode(SqlJoin joinNode, Set<String> sideTableSet,
222
174
return tableInfo ;
223
175
}
224
176
177
+ /**
178
+ * 获取join 之后需要查询的字段信息
179
+ */
180
+ public void extractJoinNeedSelectField (SqlNode leftNode ,
181
+ SqlNode rightNode ,
182
+ SqlNode parentWhere ,
183
+ SqlNodeList parentSelectList ,
184
+ Map <String , String > tableRef ,
185
+ Set <Tuple2 <String , String >> joinFieldSet ,
186
+ Map <String , String > fieldRef ,
187
+ JoinInfo tableInfo ){
188
+ Set <String > fromTableNameSet = Sets .newHashSet ();
189
+ TableUtils .getFromTableInfo (leftNode , fromTableNameSet );
190
+ Set <String > extractCondition = Sets .newHashSet ();
191
+ extractWhereCondition (fromTableNameSet , (SqlBasicCall ) parentWhere , extractCondition );
192
+ Set <String > extractSelectField = extractSelectFields (parentSelectList , fromTableNameSet , tableRef );
193
+ Set <String > fieldFromJoinCondition = extractSelectFieldFromJoinCondition (joinFieldSet , fromTableNameSet , tableRef );
194
+
195
+ extractSelectField .addAll (extractCondition );
196
+ extractSelectField .addAll (fieldFromJoinCondition );
197
+
198
+ Set <String > rightFromTableNameSet = Sets .newHashSet ();
199
+ TableUtils .getFromTableInfo (rightNode , rightFromTableNameSet );
200
+ Set <String > extractRightCondition = Sets .newHashSet ();
201
+ extractWhereCondition (rightFromTableNameSet , (SqlBasicCall ) parentWhere , extractRightCondition );
202
+ Set <String > rightExtractSelectField = extractSelectFields (parentSelectList , rightFromTableNameSet , tableRef );
203
+ Set <String > rightFieldFromJoinCondition = extractSelectFieldFromJoinCondition (joinFieldSet , rightFromTableNameSet , tableRef );
204
+ rightExtractSelectField .addAll (extractRightCondition );
205
+ rightExtractSelectField .addAll (rightFieldFromJoinCondition );
206
+
207
+ //重命名right 中和 left 重名的
208
+ Map <String , String > leftTbSelectField = Maps .newHashMap ();
209
+ Map <String , String > rightTbSelectField = Maps .newHashMap ();
210
+ String newTableName = tableInfo .getNewTableAlias ();
211
+
212
+ for (String tmpField : extractSelectField ){
213
+ String [] tmpFieldSplit = StringUtils .split (tmpField , '.' );
214
+ leftTbSelectField .put (tmpFieldSplit [1 ], tmpFieldSplit [1 ]);
215
+ fieldRef .put (tmpField , TableUtils .buildTableField (newTableName , tmpFieldSplit [1 ]));
216
+ }
217
+
218
+ for (String tmpField : rightExtractSelectField ){
219
+ String [] tmpFieldSplit = StringUtils .split (tmpField , '.' );
220
+ String originalFieldName = tmpFieldSplit [1 ];
221
+ String targetFieldName = originalFieldName ;
222
+ if (leftTbSelectField .containsKey (originalFieldName )){
223
+ targetFieldName = ParseUtils .dealDuplicateFieldName (leftTbSelectField , originalFieldName );
224
+ }
225
+
226
+ rightTbSelectField .put (originalFieldName , targetFieldName );
227
+ fieldRef .put (tmpField , TableUtils .buildTableField (newTableName , targetFieldName ));
228
+ }
229
+
230
+ tableInfo .setLeftSelectFieldInfo (leftTbSelectField );
231
+ tableInfo .setRightSelectFieldInfo (rightTbSelectField );
232
+ }
233
+
225
234
226
235
/**
227
236
* 处理多层join
228
- * 判断左节点是否需要创建零时查询
237
+ * 判断左节点是否需要创建临时查询
229
238
* (1)右节点是维表
230
239
* (2)左节点不是 as 节点
231
240
*/
232
- private JoinInfo dealNestJoin (SqlJoin joinNode , Set <String > sideTableSet ,
233
- Queue <Object > queueInfo , SqlNode parentWhere ,
234
- SqlNodeList selectList , Set <Tuple2 <String , String >> joinFieldSet ,
235
- Map <String , String > tableRef , Map <String , String > fieldRef ,
236
- SqlNodeList parentSelectList ,
237
- HashBiMap <String , String > fieldReplaceRef ){
241
+ private JoinInfo dealNestJoin (SqlJoin joinNode ,
242
+ Set <String > sideTableSet ,
243
+ Queue <Object > queueInfo ,
244
+ SqlNode parentWhere ,
245
+ SqlNodeList selectList ,
246
+ Set <Tuple2 <String , String >> joinFieldSet ,
247
+ Map <String , String > tableRef ,
248
+ Map <String , String > fieldRef ,
249
+ SqlNodeList parentSelectList ,
250
+ HashBiMap <String , String > fieldReplaceRef ){
238
251
239
252
SqlJoin leftJoinNode = (SqlJoin ) joinNode .getLeft ();
240
253
SqlNode parentRightJoinNode = joinNode .getRight ();
@@ -249,7 +262,6 @@ private JoinInfo dealNestJoin(SqlJoin joinNode, Set<String> sideTableSet,
249
262
boolean rightIsSide = checkIsSideTable (rightTableName , sideTableSet );
250
263
SqlBasicCall buildAs = TableUtils .buildAsNodeByJoinInfo (joinInfo , null , null );
251
264
252
- //TODO 抽取相同代码
253
265
if (rightIsSide ){
254
266
addSideInfoToExeQueue (queueInfo , joinInfo , joinNode , parentSelectList , parentWhere , fieldReplaceRef , tableRef );
255
267
}
@@ -262,37 +274,17 @@ private JoinInfo dealNestJoin(SqlJoin joinNode, Set<String> sideTableSet,
262
274
extractTemporaryQuery (newLeftNode , leftTbAlias , (SqlBasicCall ) parentWhere ,
263
275
parentSelectList , queueInfo , joinFieldSet , tableRef , fieldRef );
264
276
265
- //记录表之间的关联关系
266
- String newLeftTableName = buildAs .getOperands ()[1 ].toString ();
267
- Set <String > fromTableNameSet = Sets .newHashSet ();
268
- TableUtils .getFromTableInfo (newLeftNode , fromTableNameSet );
269
- for (String tbTmp : fromTableNameSet ){
270
- tableRef .put (tbTmp , newLeftTableName );
271
- }
272
-
273
277
//替换leftNode 为新的查询
274
278
joinNode .setLeft (buildAs );
275
-
276
- //替换select field 中的对应字段
277
- for (SqlNode sqlNode : parentSelectList .getList ()){
278
- for (String tbTmp : fromTableNameSet ) {
279
- //TODO
280
- TableUtils .replaceSelectFieldTable (sqlNode , tbTmp , newLeftTableName , fieldReplaceRef );
281
- }
282
- }
283
-
284
- //替换where 中的条件相关
285
- for (String tbTmp : fromTableNameSet ){
286
- TableUtils .replaceWhereCondition (parentWhere , tbTmp , newLeftTableName );
287
- }
288
-
279
+ replaceSelectAndWhereField (buildAs , leftJoinNode , tableRef , parentSelectList , parentWhere , fieldReplaceRef );
289
280
}
290
281
291
282
return joinInfo ;
292
283
}
293
284
294
285
/**
295
286
* 右边表是维表需要重新构建左表的临时查询
287
+ * 并将joinInfo 添加到执行队列里面
296
288
* @param queueInfo
297
289
* @param joinInfo
298
290
* @param joinNode
@@ -319,15 +311,34 @@ public void addSideInfoToExeQueue(Queue<Object> queueInfo,
319
311
//替换左表为新的表名称
320
312
joinNode .setLeft (buildAs );
321
313
314
+ replaceSelectAndWhereField (buildAs , leftJoinNode , tableRef , parentSelectList , parentWhere , fieldReplaceRef );
315
+ }
316
+
317
+ /**
318
+ * 替换指定的查询和条件节点中的字段为新的字段
319
+ * @param buildAs
320
+ * @param leftJoinNode
321
+ * @param tableRef
322
+ * @param parentSelectList
323
+ * @param parentWhere
324
+ * @param fieldReplaceRef
325
+ */
326
+ public void replaceSelectAndWhereField (SqlBasicCall buildAs ,
327
+ SqlNode leftJoinNode ,
328
+ Map <String , String > tableRef ,
329
+ SqlNodeList parentSelectList ,
330
+ SqlNode parentWhere ,
331
+ HashBiMap <String , String > fieldReplaceRef ){
332
+
322
333
String newLeftTableName = buildAs .getOperands ()[1 ].toString ();
323
334
Set <String > fromTableNameSet = Sets .newHashSet ();
324
335
TableUtils .getFromTableInfo (leftJoinNode , fromTableNameSet );
336
+
325
337
for (String tbTmp : fromTableNameSet ){
326
338
tableRef .put (tbTmp , newLeftTableName );
327
339
}
328
340
329
341
//替换select field 中的对应字段
330
- //TODO
331
342
for (SqlNode sqlNode : parentSelectList .getList ()){
332
343
for (String tbTmp : fromTableNameSet ) {
333
344
TableUtils .replaceSelectFieldTable (sqlNode , tbTmp , newLeftTableName , fieldReplaceRef );
@@ -351,8 +362,10 @@ public void addSideInfoToExeQueue(Queue<Object> queueInfo,
351
362
* @param tableRef
352
363
* @return 源自段和新生成字段之间的映射关系
353
364
*/
354
- private void extractTemporaryQuery (SqlNode node , String tableAlias , SqlBasicCall parentWhere ,
355
- SqlNodeList parentSelectList , Queue <Object > queueInfo ,
365
+ private void extractTemporaryQuery (SqlNode node , String tableAlias ,
366
+ SqlBasicCall parentWhere ,
367
+ SqlNodeList parentSelectList ,
368
+ Queue <Object > queueInfo ,
356
369
Set <Tuple2 <String , String >> joinFieldSet ,
357
370
Map <String , String > tableRef ,
358
371
Map <String , String > fieldRef ){
@@ -389,7 +402,6 @@ private void extractTemporaryQuery(SqlNode node, String tableAlias, SqlBasicCall
389
402
queueInfo .offer (sqlBasicCall );
390
403
391
404
//替换select中的表结构
392
- //TODO
393
405
HashBiMap <String , String > fieldReplaceRef = HashBiMap .create ();
394
406
for (SqlNode tmpSelect : parentSelectList .getList ()){
395
407
for (String tbTmp : fromTableNameSet ) {
0 commit comments