001 002package gudusoft.gsqlparser.scriptWriter; 003 004 005import gudusoft.gsqlparser.nodes.*; 006 007 008import java.io.StringWriter; 009 010public class TScriptGenerator 011{ 012 private TScriptWriter scriptWriter; 013 private TScriptGeneratorVisitor scriptGeneratorVisitor; 014 015 public TScriptGenerator( ) 016 { 017 scriptWriter = new TScriptWriter( ); 018 scriptGeneratorVisitor = new TScriptGeneratorVisitor( scriptWriter); 019 } 020 021 022 023 public String generateScript( TParseTreeNode parseTreeNode ) 024 { 025 // TScriptWriter scriptWriter = new TScriptWriter(); 026 // TScriptGeneratorVisitor scriptGeneratorVisitor = new 027 // TScriptGeneratorVisitor(scriptWriter); 028 scriptWriter.reset( ); 029 parseTreeNode.accept( scriptGeneratorVisitor ); 030 StringWriter stringWriter = new StringWriter( ); 031 scriptWriter.writeTo( stringWriter ); 032 return stringWriter.toString( ); 033 034 } 035 036 037// class searchColumnVisitor implements IExpressionVisitor { 038// private TExpressionList _resultList; 039// private String _targetColumn; 040// 041// public searchColumnVisitor(String targetColumn, TExpressionList resultList){ 042// _resultList = resultList; 043// _targetColumn = targetColumn; 044// } 045// 046// public boolean exprVisit(TParseTreeNode pNode,boolean isLeafNode){ 047// TExpression expr = (TExpression)pNode; 048// if (expr.getExpressionType() == EExpressionType.simple_object_name_t){ 049// if (_targetColumn.contains(".")){ 050// if (_targetColumn.equalsIgnoreCase(expr.getObjectOperand().toString())){ 051// _resultList.addExpression(expr); 052// } 053// }else{ 054// if (_targetColumn.equalsIgnoreCase(expr.getObjectOperand().getColumnNameOnly())){ 055// _resultList.addExpression(expr); 056// } 057// } 058// }else if (expr.getExpressionType() == EExpressionType.function_t){ 059// if (expr.getFunctionCall().getArgs().size() > 0){ 060// TExpressionList list1; 061// for(int i=0;i<expr.getFunctionCall().getArgs().size();i++){ 062// list1 = searchColumnInExpr(expr.getFunctionCall().getArgs().getExpression(i),_targetColumn); 063// if (list1.size() > 0){ 064// for(int j=0;j<list1.size();j++){ 065// _resultList.addExpression(list1.getExpression(j)); 066// } 067// } 068// } 069// //expr.getFunctionCall().getArgs().getExpression(0). 070// } 071// } 072// return true; 073// }; 074// } 075 076 //private EDbVendor dbVendor; 077 078 079// public TExpressionList searchColumnInExpr(TExpression sourceExpr, String columnName){ 080// TExpressionList resultList = new TExpressionList(); 081// sourceExpr.inOrderTraverse(new searchColumnVisitor(columnName,resultList)); 082// return resultList; 083// } 084 085// public void removeExpr(TExpression pExpr){ 086// if (pExpr.getExpressionType() == EExpressionType.removed_t) return; 087// pExpr.setExpressionType(EExpressionType.removed_t); 088// TExpression parentExpr = pExpr.getParentExpr(); 089// 090// if (parentExpr == null) return; 091// 092// switch (parentExpr.getExpressionType()){ 093// case list_t: // (1,2,3) in (column1,column2,column3) 094// // remove column1 will break this expr, so need to remove parent expr of list_t as well. 095// //if (parentExpr.getParentExpr() != null) removeExpr(parentExpr.getParentExpr()); 096// removeExpr(parentExpr); 097// break; 098// case pattern_matching_t: 099// removeExpr(parentExpr); 100// break; 101// case unary_plus_t: 102// case unary_minus_t: 103// case unary_prior_t: 104// removeExpr(parentExpr); 105// break; 106// case arithmetic_plus_t: 107// case arithmetic_minus_t: 108// case arithmetic_times_t: 109// case arithmetic_divide_t: 110// case power_t: 111// case range_t: 112// case period_ldiff_t: 113// case period_rdiff_t: 114// case period_p_intersect_t: 115// case period_p_normalize_t: 116// case contains_t: 117// removeExpr(parentExpr); 118// break; 119// case assignment_t: 120// removeExpr(parentExpr); 121// break; 122// case sqlserver_proprietary_column_alias_t: 123// removeExpr(parentExpr); 124// break; 125// case arithmetic_modulo_t: 126// case bitwise_exclusive_or_t: 127// case bitwise_or_t: 128// case bitwise_and_t: 129// case bitwise_xor_t: 130// case exponentiate_t: 131// case scope_resolution_t: 132// case at_time_zone_t: 133// case member_of_t: 134// case arithmetic_exponentiation_t: 135// removeExpr(parentExpr); 136// break; 137// case at_local_t: 138// case day_to_second_t: 139// case year_to_month_t: 140// removeExpr(parentExpr); 141// break; 142// case parenthesis_t: 143// removeExpr(parentExpr); 144// break; 145// case simple_comparison_t: 146// removeExpr(parentExpr); 147// break; 148// case group_comparison_t: 149// removeExpr(parentExpr); 150// break; 151// case in_t: 152// removeExpr(parentExpr); 153// break; 154// case floating_point_t: 155// removeExpr(parentExpr); 156// break; 157// case logical_xor_t: 158// case is_t: 159// removeExpr(parentExpr); 160// break; 161// case logical_not_t: 162// removeExpr(parentExpr); 163// break; 164// case null_t: 165// removeExpr(parentExpr); 166// break; 167// case between_t: 168// removeExpr(parentExpr); 169// break; 170// case is_of_type_t: 171// removeExpr(parentExpr); 172// break; 173// case collate_t: //sql server,postgresql 174// removeExpr(parentExpr); 175// break; 176// case left_join_t: 177// case right_join_t: 178// removeExpr(parentExpr); 179// break; 180// case ref_arrow_t: 181// removeExpr(parentExpr); 182// break; 183// case typecast_t: 184// removeExpr(parentExpr); 185// break; 186// case arrayaccess_t: 187// removeExpr(parentExpr); 188// break; 189// case unary_connect_by_root_t: 190// removeExpr(parentExpr); 191// break; 192// case interval_t: 193// removeExpr(parentExpr); 194// break; 195// case unary_binary_operator_t: 196// removeExpr(parentExpr); 197// break; 198// case left_shift_t: 199// case right_shift_t: 200// removeExpr(parentExpr); 201// break; 202// case array_constructor_t: 203// removeExpr(parentExpr); 204// break; 205// case objectConstruct_t: 206// removeExpr(parentExpr); 207// break; 208// case row_constructor_t: 209// removeExpr(parentExpr); 210// break; 211// case namedParameter_t: 212// removeExpr(parentExpr); 213// break; 214// case positionalParameter_t: 215// removeExpr(parentExpr); 216// break; 217// case collectionArray_t: 218// removeExpr(parentExpr); 219// break; 220// case collectionCondition_t: 221// removeExpr(parentExpr); 222// break; 223// case unary_squareroot_t: 224// case unary_cuberoot_t: 225// case unary_factorialprefix_t: 226// case unary_absolutevalue_t: 227// case unary_bitwise_not_t: 228// removeExpr(parentExpr); 229// break; 230// case unary_factorial_t: 231// removeExpr(parentExpr); 232// break; 233// case bitwise_shift_left_t: 234// case bitwise_shift_right_t: 235// removeExpr(parentExpr); 236// break; 237// case multiset_union_t: 238// case multiset_union_distinct_t: 239// case multiset_intersect_t: 240// case multiset_intersect_distinct_t: 241// case multiset_except_t: 242// case multiset_except_distinct_t: 243// removeExpr(parentExpr); 244// break; 245// case json_get_text: 246// case json_get_text_at_path: 247// case json_get_object: 248// case json_get_object_at_path: 249// case json_left_contain: 250// case json_right_contain: 251// case json_exist: 252// case json_any_exist: 253// case json_all_exist: 254// removeExpr(parentExpr); 255// break; 256// case interpolate_previous_value_t: 257// removeExpr(parentExpr); 258// break; 259// case concatenate_t: 260// case logical_and_t: 261// case logical_or_t: 262// if (pExpr == parentExpr.getLeftOperand()){ 263// copyExpr(parentExpr.getRightOperand(),parentExpr); 264// }else if (pExpr == parentExpr.getRightOperand()){ 265// copyExpr(parentExpr.getLeftOperand(),parentExpr); 266// } 267// 268// break; 269// default: 270// removeExpr(parentExpr); 271// break; 272// 273// } 274// 275// } 276 277// public static void copyExpr(TExpression src,TExpression target){ 278// target.setExpressionType(src.getExpressionType()); 279// target.setLeftOperand(src.getLeftOperand()); 280// target.setRightOperand(src.getRightOperand()); 281// target.setObjectOperand(src.getObjectOperand()); 282// target.setFunctionCall(src.getFunctionCall()); 283// target.setSubQuery(src.getSubQuery()); 284// target.setConstantOperand(src.getConstantOperand()); 285// target.setExprList(src.getExprList()); 286// target.setOperatorToken(src.getOperatorToken()); 287// target.setComparisonOperator(src.getComparisonOperator()); 288// target.setBetweenOperand(src.getBetweenOperand()); 289// target.setCaseExpression(src.getCaseExpression()); 290// 291// target.setLikeEscapeOperand(src.getLikeEscapeOperand()); 292// target.setNotToken(src.getNotToken()); 293// target.setQuantifier(src.getQuantifier()); 294// target.setQuantifierType(src.getQuantifierType()); 295// 296// } 297 298 299 300// public TExpression createBinaryExpression( EExpressionType expressionType, 301// TExpression left, TExpression right ) 302// { 303// TExpression ret = new TExpression( ); 304// ret.setExpressionType( expressionType ); 305// ret.setLeftOperand( left ); 306// ret.setRightOperand( right ); 307// return ret; 308// } 309// 310// public TExpression createComparisonPredicate( 311// EComparisonType comparisonType, TExpression left, TExpression right ) 312// { 313// TExpression ret = new TExpression( ); 314// ret.setExpressionType( EExpressionType.simple_comparison_t ); 315// ret.setComparisonType( comparisonType ); 316// ret.setLeftOperand( left ); 317// ret.setRightOperand( right ); 318// return ret; 319// } 320// 321// public TExpression createAndPredicate( TExpression left, TExpression right ) 322// { 323// TExpression ret = createPredicate( EExpressionType.logical_and_t ); 324// ret.setLeftOperand( left ); 325// ret.setRightOperand( right ); 326// return ret; 327// } 328// 329// public TExpression createOrPredicate( TExpression left, TExpression right ) 330// { 331// TExpression ret = createPredicate( EExpressionType.logical_or_t ); 332// ret.setLeftOperand( left ); 333// ret.setRightOperand( right ); 334// return ret; 335// } 336// 337// public TExpression createSubqueryPredicate( EComparisonType comparisonType, 338// EQuantifierType quantifierType, TExpression left, 339// TExpression subqueryExpr ) 340// { 341// TExpression ret; 342// if ( quantifierType == EQuantifierType.none ) 343// { 344// ret = createPredicate( EExpressionType.simple_comparison_t ); 345// } 346// else 347// { 348// ret = createPredicate( EExpressionType.group_comparison_t ); 349// } 350// ret.setComparisonType( comparisonType ); 351// ret.setQuantifierType( quantifierType ); 352// ret.setLeftOperand( left ); 353// ret.setRightOperand( subqueryExpr ); 354// return ret; 355// } 356// 357// public TExpression existsSubqueryPredicate( TExpression subqueryExpr ) 358// { 359// TExpression ret = createPredicate( EExpressionType.exists_t ); 360// ret.setSubQuery( subqueryExpr.getSubQuery( ) ); 361// return ret; 362// } 363// 364// public TExpression createParenthesisExpression( TExpression expression ) 365// { 366// TExpression ret = new TExpression( ); 367// ret.setExpressionType( EExpressionType.parenthesis_t ); 368// ret.setLeftOperand( expression ); 369// return ret; 370// } 371// 372// private TExpression createPredicate( EExpressionType expressionType ) 373// { 374// TExpression ret = new TExpression( ); 375// ret.setExpressionType( expressionType ); 376// return ret; 377// } 378// 379// 380// public boolean verifyScript( TSourceTokenList originalTokenList ) 381// { 382// return scriptWriter.verifyTokens( originalTokenList, false ); 383// } 384// 385// public boolean verifyScript( TCustomSqlStatement sqlStatement ) 386// { 387// return scriptWriter.verifyTokens( sqlStatement.sourcetokenlist, 388// sqlStatement.sqlstatementtype == ESqlStatementType.sstcreatetable ); 389// } 390 391 392}