package org.araqne.logdb.query.parser;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.araqne.logdb.AbstractQueryCommandParser;
import org.araqne.logdb.QueryCommand;
import org.araqne.logdb.QueryCommandHelp;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.query.command.ParseCsv;
public class ParseCsvParser extends AbstractQueryCommandParser {
public ParseCsvParser() {
setDescriptions("Divide a string into tokens based on the csv format and column names.",
"CSV 형식으로 구분된 각 토큰에 대하여 설정된 필드 이름들을 순서대로 적용하여 파싱합니다.");
setOptions("field", OPTIONAL, "Target field name", "파싱할 대상 필드 이름");
setOptions("overlay", OPTIONAL, "Return also original field (t or f)", "CSV로 파싱된 결과 외에 원본 필드 값도 포함할지 설정합니다. t 혹은 f");
setOptions("tab", OPTIONAL, "Use tab to delimiter. (t or f)", "CSV로 파싱된 결과 외에 원본 필드 값도 포함할지 설정합니다. t 혹은 f");
setUsages("parsecsv [overlay=t] [tab=t] [field=TARGET_FIELD] [FIELD_NAME1, FIELD_NAME2, ...]",
"parsecsv [overlay=t] [tab=t] [field=대상필드] [필드이름1, 필드이름2, ...]");
}
@Override
public String getCommandName() {
return "parsecsv";
}
@Override
public QueryCommandHelp getCommandHelp() {
return help;
}
@SuppressWarnings("unchecked")
@Override
public QueryCommand parse(QueryContext context, String commandString) {
ParseResult r = QueryTokenizer.parseOptions(context, commandString, getCommandName().length(),
Arrays.asList("field", "overlay", "tab"), getFunctionRegistry());
Map<String, String> options = (Map<String, String>) r.value;
String field = options.get("field");
if (field == null)
field = "line";
boolean overlay = CommandOptions.parseBoolean(options.get("overlay"));
boolean useTab = CommandOptions.parseBoolean(options.get("tab"));
String nameField = commandString.substring(r.next).trim();
List<String> fieldNames = null;
if (!nameField.isEmpty()) {
fieldNames = new ArrayList<String>();
for (String fieldName : nameField.split(",")) {
fieldNames.add(fieldName.trim());
}
}
return new ParseCsv(field, overlay, useTab, fieldNames);
}
}