2727import org .apache .calcite .sql .SqlJoin ;
2828import org .apache .calcite .sql .SqlKind ;
2929import org .apache .calcite .sql .SqlNode ;
30- import org .apache .calcite .sql .SqlNodeList ;
3130import org .apache .calcite .sql .SqlOperator ;
32- import org .apache .calcite .sql .SqlOrderBy ;
3331import org .apache .calcite .sql .SqlSelect ;
34- import org .apache .calcite .sql .SqlWith ;
35- import org .apache .calcite .sql .SqlWithItem ;
3632import org .apache .calcite .sql .parser .SqlParseException ;
3733import org .apache .calcite .sql .parser .SqlParser ;
3834
3935import java .util .List ;
4036import java .util .Map ;
37+ import java .util .stream .Collectors ;
4138
4239import static org .apache .calcite .sql .SqlKind .*;
4340
4441/**
4542 *
46- * 将同级谓词下推到维表
43+ * 将同级谓词信息填充到维表
4744 * Date: 2019/12/11
4845 * Company: www.dtstack.com
4946 * @author maqi
@@ -55,6 +52,12 @@ public void fillPredicatesForSideTable(String exeSql, Map<String, SideTableInfo>
5552 parseSql (sqlNode , sideTableMap , Maps .newHashMap ());
5653 }
5754
55+ /**
56+ * 将谓词信息填充到维表属性
57+ * @param sqlNode
58+ * @param sideTableMap
59+ * @param tabMapping 谓词属性中别名对应的真实维表名称
60+ */
5861 private void parseSql (SqlNode sqlNode , Map <String , SideTableInfo > sideTableMap , Map <String , String > tabMapping ) {
5962 SqlKind sqlKind = sqlNode .getKind ();
6063 switch (sqlKind ) {
@@ -67,15 +70,13 @@ private void parseSql(SqlNode sqlNode, Map<String, SideTableInfo> sideTableMap,
6770 SqlNode whereNode = ((SqlSelect ) sqlNode ).getWhere ();
6871
6972 if (fromNode .getKind () != IDENTIFIER ) {
70- // 子查询或者AS
7173 parseSql (fromNode , sideTableMap , tabMapping );
7274 }
73-
75+ // 带or的不解析
7476 if (null != whereNode && whereNode .getKind () != OR ) {
75- List <PredicateInfo > predicateInfos = Lists .newArrayList ();
76- extractPredicateInfo (whereNode , predicateInfos );
77- // tabMapping: <m,MyTable>, <s.sideTable>
78- System .out .println (predicateInfos );
77+ List <PredicateInfo > predicateInfoList = Lists .newArrayList ();
78+ extractPredicateInfo (whereNode , predicateInfoList );
79+ fillToSideTableInfo (sideTableMap , tabMapping , predicateInfoList );
7980 }
8081 break ;
8182 case JOIN :
@@ -94,7 +95,6 @@ private void parseSql(SqlNode sqlNode, Map<String, SideTableInfo> sideTableMap,
9495 parseSql (info , sideTableMap , Maps .newHashMap ());
9596 }
9697 break ;
97-
9898 case UNION :
9999 SqlNode unionLeft = ((SqlBasicCall ) sqlNode ).getOperands ()[0 ];
100100 SqlNode unionRight = ((SqlBasicCall ) sqlNode ).getOperands ()[1 ];
@@ -104,43 +104,39 @@ private void parseSql(SqlNode sqlNode, Map<String, SideTableInfo> sideTableMap,
104104 }
105105 }
106106
107+ private void fillToSideTableInfo (Map <String , SideTableInfo > sideTableMap , Map <String , String > tabMapping , List <PredicateInfo > predicateInfoList ) {
108+ predicateInfoList .stream ().filter (info -> sideTableMap .containsKey (tabMapping .getOrDefault (info .getOwnerTable (), info .getOwnerTable ())))
109+ .map (info -> sideTableMap .get (tabMapping .getOrDefault (info .getOwnerTable (), info .getOwnerTable ())).getPredicateInfoes ().add (info ))
110+ .count ();
111+ }
107112
108113
109- private void extractPredicateInfo (SqlNode whereNode , List <PredicateInfo > predicatesInfo ) {
114+ private void extractPredicateInfo (SqlNode whereNode , List <PredicateInfo > predicatesInfoList ) {
110115 SqlKind sqlKind = whereNode .getKind ();
111116 if (sqlKind == SqlKind .AND && ((SqlBasicCall ) whereNode ).getOperandList ().size () == 2 ) {
112- extractPredicateInfo (((SqlBasicCall ) whereNode ).getOperands ()[0 ], predicatesInfo );
113- extractPredicateInfo (((SqlBasicCall ) whereNode ).getOperands ()[1 ], predicatesInfo );
117+ extractPredicateInfo (((SqlBasicCall ) whereNode ).getOperands ()[0 ], predicatesInfoList );
118+ extractPredicateInfo (((SqlBasicCall ) whereNode ).getOperands ()[1 ], predicatesInfoList );
114119 } else {
115120 SqlOperator operator = ((SqlBasicCall ) whereNode ).getOperator ();
116121 String operatorName = operator .getName ();
117122 SqlKind operatorKind = operator .getKind ();
118-
119- if (operatorKind == SqlKind .BETWEEN ) {
120- SqlIdentifier fieldFullPath = (SqlIdentifier ) ((SqlBasicCall ) whereNode ).getOperands ()[0 ];
121- if (fieldFullPath .names .size () == 2 ) {
122- String ownerTable = fieldFullPath .names .get (0 );
123- String fieldName = fieldFullPath .names .get (1 );
124- String content = ((SqlBasicCall ) whereNode ).getOperands ()[1 ].toString () + " and " + ((SqlBasicCall ) whereNode ).getOperands ()[2 ].toString ();
125- PredicateInfo predicateInfo = PredicateInfo .builder ().setOperatorName (operatorName ).setOperatorKind (operatorKind .toString ())
126- .setOwnerTable (ownerTable ).setFieldName (fieldName ).setCondition (content ).build ();
127- predicatesInfo .add (predicateInfo );
128- }
129- } else {
123+ // 跳过函数
124+ if ((((SqlBasicCall ) whereNode ).getOperands ()[0 ] instanceof SqlIdentifier )) {
130125 SqlIdentifier fieldFullPath = (SqlIdentifier ) ((SqlBasicCall ) whereNode ).getOperands ()[0 ];
131- // not table name not deal
132126 if (fieldFullPath .names .size () == 2 ) {
133127 String ownerTable = fieldFullPath .names .get (0 );
134128 String fieldName = fieldFullPath .names .get (1 );
135- String content = ((SqlBasicCall ) whereNode ).getOperands ()[1 ].toString ();
129+ String content = (operatorKind == SqlKind .BETWEEN ) ? ((SqlBasicCall ) whereNode ).getOperands ()[1 ].toString () + " AND " +
130+ ((SqlBasicCall ) whereNode ).getOperands ()[2 ].toString () : ((SqlBasicCall ) whereNode ).getOperands ()[1 ].toString ();
131+
136132 PredicateInfo predicateInfo = PredicateInfo .builder ().setOperatorName (operatorName ).setOperatorKind (operatorKind .toString ())
137133 .setOwnerTable (ownerTable ).setFieldName (fieldName ).setCondition (content ).build ();
138- predicatesInfo .add (predicateInfo );
134+
135+ predicatesInfoList .add (predicateInfo );
139136 }
140137 }
141138
142139 }
143140 }
144141
145-
146142}
0 commit comments