diff --git cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java index 9fa7bc6..372882f 100644 --- cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java +++ cli/src/java/org/apache/hadoop/hive/cli/CliDriver.java @@ -84,6 +84,7 @@ public class CliDriver { private final LogHelper console; private final Configuration conf; + private Preprocessor preprocessor; public CliDriver() { SessionState ss = SessionState.get(); @@ -296,6 +297,14 @@ public class CliDriver { return processLine(line, false); } + private String preprocess(String line) { + console.printError("Preprocessor " + preprocessor); + if ( preprocessor != null ) { + return preprocessor.process(line); + } + return line; + } + /** * Processes a line of semicolon separated commands * @@ -306,10 +315,11 @@ public class CliDriver { * returning -1 * @return */ - public int processLine(String line, boolean allowInterupting) { + public int processLine(String inputLine, boolean allowInterupting) { SignalHandler oldSignal = null; Signal interupSignal = null; + String line = preprocess(inputLine); if (allowInterupting) { // Remember all threads that were running at the time we started line processing. // Hook up the custom Ctrl+C handler while processing this line @@ -578,6 +588,7 @@ public class CliDriver { } CliDriver cli = new CliDriver(); + cli.setPreprocessor(new DefaultPreprocessor(oproc.substitutionPairs)); // Execute -i init files (always in silent mode) cli.processInitFiles(ss); @@ -629,4 +640,8 @@ public class CliDriver { System.exit(ret); } + public void setPreprocessor(DefaultPreprocessor preprocessor) { + this.preprocessor = preprocessor; + } + } diff --git cli/src/java/org/apache/hadoop/hive/cli/DefaultPreprocessor.java cli/src/java/org/apache/hadoop/hive/cli/DefaultPreprocessor.java new file mode 100644 index 0000000..efc6d62 --- /dev/null +++ cli/src/java/org/apache/hadoop/hive/cli/DefaultPreprocessor.java @@ -0,0 +1,30 @@ +package org.apache.hadoop.hive.cli; + +import java.util.List; + +public class DefaultPreprocessor implements Preprocessor { + + private List subVars; + + DefaultPreprocessor(List subVars) { + this.subVars = subVars; + } + + @Override + public String process(String line) { + int maxReplacements = 5000; + int replacementIndex = 1; + boolean madeReplacement = true; + while( madeReplacement && replacementIndex < maxReplacements) { + madeReplacement = false; + for(KeyValue var : subVars) { + while( line.indexOf(var.key) != -1 && replacementIndex < maxReplacements) { + line = line.replace(var.key, var.value); + replacementIndex += 1; + madeReplacement = true; + } + } + } + return line; + } +} diff --git cli/src/java/org/apache/hadoop/hive/cli/KeyValue.java cli/src/java/org/apache/hadoop/hive/cli/KeyValue.java new file mode 100644 index 0000000..9b87234 --- /dev/null +++ cli/src/java/org/apache/hadoop/hive/cli/KeyValue.java @@ -0,0 +1,9 @@ +package org.apache.hadoop.hive.cli; + +public class KeyValue { + public KeyValue(String key, String value) { + this.key = key; this.value = value; + } + public String key; + public String value; +} diff --git cli/src/java/org/apache/hadoop/hive/cli/OptionsProcessor.java cli/src/java/org/apache/hadoop/hive/cli/OptionsProcessor.java index 90084ed..53dd962 100644 --- cli/src/java/org/apache/hadoop/hive/cli/OptionsProcessor.java +++ cli/src/java/org/apache/hadoop/hive/cli/OptionsProcessor.java @@ -18,7 +18,9 @@ package org.apache.hadoop.hive.cli; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Properties; import org.apache.commons.cli.GnuParser; @@ -38,7 +40,7 @@ public class OptionsProcessor { protected static final Log l4j = LogFactory.getLog(OptionsProcessor.class.getName()); private final Options options = new Options(); private org.apache.commons.cli.CommandLine commandLine; - + List substitutionPairs = new ArrayList(); @SuppressWarnings("static-access") public OptionsProcessor() { @@ -87,6 +89,23 @@ public class OptionsProcessor { .withDescription("connecting to Hive Server on port number") .create('p')); + // Substitution option -define + options.addOption(OptionBuilder + .withValueSeparator() + .hasArgs(2) + .withArgName("key=value") + .withDescription("Subsitution to apply to script. e.g. -d A=B") + .create('d')); + + // Substitution option -define + options.addOption(OptionBuilder + .withValueSeparator() + .hasArgs(2) + .withArgName("key=value") + .withLongOpt("define") + .withDescription("Subsitution to apply to script. Works same as -d. e.g. -define A=B") + .create()); + // [-S|--silent] options.addOption(new Option("S", "silent", false, "Silent mode in interactive shell")); @@ -105,6 +124,16 @@ public class OptionsProcessor { for (String propKey : confProps.stringPropertyNames()) { System.setProperty(propKey, confProps.getProperty(propKey)); } + + Properties substitutionProperties = commandLine.getOptionProperties("d"); + for (String propKey : substitutionProperties.stringPropertyNames()) { + substitutionPairs.add(new KeyValue("${" + propKey + "}", substitutionProperties.getProperty(propKey))); + } + + substitutionProperties = commandLine.getOptionProperties("define"); + for (String propKey : substitutionProperties.stringPropertyNames()) { + substitutionPairs.add(new KeyValue("${" + propKey + "}", substitutionProperties.getProperty(propKey))); + } } catch (ParseException e) { System.err.println(e.getMessage()); printUsage(); @@ -157,4 +186,8 @@ public class OptionsProcessor { private void printUsage() { new HelpFormatter().printHelp("hive", options); } + + public List getSubstitutionPairs() { + return substitutionPairs; + } } diff --git cli/src/java/org/apache/hadoop/hive/cli/Preprocessor.java cli/src/java/org/apache/hadoop/hive/cli/Preprocessor.java new file mode 100644 index 0000000..6db65fb --- /dev/null +++ cli/src/java/org/apache/hadoop/hive/cli/Preprocessor.java @@ -0,0 +1,7 @@ +package org.apache.hadoop.hive.cli; + +import java.util.List; + +public interface Preprocessor { + public String process(String line); +}