2727import com .google .common .collect .Maps ;
2828import org .apache .commons .lang3 .StringUtils ;
2929
30+ import java .util .ArrayList ;
31+ import java .util .Arrays ;
3032import java .util .List ;
3133import java .util .Map ;
3234import java .util .regex .Matcher ;
@@ -50,6 +52,9 @@ public abstract class AbstractTableParser {
5052 private static Pattern physicalFieldFunPattern = Pattern .compile ("\\ w+\\ ((\\ w+)\\ )$" );
5153 private static Pattern charTypePattern = Pattern .compile ("(?i)CHAR\\ ((\\ d*)\\ )$" );
5254
55+ private static Pattern compositeTypeHeadPattern = Pattern .compile (".+<.+<" );
56+ private static Pattern compositeTypeTailPattern = Pattern .compile (">\\ s*>" );
57+
5358 private Map <String , Pattern > patternMap = Maps .newHashMap ();
5459
5560 private Map <String , ITableFieldDealHandler > handlerMap = Maps .newHashMap ();
@@ -85,16 +90,45 @@ public boolean dealKeyPattern(String fieldRow, AbstractTableInfo tableInfo){
8590 }
8691
8792 public void parseFieldsInfo (String fieldsInfo , AbstractTableInfo tableInfo ){
88- // TODO 替换
93+
8994 List <String > fieldRows = DtStringUtil .splitIgnoreQuota (fieldsInfo , ',' );
95+
96+ ArrayList <String > cache = new ArrayList <>();
97+ boolean currentIsCompositeType = false ;
9098 for (String fieldRow : fieldRows ){
9199 fieldRow = fieldRow .trim ();
92100
93101 if (StringUtils .isBlank (fieldRow )){
94102 throw new RuntimeException (String .format ("table [%s],exists field empty." , tableInfo .getName ()));
95103 }
96104
97- String [] filedInfoArr = fieldRow .split ("\\ s+" );
105+ // 处理复合类型,例如 ARRAY<ROW<foo INT, bar STRING>>
106+ String [] filedInfoArr ;
107+ Matcher headMatcher = compositeTypeHeadPattern .matcher (fieldRow );
108+ Matcher tailMatcher = compositeTypeTailPattern .matcher (fieldRow );
109+
110+ if (tailMatcher .find ()) {
111+ cache .add (fieldRow );
112+ currentIsCompositeType = false ;
113+ fieldRow = String .join ("" , cache );
114+ cache .clear ();
115+ String [] tmp = fieldRow .split ("\\ s+" );
116+ String [] type = Arrays .copyOfRange (tmp , 1 , tmp .length );
117+ filedInfoArr = new String [] {
118+ tmp [0 ],
119+ String .join (" " , type )
120+ };
121+ } else if (headMatcher .find () || currentIsCompositeType ) {
122+ currentIsCompositeType = true ;
123+ StringBuilder builder = new StringBuilder ();
124+ builder .append (fieldRow );
125+ builder .append ("," );
126+ cache .add (builder .toString ());
127+ continue ;
128+ } else {
129+ filedInfoArr = fieldRow .split ("\\ s+" );
130+ }
131+
98132 if (filedInfoArr .length < 2 ){
99133 throw new RuntimeException (String .format ("table [%s] field [%s] format error." , tableInfo .getName (), fieldRow ));
100134 }
0 commit comments