diff --git cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java index aec5018..8a65ece 100644 --- cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java +++ cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java @@ -29,9 +29,14 @@ import java.io.UnsupportedEncodingException; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import com.google.common.base.Splitter; import jline.console.ConsoleReader; import jline.console.completer.Completer; import jline.console.history.FileHistory; @@ -53,6 +58,7 @@ import org.apache.hadoop.hive.common.io.CachingPrintStream; import org.apache.hadoop.hive.common.io.FetchConverter; import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.conf.Validator; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.ql.CommandNeedRetryException; import org.apache.hadoop.hive.ql.Driver; @@ -538,16 +544,48 @@ public int complete (String buffer, int offset, List completions) { } }; - 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; + List vars = new ArrayList(); + for (HiveConf.ConfVars conf : HiveConf.ConfVars.values()) { + vars.add(conf.varname); } - ArgumentCompleter.ArgumentDelimiter delimiter = new ArgumentCompleter.AbstractArgumentDelimiter() { + + StringsCompleter confCompleter = new StringsCompleter(vars) { @Override - public boolean isDelimiterChar(CharSequence buffer, int pos) { - char c = buffer.charAt(pos); - return c == '.'; + public int complete(final String buffer, final int cursor, final List clist) { + int result = super.complete(buffer, cursor, clist); + if (clist.isEmpty() && cursor > 1 && buffer.charAt(cursor - 1) == '=') { + HiveConf.ConfVars var = HiveConf.getConfVars(buffer.substring(0, cursor - 1)); + if (var == null) { + return result; + } + if (var.getValidator() instanceof Validator.StringSet) { + Validator.StringSet validator = (Validator.StringSet)var.getValidator(); + clist.addAll(validator.getExpected()); + } else if (var.getValidator() != null) { + clist.addAll(Arrays.asList(var.getValidator().toDescription(), "")); + } else { + clist.addAll(Arrays.asList("Expects " + var.typeString() + " type value", "")); + } + return cursor; + } + if (clist.size() > 10) { + Set delimited = new LinkedHashSet(); + for (CharSequence candidate : clist) { + Iterator it = Splitter.on(".").split( + candidate.subSequence(cursor, candidate.length())).iterator(); + if (it.hasNext()) { + String next = it.next(); + if (next.isEmpty()) { + next = "."; + } + candidate = buffer != null ? buffer.substring(0, cursor) + next : next; + } + delimited.add(candidate); + } + clist.clear(); + clist.addAll(delimited); + } + return result; } }; @@ -558,9 +596,7 @@ public int complete(String buffer, int cursor, List clist) { } }; - ArgumentCompleter confCompleter = new ArgumentCompleter(delimiter, setCompleter); - - ArgumentCompleter propCompleter = new ArgumentCompleter(new Completer[]{setCompleter, confCompleter}) { + ArgumentCompleter propCompleter = new ArgumentCompleter(setCompleter, confCompleter) { @Override @SuppressWarnings("unchecked") public int complete(String buffer, int offset, List completions) { diff --git common/src/java/org/apache/hadoop/hive/conf/HiveConf.java common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index 2e2bf5a..f740b3b 100644 --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -2049,6 +2049,10 @@ public boolean isType(String value) { return valType.isType(value); } + public Validator getValidator() { + return validator; + } + public String validate(String value) { return validator == null ? null : validator.validate(value); } diff --git common/src/java/org/apache/hadoop/hive/conf/Validator.java common/src/java/org/apache/hadoop/hive/conf/Validator.java index bb0f836..04a305d 100644 --- common/src/java/org/apache/hadoop/hive/conf/Validator.java +++ common/src/java/org/apache/hadoop/hive/conf/Validator.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.conf; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -50,6 +51,10 @@ public StringSet(boolean caseSensitive, String... values) { } } + public Set getExpected() { + return new HashSet(expected); + } + @Override public String validate(String value) { if (value == null || !expected.contains(caseSensitive ? value : value.toLowerCase())) {