package org.araqne.logdb.query.parser;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.araqne.logdb.AbstractQueryCommandParser;
import org.araqne.logdb.QueryCommand;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.QueryErrorMessage;
import org.araqne.logdb.QueryParseException;
import org.araqne.logdb.query.command.ParseMap;
public class ParseMapParser extends AbstractQueryCommandParser {
public ParseMapParser() {
setDescriptions(
"If specified field's value is map type, then assign new fields using key/value of map. Otherwise, pass original tuples.",
"지정한 대상필드의 값이 맵 타입인 경우, 해당 맵의 모든 키/값을 새로운 필드로 할당합니다. 대상필드의 값이 null이거나 맵 타입이 아닌 경우, 원본 데이터를 그대로 전달합니다.");
setOptions("field", REQUIRED, "Specify parsing target field which contains value of map type.",
"맵을 포함하고 있는 파싱 대상 필드를 지정합니다.");
setOptions("overlay", OPTIONAL, "Use 't' to overlay original input data with extracted fields. "
+ "Otherwise, this command will pass only extracted fields.",
"t로 주면, 원본 필드에 맵에서 추출된 필드를 덧씌운 결과를 출력으로 내보냅니다. 별도로 overlay 옵션을 지정하지 않으면, 맵을 파싱한 결과만 출력으로 내보냅니다.");
}
@Override
public String getCommandName() {
return "parsemap";
}
@Override
public Map<String, QueryErrorMessage> getErrorMessages() {
Map<String, QueryErrorMessage> m = new HashMap<String, QueryErrorMessage>();
m.put("22100", new QueryErrorMessage("missing-parsemap-field", "필드를 입력하십시오."));
return m;
}
@SuppressWarnings("unchecked")
@Override
public QueryCommand parse(QueryContext context, String commandString) {
ParseResult r = QueryTokenizer.parseOptions(context, commandString, getCommandName().length(),
Arrays.asList("field", "overlay"), getFunctionRegistry());
Map<String, String> options = (Map<String, String>) r.value;
String field = options.get("field");
if (field == null)
// throw new QueryParseException("missing-parsemap-field", -1);
throw new QueryParseException("22100", -1, -1, null);
boolean overlay = CommandOptions.parseBoolean(options.get("overlay"));
return new ParseMap(field, overlay);
}
}