}
};
// The ArgumentCompletor allows us to match multiple tokens
// in the same line.
final ArgumentCompletor ac = new ArgumentCompletor(sc, delim);
// By default ArgumentCompletor is in "strict" mode meaning
// a token is only auto-completed if all prior tokens
// match. We don't want that since there are valid tokens
// that are not in our wordlist (eg. table and column names)
ac.setStrict(false);
// ArgumentCompletor always adds a space after a matched token.
// This is undesirable for function names because a space after
// the opening parenthesis is unnecessary (and uncommon) in Hive.
// We stack a custom Completor on top of our ArgumentCompletor
// to reverse this.
Completor completor = new Completor () {
@Override
public int complete (String buffer, int offset, List completions) {
List<String> comp = completions;
int ret = ac.complete(buffer, offset, completions);
// ConsoleReader will do the substitution if and only if there
// is exactly one valid completion, so we ignore other cases.
if (completions.size() == 1) {
if (comp.get(0).endsWith("( ")) {
comp.set(0, comp.get(0).trim());
}
}
return ret;
}
};
HiveConf.ConfVars[] confs = HiveConf.ConfVars.values();
String[] vars = new String[confs.length];
for (int i = 0; i < vars.length; i++) {
vars[i] = confs[i].varname;
}
SimpleCompletor conf = new SimpleCompletor(vars);
conf.setDelimiter(".");
SimpleCompletor set = new SimpleCompletor("set") {
@Override
public int complete(String buffer, int cursor, List clist) {
return buffer != null && buffer.equals("set") ? super.complete(buffer, cursor, clist) : -1;
}
};
ArgumentCompletor propCompletor = new ArgumentCompletor(new Completor[]{set, conf}) {
@Override
@SuppressWarnings("unchecked")
public int complete(String buffer, int offset, List completions) {
int ret = super.complete(buffer, offset, completions);
if (completions.size() == 1) {