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}