001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.TSourceToken;
004import gudusoft.gsqlparser.nodes.hana.TTimeTravel;
005import gudusoft.gsqlparser.nodes.mssql.TForXMLClause;
006import gudusoft.gsqlparser.nodes.mssql.TOptionClause;
007import gudusoft.gsqlparser.nodes.teradata.TExpandOnClause;
008import gudusoft.gsqlparser.nodes.hive.*;
009import gudusoft.gsqlparser.nodes.teradata.THashByClause;
010import gudusoft.gsqlparser.nodes.vertica.TTimeSeries;
011import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
012
013import java.util.ArrayList;
014
015/**
016 * Internal used by parser, reprsents raw parse tree node of select statement.
017*/
018public class TSelectSqlNode extends TParseTreeNode{
019
020    private TForXMLClause forXMLClause;
021
022    public void setForXMLClause(TForXMLClause forXMLClause) {
023        this.forXMLClause = forXMLClause;
024    }
025
026    public TForXMLClause getForXMLClause() {
027        return forXMLClause;
028    }
029
030    public void setRelationExpr(TRelationExpr relationExpr) {
031        this.relationExpr = relationExpr;
032    }
033
034    public TRelationExpr getRelationExpr() {
035        return relationExpr;
036    }
037
038    private TRelationExpr relationExpr = null;
039
040    private TClusterBy clusterBy;
041
042    public void setClusterBy(TClusterBy clusterBy) {
043        this.clusterBy = clusterBy;
044    }
045
046    public TClusterBy getClusterBy() {
047        return clusterBy;
048    }
049
050    private boolean isConsume;
051
052    public void setConsume(boolean consume) {
053        isConsume = consume;
054    }
055
056    public boolean isConsume() {
057        return isConsume;
058    }
059
060    public void setHiveFromQuery(boolean hiveFromQuery) {
061        isHiveFromQuery = hiveFromQuery;
062    }
063
064    private boolean isHiveFromQuery = false;
065
066    public boolean isHiveFromQuery() {
067        return isHiveFromQuery;
068    }
069
070    public void setHiveBodyList(ArrayList<TParseTreeNode> hiveBodyList) {
071        this.hiveBodyList = hiveBodyList;
072    }
073
074    /**
075     * @deprecated since 2.6.3.5, insert and select statement after from query
076     * is represented by {@link TSelectSqlNode#getSelectSqlNodes()} or {@link TInsertSqlNode#getInsertSqlNodes()}
077     *
078     * @return
079     */
080    public ArrayList<TParseTreeNode> getHiveBodyList() {
081        return hiveBodyList;
082    }
083
084    private ArrayList<TParseTreeNode> hiveBodyList;
085
086
087
088//    private TExpression skipOffset;
089//    private TExpression firstMax;
090//    private TExpression limitMax;
091//
092//    public void setSkipOffset(TExpression skipOffset) {
093//        this.skipOffset = skipOffset;
094//    }
095//
096//    public void setFirstMax(TExpression firstMax) {
097//        this.firstMax = firstMax;
098//    }
099//
100//    public void setLimitMax(TExpression limitMax) {
101//        this.limitMax = limitMax;
102//    }
103//
104//    /**
105//     * Informix skip offset
106//     * @return skip offset
107//     */
108//    public TExpression getSkipOffset() {
109//
110//        return skipOffset;
111//    }
112//
113//    /**
114//     * Informix first Max
115//     * @return first Max
116//     */
117//    public TExpression getFirstMax() {
118//        return firstMax;
119//    }
120//
121//    /**
122//     * Informix limit max
123//     * @return limit max
124//     */
125//    public TExpression getLimitMax() {
126//        return limitMax;
127//    }
128
129    private THashByClause hashByClause;
130
131    public void setHashByClause(THashByClause hashByClause) {
132        this.hashByClause = hashByClause;
133    }
134
135    public THashByClause getHashByClause() {
136        return hashByClause;
137    }
138
139    private THavingClause havingClause;
140
141    public void setHavingClause(THavingClause havingClause) {
142        this.havingClause = havingClause;
143        if (this.groupByClause != null){
144            this.groupByClause.setHavingClause(havingClause.getCondition());
145        }else{
146            this.groupByClause = new TGroupBy();
147            this.groupByClause.setHavingClause(havingClause.getCondition());
148        }
149    }
150
151    public THavingClause getHavingClause() {
152        return havingClause;
153    }
154
155    private TPTNodeList<TParseTreeNode> queryClauseList;
156
157    public void setQueryClauseList(TPTNodeList<TParseTreeNode> queryClauseList) {
158        this.queryClauseList = queryClauseList;
159        for(int i=0;i<this.queryClauseList.size();i++){
160            TParseTreeNode parseTreeNode = this.queryClauseList.getElement(i);
161            if (parseTreeNode instanceof TFromTableList){
162                //from clause
163                this.setFromTableList((TFromTableList)parseTreeNode);
164            }else if (parseTreeNode instanceof THashByClause){
165                this.setHashByClause((THashByClause)parseTreeNode);
166            }else if (parseTreeNode instanceof TWhereClause){
167                this.setWhereCondition((TWhereClause)parseTreeNode);
168            }else if (parseTreeNode instanceof TGroupBy){
169                this.setGroupByClause((TGroupBy)parseTreeNode);
170            }else if (parseTreeNode instanceof THavingClause){
171                this.setHavingClause((THavingClause)parseTreeNode);
172            }else if (parseTreeNode instanceof TQualifyClause){
173                this.setQualifyClause((TQualifyClause)parseTreeNode);
174            }else if (parseTreeNode instanceof TSampleClause){
175                this.setSampleClause((TSampleClause)parseTreeNode);
176            }else if (parseTreeNode instanceof TExpandOnClause){
177                this.setExpandOnClause((TExpandOnClause)parseTreeNode);
178            }else if (parseTreeNode instanceof TTeradataWithClause){
179                this.setWithClause((TTeradataWithClause)parseTreeNode);
180            }else if (parseTreeNode instanceof TOrderBy){
181                this.setOrderbyClause((TOrderBy)parseTreeNode);
182            }else if (parseTreeNode instanceof TIntoClause){
183                this.setIntoClause((TIntoClause)parseTreeNode);
184            }else if (parseTreeNode instanceof TClusterBy){
185                this.setClusterBy((TClusterBy)parseTreeNode);
186            }else if (parseTreeNode instanceof TDistributeBy){
187                this.setDistributeBy((TDistributeBy)parseTreeNode);
188            }else if (parseTreeNode instanceof TSortBy){
189                this.setSortBy((TSortBy)parseTreeNode);
190            }
191        }
192    }
193
194    public void setSelectModifiers(ArrayList<TSelectModifier> selectModifiers) {
195        this.selectModifiers = selectModifiers;
196    }
197
198    public ArrayList<TSelectModifier> getSelectModifiers() {
199        return selectModifiers;
200    }
201
202    private ArrayList<TSelectModifier> selectModifiers;
203
204    private TWithTableLock withTableLock;
205
206    public void setWithTableLock(TWithTableLock withTableLock) {
207        this.withTableLock = withTableLock;
208    }
209
210    public TWithTableLock getWithTableLock() {
211
212        return withTableLock;
213    }
214
215    private TTimeSeries timeSeries;
216
217    public void setTimeSeries(TTimeSeries timeSeries) {
218        this.timeSeries = timeSeries;
219    }
220
221    public TTimeSeries getTimeSeries() {
222
223        return timeSeries;
224    }
225
226    private TTimeTravel timeTravel; // hana
227    private THintClause hintClause; //hana
228
229    public TTimeTravel getTimeTravel() {
230        return timeTravel;
231    }
232
233    public void setClauses(TPTNodeList<TParseTreeNode> clauses){
234        for(int i=0;i<clauses.size();i++){
235            TParseTreeNode node = clauses.getElement(i);
236            if (node instanceof TForUpdate){
237                this.forupdateClause = (TForUpdate)node;
238            }else if (node instanceof TOrderBy){
239                this.orderbyClause = (TOrderBy)node;
240            }else if (node instanceof TLimitClause){
241                this.limitClause  = (TLimitClause)node;
242            }else if (node instanceof TTimeTravel){
243                this.timeTravel = (TTimeTravel)node;
244            }
245        }
246    }
247
248
249    public void setHintClause(THintClause hintClause) {
250        this.hintClause = hintClause;
251    }
252
253    public THintClause getHintClause() {
254
255        return hintClause;
256    }
257
258    public int getParenthesisCount() {
259        return parenthesisCount;
260    }
261
262    public void incParenthesisCount() {
263       this.parenthesisCount++;
264    }
265
266    private int parenthesisCount = 0;
267    private int parenthissisCountBeforeOrder = 0;
268
269
270    public void setParenthesisCount(int parenthesisCount) {
271        this.parenthesisCount = parenthesisCount;
272    }
273
274    public void setParenthissisCountBeforeOrder() {
275
276        this.parenthissisCountBeforeOrder = parenthesisCount;
277        parenthesisCount = 0;
278    }
279
280    public int getParenthissisCountBeforeOrder() {
281
282        return parenthissisCountBeforeOrder;
283    }
284
285    private TOffsetClause offsetClause;
286
287    public void setOffsetClause(TOffsetClause offsetClause) {
288        this.offsetClause = offsetClause;
289    }
290
291    public TOffsetClause getOffsetClause() {
292
293        return offsetClause;
294    }
295
296    public void setOptionClause(TOptionClause optionClause) {
297        this.optionClause = optionClause;
298    }
299
300    public TOptionClause getOptionClause() {
301
302        return optionClause;
303    }
304
305    /**
306     * sql server option clause
307     * @see gudusoft.gsqlparser.nodes.mssql.TOptionClause
308     */
309    private TOptionClause optionClause;
310
311    private TLateralView lateralView;
312
313    public void setLateralView(TLateralView lateralView) {
314        this.lateralView = lateralView;
315    }
316
317    public TLateralView getLateralView() {
318
319        return lateralView;
320    }
321
322    private TSortBy sortBy;
323
324    public void setSortBy(TSortBy sortBy) {
325        this.sortBy = sortBy;
326    }
327
328    public TSortBy getSortBy() {
329
330        return sortBy;
331    }
332
333    private TDistributeBy distributeBy;
334
335    public void setDistributeBy(TDistributeBy distributeBy) {
336        this.distributeBy = distributeBy;
337    }
338
339    public TDistributeBy getDistributeBy() {
340
341        return distributeBy;
342    }
343
344//    private THiveClusterBy hiveClusterBy;
345//
346//    public void setHiveClusterBy(THiveClusterBy hiveClusterBy) {
347//        this.hiveClusterBy = hiveClusterBy;
348//    }
349//
350//    public THiveClusterBy getHiveClusterBy() {
351//
352//        return hiveClusterBy;
353//    }
354
355    private THiveTransformClause transformClause;
356
357    public THiveTransformClause getTransformClause() {
358        return transformClause;
359    }
360
361    public void setTransformClause(THiveTransformClause transformClause) {
362        this.transformClause = transformClause;
363    }
364
365    public void setHiveHintClause(THiveHintClause hiveHintClause) {
366        this.hiveHintClause = hiveHintClause;
367    }
368
369    public THiveHintClause getHiveHintClause() {
370        return hiveHintClause;
371    }
372
373    private THiveHintClause hiveHintClause;
374
375    private TIntoTableClause intoTableClause;
376
377    public void setIntoTableClause(TIntoTableClause intoTableClause) {
378        this.intoTableClause = intoTableClause;
379    }
380
381    public TIntoTableClause getIntoTableClause() {
382
383        return intoTableClause;
384    }
385
386    public void setSelectToken(TSourceToken selectToken) {
387        this.selectToken = selectToken;
388    }
389
390    public TSourceToken getSelectToken() {
391
392        return selectToken;
393    }
394
395    private TSourceToken selectToken = null;
396
397    private TResultColumnList resultColumnList;
398
399    public TSelectDistinct getSelectDistinct() {
400        return selectDistinct;
401    }
402
403    public void setSelectDistinct(TSelectDistinct selectDistinct) {
404
405        this.selectDistinct = selectDistinct;
406    }
407
408    private TSelectDistinct selectDistinct = null;
409
410    public void setTopClause(TTopClause topClause) {
411        this.topClause = topClause;
412    }
413
414    public TTopClause getTopClause() {
415
416        return topClause;
417    }
418
419    private TTopClause topClause = null;
420
421    public void setComputeClause(TComputeClause computeClause) {
422
423        this.computeClause = computeClause;
424    }
425
426    public TComputeClause getComputeClause() {
427        return computeClause;
428    }
429
430    private TComputeClause computeClause = null;
431    
432    public TResultColumnList getResultColumnList() {
433        return resultColumnList;
434    }
435
436    public TFromTableList getFromTableList() {
437        return fromTableList;
438    }
439
440    public TWhereClause getWhereCondition() {
441        return whereCondition;
442    }
443
444    private TFromTableList fromTableList;
445
446    public void setResultColumnList(TResultColumnList resultColumnList) {
447        this.resultColumnList = resultColumnList;
448    }
449
450    public void setFromTableList(TFromTableList fromTableList) {
451        this.fromTableList = fromTableList;
452    }
453
454    public void setWhereCondition(TWhereClause whereCondition) {
455        this.whereCondition = whereCondition;
456    }
457
458    private TWhereClause whereCondition;
459
460    private TSelectSqlNode leftNode,rightNode;
461
462    public TCTEList cteList;
463
464    public TCTEList getCteList() {
465        return cteList;
466    }
467
468    public int getSetOperator() {
469        return setOperator;
470    }
471
472    private int setOperator = 0;
473
474    public void setSetOperator(int setOperator) {
475        this.setOperator = setOperator;
476    }
477    public void setSetOperator(TSourceToken st1, TSourceToken st2)
478    {
479        if (st1.toString().equalsIgnoreCase("union")){
480            if (st2 == null){
481                this.setOperator = TSelectSqlStatement.setOperator_union;
482            }else if (st2.toString().equalsIgnoreCase("all")){
483                this.setOperator = TSelectSqlStatement.setOperator_unionall;
484            }else if (st2.toString().equalsIgnoreCase("distinct")){
485                this.setOperator = TSelectSqlStatement.SET_OPERATOR_UNIONDISTINCT;
486            }
487        }
488        else if (st1.toString().equalsIgnoreCase("intersect")){
489            if (st2 == null){
490                this.setOperator = TSelectSqlStatement.setOperator_intersect;
491            }else if (st2.toString().equalsIgnoreCase("all")){
492                this.setOperator = TSelectSqlStatement.setOperator_intersectall;
493            }else if (st2.toString().equalsIgnoreCase("distinct")){
494                this.setOperator = TSelectSqlStatement.SET_OPERATOR_INTERSECTDISTINCT;
495            }
496        }
497        else if (st1.toString().equalsIgnoreCase("minus")){
498            if (st2 == null){
499                this.setOperator = TSelectSqlStatement.setOperator_minus;
500            }else if (st2.toString().equalsIgnoreCase("all")){
501                this.setOperator = TSelectSqlStatement.setOperator_minusall;
502            }else if (st2.toString().equalsIgnoreCase("distinct")){
503                this.setOperator = TSelectSqlStatement.SET_OPERATOR_MINUSDISTINCT;
504            }
505        }
506        else if (st1.toString().equalsIgnoreCase("except")){
507            if (st2 == null){
508                this.setOperator = TSelectSqlStatement.setOperator_except;
509            }else if (st2.toString().equalsIgnoreCase("all")){
510                this.setOperator = TSelectSqlStatement.setOperator_exceptall;
511            }else if (st2.toString().equalsIgnoreCase("distinct")){
512                this.setOperator = TSelectSqlStatement.SET_OPERATOR_EXCEPTDISTINCT;
513            }
514        }
515    }
516
517    public TSelectSqlNode getLeftNode() {
518        return leftNode;
519    }
520
521    public TSelectSqlNode getRightNode() {
522        return rightNode;
523    }
524
525    public void init(Object arg1, Object arg2)
526    {
527        leftNode = (TSelectSqlNode)arg1;
528        rightNode = (TSelectSqlNode)arg2;
529    }
530
531    public boolean isCombinedQuery(){
532    // combine multiple queries using the set operators UNION, UNION ALL, INTERSECT, and MINUS.
533        return (setOperator > 0);
534    }
535
536    public TOrderBy getOrderbyClause() {
537        return orderbyClause;
538    }
539
540    private TOrderBy orderbyClause;
541
542    public void setOrderbyClause(TOrderBy orderbyClause) {
543        this.orderbyClause = orderbyClause;
544        if  (orderbyClause == null) return;
545
546        if (orderbyClause.getOffsetClause() != null ){ // 在 sqlserver yacc rule中, offset clause 先被挂在了order by clause 下
547            this.setOffsetClause(orderbyClause.getOffsetClause());
548        }
549        if (orderbyClause.getFetchFirstClause() != null){
550            this.setFetchFirstClause(orderbyClause.getFetchFirstClause());
551        }
552
553    }
554
555    public TForUpdate getForupdateClause() {
556        return forupdateClause;
557    }
558
559    private TForUpdate forupdateClause;
560
561    public void setForupdateClause(TParseTreeNode forupdateClause) {
562        if (forupdateClause instanceof TForUpdate){
563            this.forupdateClause = (TForUpdate) forupdateClause;
564        }else if (forupdateClause instanceof TForXMLClause){
565            this.forXMLClause = (TForXMLClause)forupdateClause;
566        }
567    }
568
569    public THierarchical getHierarchicalClause() {
570        return hierarchicalClause;
571    }
572
573    private THierarchical hierarchicalClause;
574
575    public void setHierarchicalClause(THierarchical hierarchicalClause) {
576        this.hierarchicalClause = hierarchicalClause;
577    }
578
579    public TGroupBy getGroupByClause() {
580        return groupByClause;
581    }
582
583    private TGroupBy groupByClause;
584
585    public void setGroupByClause(TGroupBy groupByClause) {
586        this.groupByClause = groupByClause;
587        if (groupByClause != null){
588            if ((groupByClause.getQualifyClause() != null)&&(this.getQualifyClause() == null)){
589                this.setQualifyClause(groupByClause.getQualifyClause());
590            }
591            if ((this.getHavingClause() != null)&&(this.groupByClause.getHavingClause() == null)){
592                this.groupByClause.setHavingClause(this.getHavingClause().getCondition());
593            }
594        }
595    }
596
597    private TIntoClause intoClause = null;
598
599    public void setIntoClause(TIntoClause intoClause) {
600        if (intoClause == null) return;
601        this.intoClause = intoClause;
602    }
603
604    public TIntoClause getIntoClause() {
605
606        return intoClause;
607    }
608
609    private TQualifyClause qualifyClause = null;
610
611    public void setQualifyClause(TQualifyClause qualifyClause) {
612        if (qualifyClause == null) return;
613        this.qualifyClause = qualifyClause;
614    }
615
616    public TQualifyClause getQualifyClause() {
617
618        return qualifyClause;
619    }
620
621    private TSampleClause sampleClause = null;
622
623    public void setSampleClause(TSampleClause sampleClause) {
624        this.sampleClause = sampleClause;
625    }
626
627    public TSampleClause getSampleClause() {
628
629        return sampleClause;
630    }
631
632    private TTeradataWithClause withClause = null;
633
634    public TTeradataWithClause getWithClause() {
635        return withClause;
636    }
637
638    public void setWithClause(TTeradataWithClause withClause) {
639
640        this.withClause = withClause;
641    }
642
643    private TLimitClause limitClause = null;
644
645    public void setLimitClause(TLimitClause limitClause) {
646        this.limitClause = limitClause;
647    }
648
649    public TLimitClause getLimitClause() {
650
651        return limitClause;
652    }
653
654    private TFetchFirstClause fetchFirstClause = null;
655
656    public void setFetchFirstClause(TFetchFirstClause fetchFirstClause) {
657        this.fetchFirstClause = fetchFirstClause;
658    }
659
660    public TFetchFirstClause getFetchFirstClause() {
661
662        return fetchFirstClause;
663    }
664
665    private TOptimizeForClause optimizeForClause = null;
666
667    public void setOptimizeForClause(TOptimizeForClause optimizeForClause) {
668        this.optimizeForClause = optimizeForClause;
669    }
670
671    public TOptimizeForClause getOptimizeForClause() {
672
673        return optimizeForClause;
674    }
675
676    private TIsolationClause isolationClause = null;
677
678    public void setIsolationClause(TIsolationClause isolationClause) {
679        this.isolationClause = isolationClause;
680    }
681
682    public TIsolationClause getIsolationClause() {
683        return isolationClause;
684    }
685
686    public void setValueClause(TValueClause valueClause) {
687        this.valueClause = valueClause;
688        this.setStartToken(valueClause);
689        this.setEndToken(valueClause);
690    }
691
692    public TValueClause getValueClause() {
693
694        return valueClause;
695    }
696
697    private TValueClause valueClause = null;
698
699    private TPTNodeList <TLockingClause> lockingClauses;
700
701    public TPTNodeList<TLockingClause> getLockingClauses() {
702        return lockingClauses;
703    }
704
705    public void setLockingClauses(TPTNodeList<TLockingClause> lockingClauses) {
706        this.lockingClauses = lockingClauses;
707    }
708
709//    private TSelectLimit selectLimit;
710//
711//    public void setSelectLimit(TSelectLimit selectLimit) {
712//        this.selectLimit = selectLimit;
713//    }
714//
715//    public TSelectLimit getSelectLimit() {
716//
717//        return selectLimit;
718//    }
719
720    private  TWindowClause  windowClause;
721
722    public void setWindowClause(TWindowClause windowClause) {
723        this.windowClause = windowClause;
724    }
725
726    public TWindowClause getWindowClause() {
727
728        return windowClause;
729    }
730
731    private TExpandOnClause expandOnClause;
732
733    public TExpandOnClause getExpandOnClause() {
734        return expandOnClause;
735    }
736
737    public void setExpandOnClause(TExpandOnClause expandOnClause) {
738
739        this.expandOnClause = expandOnClause;
740    }
741
742    public static void setFromList(ArrayList<TSelectSqlNode> selectSqlNode, TFromTableList fromTables){
743        for(int i=0;i<selectSqlNode.size();i++){
744            TSelectSqlNode select = selectSqlNode.get(i);
745            select.setFromTableList(fromTables);
746        }
747    }
748
749    private ArrayList<TSelectSqlNode> selectSqlNodes;
750
751    public ArrayList<TSelectSqlNode> getSelectSqlNodes() {
752        return selectSqlNodes;
753    }
754
755    public void setSelectSqlNodes(ArrayList<TSelectSqlNode> selectSqlNodes){
756        this.selectSqlNodes = selectSqlNodes;
757    }
758
759    public static TSelectSqlNode getFirstSelectSqlNode(ArrayList<TSelectSqlNode> selectSqlNodes){
760        return  selectSqlNodes.get(0);
761    }
762
763}