2323import com .dtstack .flink .sql .side .SideTableInfo ;
2424import com .dtstack .flink .sql .side .impala .table .ImpalaSideTableInfo ;
2525import com .dtstack .flink .sql .side .rdb .async .RdbAsyncSideInfo ;
26- import com .dtstack .flink .sql .util .ParseUtils ;
27- import com .google .common .collect .Lists ;
28- import org .apache .calcite .sql .SqlNode ;
29- import org .apache .calcite .sql .SqlSelect ;
3026import org .apache .flink .api .java .typeutils .RowTypeInfo ;
3127
3228import java .util .List ;
3329import java .util .Map ;
30+ import java .util .stream .Collectors ;
3431
3532/**
3633 * Date: 2019/11/12
@@ -46,68 +43,36 @@ public ImpalaAsyncSideInfo(RowTypeInfo rowTypeInfo, JoinInfo joinInfo, List<Fiel
4643 }
4744
4845 @ Override
49- public void buildEqualInfo ( JoinInfo joinInfo , SideTableInfo sideTableInfo ) {
46+ public String getAdditionalWhereClause ( ) {
5047 ImpalaSideTableInfo impalaSideTableInfo = (ImpalaSideTableInfo ) sideTableInfo ;
48+ return impalaSideTableInfo .isEnablePartition () ? buildPartitionCondition (impalaSideTableInfo ) : "" ;
49+ }
5150
52- String sideTableName = joinInfo .getSideTableName ();
53-
54- SqlNode conditionNode = joinInfo .getCondition ();
55-
56- List <SqlNode > sqlNodeList = Lists .newArrayList ();
57-
58- List <String > sqlJoinCompareOperate = Lists .newArrayList ();
59-
60- ParseUtils .parseAnd (conditionNode , sqlNodeList );
61- ParseUtils .parseJoinCompareOperate (conditionNode , sqlJoinCompareOperate );
62-
63- for (SqlNode sqlNode : sqlNodeList ) {
64- dealOneEqualCon (sqlNode , sideTableName );
65- }
6651
67- sqlCondition = "select ${selectField} from ${tableName} where " ;
68- for (int i = 0 ; i < equalFieldList .size (); i ++) {
69- String equalField = sideTableInfo .getPhysicalFields ().getOrDefault (equalFieldList .get (i ), equalFieldList .get (i ));
52+ private String buildPartitionCondition (ImpalaSideTableInfo impalaSideTableInfo ) {
53+ String partitionCondtion = " " ;
54+ String [] partitionfields = impalaSideTableInfo .getPartitionfields ();
55+ String [] partitionFieldTypes = impalaSideTableInfo .getPartitionFieldTypes ();
56+ Map <String , List > partitionVaules = impalaSideTableInfo .getPartitionValues ();
7057
71- sqlCondition += equalField + " " + sqlJoinCompareOperate .get (i ) + " ? " ;
72- if (i != equalFieldList .size () - 1 ) {
73- sqlCondition += " and " ;
74- }
58+ int fieldsSize = partitionfields .length ;
59+ for (int i = 0 ; i < fieldsSize ; i ++) {
60+ String fieldName = partitionfields [i ];
61+ String fieldType = partitionFieldTypes [i ];
62+ List values = partitionVaules .get (fieldName );
63+ String partitionVaule = getPartitionVaule (fieldType , values );
64+ partitionCondtion += String .format ("AND %s IN (%s) " , fieldName , partitionVaule );
7565 }
76- sqlCondition = sqlCondition .replace ("${tableName}" , impalaSideTableInfo .getTableName ()).replace ("${selectField}" , sideSelectFields );
77-
78- boolean enablePartiton = impalaSideTableInfo .isEnablePartition ();
79- if (enablePartiton ){
80- String whereTmp = " " ;
81- String [] partitionfields = impalaSideTableInfo .getPartitionfields ();
82- String [] partitionFieldTypes = impalaSideTableInfo .getPartitionFieldTypes ();
83- Map <String , List > partitionVaules = impalaSideTableInfo .getPartitionValues ();
84- int fieldsSize = partitionfields .length ;
85- for (int i =0 ; i < fieldsSize ; i ++) {
86- String fieldName = partitionfields [i ];
87- String fieldType = partitionFieldTypes [i ];
88- List values = partitionVaules .get (fieldName );
89- String vauleAppend = getVauleAppend (fieldType , values );
90- whereTmp = whereTmp + String .format ("and %s in (%s) " , fieldName , vauleAppend );
66+ return partitionCondtion ;
67+ }
9168
92- }
93- sqlCondition = sqlCondition + whereTmp ;
94- }
9569
96- System .out .println ("--------side sql query:-------------------" );
97- System .out .println (sqlCondition );
98- }
70+ private String getPartitionVaule (String fieldType , List values ) {
71+ String partitionVaule = values .stream ().map (val -> {
72+ return (fieldType .toLowerCase ().equals ("string" ) || fieldType .toLowerCase ().equals ("varchar" )) ? "'" + val + "'" : val .toString ();
73+ }).collect (Collectors .joining (" , " )).toString ();
9974
100- public String getVauleAppend (String fieldType , List values ) {
101- String vauleAppend = "" ;
102- for (int i =0 ; i < values .size (); i ++) {
103- if (fieldType .toLowerCase ().equals ("string" ) || fieldType .toLowerCase ().equals ("varchar" )) {
104- vauleAppend = vauleAppend + "," + "'" + values .get (i ) + "'" ;
105- continue ;
106- }
107- vauleAppend = vauleAppend + "," + values .get (i ).toString ();
108- }
109- vauleAppend = vauleAppend .replaceFirst ("," , "" );
110- return vauleAppend ;
75+ return partitionVaule ;
11176 }
11277
11378}
0 commit comments