001package gudusoft.gsqlparser.nodes.teradata;
002/*
003 * Date: 13-8-27
004 */
005
006import gudusoft.gsqlparser.ESqlClause;
007import gudusoft.gsqlparser.TCustomSqlStatement;
008import gudusoft.gsqlparser.nodes.*;
009
010import java.util.ArrayList;
011
012/**
013 * index option used in teradata create table statement
014 */
015public class TIndexDefinition extends TParseTreeNode {
016    public enum EIndexType {primaryKey,uniquePrimaryKey,noPrimaryKey,primaryAmp,partitionBy,uniqueKey,index,uniqueIndex,
017        noPrimaryIndex,uniquePrimaryIndex,primaryIndex};
018    private EIndexType indexType;
019
020    public EIndexType getIndexType() {
021        return indexType;
022    }
023
024    private TObjectName indexName;
025    private boolean unique;
026    private boolean primary;
027    private boolean all;
028    private TObjectNameList  indexColumns;
029    private ArrayList<TPartitioningLevel> partitioningLevels;
030
031
032    public ArrayList<TPartitioningLevel> getPartitioningLevels() {
033        return partitioningLevels;
034    }
035
036    public void setUnique(boolean unique) {
037        this.unique = unique;
038    }
039
040//    public void setPartitionExprList(TExpressionList partitionExprList) {
041//        this.partitionExprList = partitionExprList;
042//    }
043
044    public void setPrimary(boolean primary) {
045
046        this.primary = primary;
047    }
048
049    public void setOrderColumnName(TObjectName orderColumnName) {
050        this.orderColumnName = orderColumnName;
051    }
052
053    private TExpressionList partitionExprList;
054    private TObjectName orderColumnName;
055
056    public void setAll(boolean all) {
057        this.all = all;
058    }
059
060    public void init(Object arg1){
061        indexType = (EIndexType)arg1;
062    }
063
064
065    public void init(Object arg1,Object arg2){
066        init(arg1);
067        switch (indexType){
068            case partitionBy:
069                if (arg2 instanceof TPartitioningLevel){
070                    this.partitioningLevels = new ArrayList<TPartitioningLevel>();
071                    this.partitioningLevels.add((TPartitioningLevel)arg2);
072                }else{
073                    this.partitioningLevels = (ArrayList<TPartitioningLevel>)arg2;
074                }
075                break;
076            default:
077                indexColumns = (TObjectNameList)arg2;
078                break;
079        }
080
081    }
082
083    public void init(Object arg1,Object arg2,Object arg3){
084        init(arg1,arg2);
085        indexName   = (TObjectName)arg3;
086    }
087
088    public boolean isAll() {
089        return all;
090    }
091
092    public TObjectNameList getIndexColumns() {
093        return indexColumns;
094    }
095
096    public TObjectName getIndexName() {
097        return indexName;
098    }
099
100    public TObjectName getOrderColumnName() {
101        return orderColumnName;
102    }
103
104    /**
105     * @deprecated since v2.6.0.5, please use {@link #getPartitioningLevels()} instead
106     * @return
107     */
108    public TExpressionList getPartitionExprList() {
109        return partitionExprList;
110    }
111
112    public boolean isPrimary() {
113        return primary;
114    }
115
116    public boolean isUnique() {
117        return unique;
118    }
119
120    public void accept(TParseTreeVisitor v){
121        v.preVisit(this);
122        v.postVisit(this);
123    }
124
125    public void acceptChildren(TParseTreeVisitor v){
126        v.preVisit(this);
127        v.postVisit(this);
128    }
129
130    public void setIndexName(TObjectName indexName) {
131        this.indexName = indexName;
132    }
133
134    public void setIndexColumns(TObjectNameList indexColumns) {
135        this.indexColumns = indexColumns;
136    }
137
138    public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
139        if(partitionExprList != null){
140            for(int i=0;i<partitionExprList.size();i++){
141                if (i == 0) continue; // the first element is COLUMN keyword.
142                partitionExprList.getExpression(i).doParse(psql,plocation);
143            }
144        }
145    }
146}