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}