001package gudusoft.gsqlparser.stmt.teradata;
002
003import gudusoft.gsqlparser.EDbVendor;
004import gudusoft.gsqlparser.ESqlStatementType;
005import gudusoft.gsqlparser.TCustomSqlStatement;
006import gudusoft.gsqlparser.nodes.TParseTreeVisitor;
007
008public class TTeradataMultiLoadImport extends TCustomSqlStatement {
009    public TTeradataMultiLoadImport(EDbVendor dbvendor) {
010        super(dbvendor);
011        sqlstatementtype = ESqlStatementType.sstteradataMultiLoadImport;
012    }
013
014    private String infile;
015    private String format;
016    private String layout;
017    private String apply;
018    private Integer skip;
019    private Integer checkpoint;
020    private Integer sessions;
021    private String indicators;
022
023    // Getters and setters
024    public String getInfile() { return infile; }
025    public String getFormat() { return format; }
026    public String getLayout() { return layout; }
027    public String getApply() { return apply; }
028    public Integer getSkip() { return skip; }
029    public Integer getCheckpoint() { return checkpoint; }
030    public Integer getSessions() { return sessions; }
031    public String getIndicators() { return indicators; }
032
033    @Override
034    public String toString() {
035        return String.format("ImportCommand{infile='%s', format='%s', layout='%s', " +
036                        "apply='%s', skip=%d, checkpoint=%s, sessions=%s, indicators='%s'}",
037                infile, format, layout, apply, skip,
038                checkpoint != null ? checkpoint : "null",
039                sessions != null ? sessions : "null",
040                indicators);
041    }
042
043    public void setCommand(String command) {
044        this.command = command;
045    }
046
047    private String command;
048
049public void parseImportCommand( ){
050
051    // Remove leading/trailing whitespace and ensure command starts with .IMPORT
052    String originalCommand = command.trim();
053    String upperCommand = originalCommand.toUpperCase();
054    if (!upperCommand.startsWith(".IMPORT")) {
055        throw new IllegalArgumentException("Command must start with .IMPORT");
056    }
057
058    // Split the command into words, preserving quoted strings
059    String[] parts = originalCommand.substring(7).split("(?=\\s+(?:[^']*'[^']*')*[^']*$)");
060
061    for (int i = 0; i < parts.length; i++) {
062        String part = parts[i].trim();
063        String upperPart = part.toUpperCase();
064        if (part.isEmpty()) continue;
065
066        if (upperPart.startsWith("INFILE")) {
067            // Extract filename between quotes
068            this.infile = extractQuotedString(parts[++i].trim());
069        } else if (upperPart.startsWith("FORMAT")) {
070            // Next word should be VARTEXT, FIXEDTEXT, or BINARY
071            if (i + 1 < parts.length) {
072                this.format = parts[++i].trim();
073            }
074        } else if (upperPart.startsWith("LAYOUT")) {
075            if (i + 1 < parts.length) {
076                this.layout = parts[++i].trim();
077            }
078        } else if (upperPart.startsWith("APPLY")) {
079            if (i + 1 < parts.length) {
080                this.apply = parts[++i].trim();
081            }
082        } else if (upperPart.startsWith("SKIP")) {
083            if (i + 1 < parts.length) {
084                this.skip = Integer.parseInt(parts[++i].trim());
085            }
086        } else if (upperPart.startsWith("CHECKPOINT")) {
087            if (i + 1 < parts.length) {
088                this.checkpoint = Integer.parseInt(parts[++i].trim());
089            }
090        } else if (upperPart.startsWith("SESSIONS")) {
091            if (i + 1 < parts.length) {
092                this.sessions = Integer.parseInt(parts[++i].trim());
093            }
094        } else if (upperPart.startsWith("INDICATORS")) {
095            if (i + 1 < parts.length) {
096                this.indicators = parts[++i].trim();
097            }
098        }
099    }
100
101    // Validate required fields
102    if (this.infile == null) {
103        throw new IllegalArgumentException("INFILE is required");
104    }
105
106}
107
108private static String extractQuotedString(String text) {
109    int start = text.indexOf('\'');
110    int end = text.lastIndexOf('\'');
111    if (start >= 0 && end > start) {
112        return text.substring(start + 1, end);
113    }
114    // If no quotes found, return the text after INFILE
115    return text.substring(text.indexOf("INFILE") + 6).trim();
116}
117
118
119
120public void accept(TParseTreeVisitor v){
121        v.preVisit(this);
122        v.postVisit(this);
123    }
124
125public void acceptChildren(TParseTreeVisitor v){
126    v.preVisit(this);
127    v.postVisit(this);
128}
129
130}