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    private boolean setOperatorByName = false;
474
475    public void setSetOperator(int setOperator) {
476        this.setOperator = setOperator;
477    }
478
479    /**
480     * Returns true if the set operator uses BY NAME matching (Snowflake).
481     * When BY NAME is used, columns are matched by their names rather than positions.
482     */
483    public boolean isSetOperatorByName() {
484        return setOperatorByName;
485    }
486
487    /**
488     * Sets whether the set operator uses BY NAME matching.
489     */
490    public void setSetOperatorByName(boolean byName) {
491        this.setOperatorByName = byName;
492    }
493
494    public void setSetOperator(TSourceToken st1, TSourceToken st2)
495    {
496        if (st1.toString().equalsIgnoreCase("union")){
497            if (st2 == null){
498                this.setOperator = TSelectSqlStatement.setOperator_union;
499            }else if (st2.toString().equalsIgnoreCase("all")){
500                this.setOperator = TSelectSqlStatement.setOperator_unionall;
501            }else if (st2.toString().equalsIgnoreCase("distinct")){
502                this.setOperator = TSelectSqlStatement.SET_OPERATOR_UNIONDISTINCT;
503            }
504        }
505        else if (st1.toString().equalsIgnoreCase("intersect")){
506            if (st2 == null){
507                this.setOperator = TSelectSqlStatement.setOperator_intersect;
508            }else if (st2.toString().equalsIgnoreCase("all")){
509                this.setOperator = TSelectSqlStatement.setOperator_intersectall;
510            }else if (st2.toString().equalsIgnoreCase("distinct")){
511                this.setOperator = TSelectSqlStatement.SET_OPERATOR_INTERSECTDISTINCT;
512            }
513        }
514        else if (st1.toString().equalsIgnoreCase("minus")){
515            if (st2 == null){
516                this.setOperator = TSelectSqlStatement.setOperator_minus;
517            }else if (st2.toString().equalsIgnoreCase("all")){
518                this.setOperator = TSelectSqlStatement.setOperator_minusall;
519            }else if (st2.toString().equalsIgnoreCase("distinct")){
520                this.setOperator = TSelectSqlStatement.SET_OPERATOR_MINUSDISTINCT;
521            }
522        }
523        else if (st1.toString().equalsIgnoreCase("except")){
524            if (st2 == null){
525                this.setOperator = TSelectSqlStatement.setOperator_except;
526            }else if (st2.toString().equalsIgnoreCase("all")){
527                this.setOperator = TSelectSqlStatement.setOperator_exceptall;
528            }else if (st2.toString().equalsIgnoreCase("distinct")){
529                this.setOperator = TSelectSqlStatement.SET_OPERATOR_EXCEPTDISTINCT;
530            }
531        }
532    }
533
534    public TSelectSqlNode getLeftNode() {
535        return leftNode;
536    }
537
538    public TSelectSqlNode getRightNode() {
539        return rightNode;
540    }
541
542    public void init(Object arg1, Object arg2)
543    {
544        leftNode = (TSelectSqlNode)arg1;
545        rightNode = (TSelectSqlNode)arg2;
546    }
547
548    public boolean isCombinedQuery(){
549    // combine multiple queries using the set operators UNION, UNION ALL, INTERSECT, and MINUS.
550        return (setOperator > 0);
551    }
552
553    public TOrderBy getOrderbyClause() {
554        return orderbyClause;
555    }
556
557    private TOrderBy orderbyClause;
558
559    public void setOrderbyClause(TOrderBy orderbyClause) {
560        this.orderbyClause = orderbyClause;
561        if  (orderbyClause == null) return;
562
563        if (orderbyClause.getOffsetClause() != null ){ // 在 sqlserver yacc rule中, offset clause 先被挂在了order by clause 下
564            this.setOffsetClause(orderbyClause.getOffsetClause());
565        }
566        if (orderbyClause.getFetchFirstClause() != null){
567            this.setFetchFirstClause(orderbyClause.getFetchFirstClause());
568        }
569
570    }
571
572    public TForUpdate getForupdateClause() {
573        return forupdateClause;
574    }
575
576    private TForUpdate forupdateClause;
577
578    public void setForupdateClause(TParseTreeNode forupdateClause) {
579        if (forupdateClause instanceof TForUpdate){
580            this.forupdateClause = (TForUpdate) forupdateClause;
581        }else if (forupdateClause instanceof TForXMLClause){
582            this.forXMLClause = (TForXMLClause)forupdateClause;
583        }
584    }
585
586    public THierarchical getHierarchicalClause() {
587        return hierarchicalClause;
588    }
589
590    private THierarchical hierarchicalClause;
591
592    public void setHierarchicalClause(THierarchical hierarchicalClause) {
593        this.hierarchicalClause = hierarchicalClause;
594    }
595
596    public TGroupBy getGroupByClause() {
597        return groupByClause;
598    }
599
600    private TGroupBy groupByClause;
601
602    public void setGroupByClause(TGroupBy groupByClause) {
603        this.groupByClause = groupByClause;
604        if (groupByClause != null){
605            if ((groupByClause.getQualifyClause() != null)&&(this.getQualifyClause() == null)){
606                this.setQualifyClause(groupByClause.getQualifyClause());
607            }
608            if ((this.getHavingClause() != null)&&(this.groupByClause.getHavingClause() == null)){
609                this.groupByClause.setHavingClause(this.getHavingClause().getCondition());
610            }
611        }
612    }
613
614    private TIntoClause intoClause = null;
615
616    public void setIntoClause(TIntoClause intoClause) {
617        if (intoClause == null) return;
618        this.intoClause = intoClause;
619    }
620
621    public TIntoClause getIntoClause() {
622
623        return intoClause;
624    }
625
626    private TQualifyClause qualifyClause = null;
627
628    public void setQualifyClause(TQualifyClause qualifyClause) {
629        if (qualifyClause == null) return;
630        this.qualifyClause = qualifyClause;
631    }
632
633    public TQualifyClause getQualifyClause() {
634
635        return qualifyClause;
636    }
637
638    private TSampleClause sampleClause = null;
639
640    public void setSampleClause(TSampleClause sampleClause) {
641        this.sampleClause = sampleClause;
642    }
643
644    public TSampleClause getSampleClause() {
645
646        return sampleClause;
647    }
648
649    private TTeradataWithClause withClause = null;
650
651    public TTeradataWithClause getWithClause() {
652        return withClause;
653    }
654
655    public void setWithClause(TTeradataWithClause withClause) {
656
657        this.withClause = withClause;
658    }
659
660    private TLimitClause limitClause = null;
661
662    public void setLimitClause(TLimitClause limitClause) {
663        this.limitClause = limitClause;
664    }
665
666    public TLimitClause getLimitClause() {
667
668        return limitClause;
669    }
670
671    private TFetchFirstClause fetchFirstClause = null;
672
673    public void setFetchFirstClause(TFetchFirstClause fetchFirstClause) {
674        this.fetchFirstClause = fetchFirstClause;
675    }
676
677    public TFetchFirstClause getFetchFirstClause() {
678
679        return fetchFirstClause;
680    }
681
682    private TOptimizeForClause optimizeForClause = null;
683
684    public void setOptimizeForClause(TOptimizeForClause optimizeForClause) {
685        this.optimizeForClause = optimizeForClause;
686    }
687
688    public TOptimizeForClause getOptimizeForClause() {
689
690        return optimizeForClause;
691    }
692
693    private TIsolationClause isolationClause = null;
694
695    public void setIsolationClause(TIsolationClause isolationClause) {
696        this.isolationClause = isolationClause;
697    }
698
699    public TIsolationClause getIsolationClause() {
700        return isolationClause;
701    }
702
703    public void setValueClause(TValueClause valueClause) {
704        this.valueClause = valueClause;
705        this.setStartToken(valueClause);
706        this.setEndToken(valueClause);
707    }
708
709    public TValueClause getValueClause() {
710
711        return valueClause;
712    }
713
714    private TValueClause valueClause = null;
715
716    private TPTNodeList <TLockingClause> lockingClauses;
717
718    public TPTNodeList<TLockingClause> getLockingClauses() {
719        return lockingClauses;
720    }
721
722    public void setLockingClauses(TPTNodeList<TLockingClause> lockingClauses) {
723        this.lockingClauses = lockingClauses;
724    }
725
726//    private TSelectLimit selectLimit;
727//
728//    public void setSelectLimit(TSelectLimit selectLimit) {
729//        this.selectLimit = selectLimit;
730//    }
731//
732//    public TSelectLimit getSelectLimit() {
733//
734//        return selectLimit;
735//    }
736
737    private  TWindowClause  windowClause;
738
739    public void setWindowClause(TWindowClause windowClause) {
740        this.windowClause = windowClause;
741    }
742
743    public TWindowClause getWindowClause() {
744
745        return windowClause;
746    }
747
748    private TExpandOnClause expandOnClause;
749
750    public TExpandOnClause getExpandOnClause() {
751        return expandOnClause;
752    }
753
754    public void setExpandOnClause(TExpandOnClause expandOnClause) {
755
756        this.expandOnClause = expandOnClause;
757    }
758
759    public static void setFromList(ArrayList<TSelectSqlNode> selectSqlNode, TFromTableList fromTables){
760        for(int i=0;i<selectSqlNode.size();i++){
761            TSelectSqlNode select = selectSqlNode.get(i);
762            select.setFromTableList(fromTables);
763        }
764    }
765
766    private ArrayList<TSelectSqlNode> selectSqlNodes;
767
768    public ArrayList<TSelectSqlNode> getSelectSqlNodes() {
769        return selectSqlNodes;
770    }
771
772    public void setSelectSqlNodes(ArrayList<TSelectSqlNode> selectSqlNodes){
773        this.selectSqlNodes = selectSqlNodes;
774    }
775
776    public static TSelectSqlNode getFirstSelectSqlNode(ArrayList<TSelectSqlNode> selectSqlNodes){
777        return  selectSqlNodes.get(0);
778    }
779
780}