001package gudusoft.gsqlparser.nodes;
002/*
003 * Date: 2010-9-25
004 * Time: 17:18:03
005 */
006
007
008import gudusoft.gsqlparser.*;
009
010import java.util.HashMap;
011import java.util.Map;
012
013/**
014 *  datatype attributes supported in various databases.
015 *  method {@link #getValue_identifier()} returns a identifier value,
016 *  mehtod {@link #getValue_literal()} return a value in type {@link TConstant}
017 */
018public class TDatatypeAttribute extends TParseTreeNode {
019
020    private static Map<String, EDataTypeAttribute> dataTypeAttributeMap = new HashMap<String, EDataTypeAttribute>( );
021
022    public static EDataTypeAttribute searchDataTypeAttributeByName(TSourceToken st1, TSourceToken st2){
023
024        String lcstr = st1.toString();
025        if ((st1.tokencode == TBaseType.rrw_not)||(st1.tokencode == TBaseType.rw_not1) // not null, not casespecific
026                ||(st1.tokencode == TBaseType.rrw_with) // with default, with time zone
027        ){
028            // data attribute include more than one keyword, concate the first 2 keywords
029            if (st2 != null){
030                lcstr = lcstr+"_"+st2.toString();
031            }else{
032                lcstr = lcstr+"_";
033            }
034        }
035        return searchDataTypeAttributeByName(lcstr);
036    }
037
038    public static EDataTypeAttribute searchDataTypeAttributeByName(String typenameStr){
039
040        if (dataTypeAttributeMap.size() == 0){
041            dataTypeAttributeMap.put("not_null", EDataTypeAttribute.not_null_t);
042            dataTypeAttributeMap.put("uppercase", EDataTypeAttribute.uppercase_t);
043            dataTypeAttributeMap.put("casespecific", EDataTypeAttribute.casespecific_t);
044            dataTypeAttributeMap.put("not_casespecific", EDataTypeAttribute.not_casespecific_t);
045            dataTypeAttributeMap.put("format", EDataTypeAttribute.format_t);
046            dataTypeAttributeMap.put("title", EDataTypeAttribute.title_t);
047            dataTypeAttributeMap.put("named", EDataTypeAttribute.named_t);
048            dataTypeAttributeMap.put("default", EDataTypeAttribute.default_t);
049            dataTypeAttributeMap.put("with_default", EDataTypeAttribute.with_default_t);
050            dataTypeAttributeMap.put("with_time", EDataTypeAttribute.with_time_zone_t);
051            dataTypeAttributeMap.put("character_set", EDataTypeAttribute.character_set_t);
052            dataTypeAttributeMap.put("uc", EDataTypeAttribute.uppercase_t);
053            dataTypeAttributeMap.put("cs", EDataTypeAttribute.casespecific_t);
054            dataTypeAttributeMap.put("not_cs", EDataTypeAttribute.not_cs_t);
055//            dataTypeAttributeMap.put("as_transactiontime", EDataTypeAttribute.as_transactiontime_t);
056//            dataTypeAttributeMap.put("as_validtime", EDataTypeAttribute.as_validtime_t);
057//            dataTypeAttributeMap.put("as_deferred", EDataTypeAttribute.as_deferred_t);
058        }
059
060        return dataTypeAttributeMap.get(typenameStr.toLowerCase());
061    }
062
063
064    private  EDataTypeAttribute attributeType = EDataTypeAttribute.unknown_t;
065
066    public void setAttributeType(EDataTypeAttribute attributeType) {
067        this.attributeType = attributeType;
068    }
069
070    public EDataTypeAttribute getAttributeType() {
071
072        return attributeType;
073    }
074
075    private String attributeValue;
076
077    public String getAttributeValue() {
078        return attributeValue;
079    }
080
081    public void init(Object arg1){
082        attributeType = (EDataTypeAttribute)arg1;
083    }
084
085    private TObjectName value_identifier;
086    private TConstant value_literal;
087    private TExpressionList value_list;
088
089    public TExpressionList getValue_list() {
090        return value_list;
091    }
092
093    public TConstant getValue_literal() {
094        return value_literal;
095    }
096
097    public TObjectName getValue_identifier() {
098        return value_identifier;
099    }
100
101    private TExpression defaultValue;
102
103    public TExpression getDefaultValue() {
104        return defaultValue;
105    }
106
107    private TObjectName namedName;
108
109    public TObjectName getNamedName() {
110        return namedName;
111    }
112
113    public void init(Object arg1, Object arg2){
114        init(arg1);
115        switch (attributeType){
116            case default_value_t:
117                this.defaultValue = (TExpression)arg2;
118                break;
119            case named_t:
120                this.namedName = (TObjectName)arg2;
121                this.namedName.setDbObjectType(EDbObjectType.column_alias);
122                break;
123            default:
124                break;
125        }
126//        if (arg2 instanceof TObjectName) {
127//            value_identifier = (TObjectName)arg2;
128//            attributeValue = value_identifier.toString();
129//        }else if (arg2 instanceof TConstant){
130//            value_literal = (TConstant)arg2;
131//            attributeValue = value_literal.toString();
132//        }else if (arg2 instanceof TExpressionList){
133//            value_list = (TExpressionList)arg2;
134//        }
135    }
136
137    public static void setDataTypeAttributeMap(Map<String, EDataTypeAttribute> dataTypeAttributeMap) {
138        TDatatypeAttribute.dataTypeAttributeMap = dataTypeAttributeMap;
139    }
140
141    public void setAttributeValue(String attributeValue) {
142        this.attributeValue = attributeValue;
143    }
144
145    public void setValue_identifier(TObjectName value_identifier) {
146        this.value_identifier = value_identifier;
147    }
148
149    public void setValue_literal(TConstant value_literal) {
150        this.value_literal = value_literal;
151    }
152
153    public void setValue_list(TExpressionList value_list) {
154        this.value_list = value_list;
155    }
156
157    public void accept(TParseTreeVisitor v){
158        v.preVisit(this);
159        v.postVisit(this);
160    }
161
162    public void acceptChildren(TParseTreeVisitor v){
163        v.preVisit(this);
164        v.postVisit(this);
165    }
166}