001package gudusoft.gsqlparser.nodes.functions;
002
003import gudusoft.gsqlparser.nodes.TParseTreeNode;
004import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
005import gudusoft.gsqlparser.ESqlClause;
006import gudusoft.gsqlparser.TCustomSqlStatement;
007import gudusoft.gsqlparser.nodes.TExpression;
008import gudusoft.gsqlparser.nodes.TObjectName;
009import gudusoft.gsqlparser.nodes.TResultColumnList;
010import gudusoft.gsqlparser.nodes.TSelectSqlNode;
011import gudusoft.gsqlparser.stmt.TSelectSqlStatement;
012
013
014public class TPredictArgument extends TParseTreeNode {
015    private TObjectName modelReference;  // For RW_MODEL model_reference
016
017    private TResultColumnList structColumns; // For RW_STRUCT '(' target_list ')'
018    private EArgumentType argumentType;   // To track which type of argument this is
019    private TObjectName tableReference;    // For RW_TABLE qualified_name
020    private TSelectSqlNode selectSqlNode;  // For select_with_parens
021    private TSelectSqlStatement selectSqlStatement;
022    private TExpression expression;        // For generic func_arg_expr
023
024    public enum EArgumentType {
025        MODEL,      // RW_MODEL model_reference
026        INPUT_DATA, // input_data
027        STRUCT      // RW_STRUCT '(' target_list ')'
028    }
029
030    public TSelectSqlStatement getSelectSqlStatement() {
031        return selectSqlStatement;
032    }
033
034    public TObjectName getTableReference() {
035        return tableReference;
036    }
037
038    public void init(Object arg1, Object arg2){
039        this.argumentType = (EArgumentType) arg1;
040        switch (this.argumentType) {
041            case MODEL:
042                this.modelReference = (TObjectName) arg2;
043                break;
044            case INPUT_DATA:
045                if (arg2 instanceof TObjectName) {
046                    this.tableReference = (TObjectName) arg2;
047                } else if (arg2 instanceof TSelectSqlNode) {
048                    this.selectSqlNode = (TSelectSqlNode) arg2;
049                } else if (arg2 instanceof TExpression) {
050                    this.expression = (TExpression) arg2;
051                }
052                break;
053            case STRUCT:
054                this.structColumns = (TResultColumnList) arg2;
055                break;
056        }
057    }
058
059     public void doParse(TCustomSqlStatement psql, ESqlClause plocation){
060        if (this.argumentType == EArgumentType.INPUT_DATA) {
061            if (this.tableReference != null) {
062                this.tableReference.doParse(psql, plocation);
063            } else if (this.selectSqlNode != null) {
064                selectSqlStatement = new TSelectSqlStatement(this.dbvendor);
065                selectSqlStatement.rootNode = this.selectSqlNode;
066                selectSqlStatement.doParseStatement(psql);
067            } else if (this.expression != null) {
068                this.expression.doParse(psql, plocation);
069            }
070        }
071    }
072    // Getters and setters
073    public TObjectName getModelReference() {
074        return modelReference;
075    }
076
077    public void setModelReference(TObjectName modelReference) {
078        this.modelReference = modelReference;
079        this.argumentType = EArgumentType.MODEL;
080    }
081
082
083    public TResultColumnList getStructColumns() {
084        return structColumns;
085    }
086
087    public void setStructColumns(TResultColumnList structColumns) {
088        this.structColumns = structColumns;
089        this.argumentType = EArgumentType.STRUCT;
090    }
091
092    public EArgumentType getArgumentType() {
093        return argumentType;
094    } 
095
096    public void accept(TParseTreeVisitor v){
097        v.preVisit(this);
098        v.postVisit(this);
099    }
100
101    public void acceptChildren(TParseTreeVisitor v) {
102        v.preVisit(this);
103        v.postVisit(this);
104    }    
105}