001package gudusoft.gsqlparser.nodes;
002
003import gudusoft.gsqlparser.*;
004import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
005
006/**
007 * Oracle 26 FOR LOOP iteration control.
008 * Represents a single iteration control in a FOR LOOP, supporting:
009 * - Range iteration: lower_bound..upper_bound [BY step]
010 * - REVERSE range iteration: REVERSE lower_bound..upper_bound [BY step]
011 * - VALUES OF collection
012 * - INDICES OF collection
013 * - EXECUTE IMMEDIATE dynamic SQL
014 * - REPEAT single expression control
015 *
016 * Multiple iteration controls can be combined in a single FOR LOOP:
017 * FOR i IN 1..3, REVERSE i+1..i+10, 51..55 LOOP ... END LOOP;
018 */
019public class TIterationControl extends TParseTreeNode {
020
021    public static final int RANGE = 1;
022    public static final int VALUES_OF = 2;
023    public static final int INDICES_OF = 3;
024    public static final int EXECUTE_IMMEDIATE = 4;
025    public static final int REPEAT_EXPR = 5;
026    public static final int CURSOR = 6;
027    public static final int SINGLE_EXPR = 7;
028    public static final int PAIRS_OF = 8;
029
030    private int controlType = RANGE;
031    private boolean isReverse = false;
032
033    // For range iteration: lower_bound..upper_bound
034    private TExpression lowerBound;
035    private TExpression upperBound;
036
037    // For BY step clause
038    private TExpression stepExpression;
039
040    // For VALUES OF / INDICES OF collection reference
041    private TObjectName collectionRef;
042
043    // For EXECUTE IMMEDIATE
044    private TExpression executeExpr;
045    private TExpressionList executeUsingVars;
046
047    // For REPEAT single expression
048    private TExpression repeatExpr;
049
050    // For WHILE/WHEN predicates on this specific iteration control
051    private TExpression whilePredicate;
052    private TExpression whenPredicate;
053
054    // For cursor FOR LOOP
055    private TSelectSqlStatement subquery;
056    private TObjectName cursorName;
057    private TExpressionList cursorParameterNames;
058
059    public TIterationControl() {
060    }
061
062    public void init(Object arg1) {
063        // Used for simple initializations
064    }
065
066    public int getControlType() {
067        return controlType;
068    }
069
070    public void setControlType(int controlType) {
071        this.controlType = controlType;
072    }
073
074    public boolean isReverse() {
075        return isReverse;
076    }
077
078    public void setReverse(boolean reverse) {
079        isReverse = reverse;
080    }
081
082    public TExpression getLowerBound() {
083        return lowerBound;
084    }
085
086    public void setLowerBound(TExpression lowerBound) {
087        this.lowerBound = lowerBound;
088    }
089
090    public TExpression getUpperBound() {
091        return upperBound;
092    }
093
094    public void setUpperBound(TExpression upperBound) {
095        this.upperBound = upperBound;
096    }
097
098    public TExpression getStepExpression() {
099        return stepExpression;
100    }
101
102    public void setStepExpression(TExpression stepExpression) {
103        this.stepExpression = stepExpression;
104    }
105
106    public TObjectName getCollectionRef() {
107        return collectionRef;
108    }
109
110    public void setCollectionRef(TObjectName collectionRef) {
111        this.collectionRef = collectionRef;
112    }
113
114    public TExpression getExecuteExpr() {
115        return executeExpr;
116    }
117
118    public void setExecuteExpr(TExpression executeExpr) {
119        this.executeExpr = executeExpr;
120    }
121
122    public TExpressionList getExecuteUsingVars() {
123        return executeUsingVars;
124    }
125
126    public void setExecuteUsingVars(TExpressionList executeUsingVars) {
127        this.executeUsingVars = executeUsingVars;
128    }
129
130    public TExpression getRepeatExpr() {
131        return repeatExpr;
132    }
133
134    public void setRepeatExpr(TExpression repeatExpr) {
135        this.repeatExpr = repeatExpr;
136    }
137
138    public TExpression getWhilePredicate() {
139        return whilePredicate;
140    }
141
142    public void setWhilePredicate(TExpression whilePredicate) {
143        this.whilePredicate = whilePredicate;
144    }
145
146    public TExpression getWhenPredicate() {
147        return whenPredicate;
148    }
149
150    public void setWhenPredicate(TExpression whenPredicate) {
151        this.whenPredicate = whenPredicate;
152    }
153
154    public TSelectSqlStatement getSubquery() {
155        return subquery;
156    }
157
158    public void setSubquery(TSelectSqlStatement subquery) {
159        this.subquery = subquery;
160    }
161
162    public TObjectName getCursorName() {
163        return cursorName;
164    }
165
166    public void setCursorName(TObjectName cursorName) {
167        this.cursorName = cursorName;
168    }
169
170    public TExpressionList getCursorParameterNames() {
171        return cursorParameterNames;
172    }
173
174    public void setCursorParameterNames(TExpressionList cursorParameterNames) {
175        this.cursorParameterNames = cursorParameterNames;
176    }
177
178    public void accept(TParseTreeVisitor v) {
179        v.preVisit(this);
180        v.postVisit(this);
181    }
182
183    public void acceptChildren(TParseTreeVisitor v) {
184        v.preVisit(this);
185        if (lowerBound != null) lowerBound.acceptChildren(v);
186        if (upperBound != null) upperBound.acceptChildren(v);
187        if (stepExpression != null) stepExpression.acceptChildren(v);
188        if (executeExpr != null) executeExpr.acceptChildren(v);
189        if (executeUsingVars != null) executeUsingVars.acceptChildren(v);
190        if (repeatExpr != null) repeatExpr.acceptChildren(v);
191        if (whilePredicate != null) whilePredicate.acceptChildren(v);
192        if (whenPredicate != null) whenPredicate.acceptChildren(v);
193        if (subquery != null) subquery.acceptChildren(v);
194        v.postVisit(this);
195    }
196}