diff --git a/checkstyle/suppressions.xml b/checkstyle/suppressions.xml index 15ba71c17092..e2f89ae87ea6 100644 --- a/checkstyle/suppressions.xml +++ b/checkstyle/suppressions.xml @@ -31,7 +31,6 @@ - diff --git a/ksql-cli/src/main/java/io/confluent/ksql/cli/console/Console.java b/ksql-cli/src/main/java/io/confluent/ksql/cli/console/Console.java index e14d6ab9c2b8..6043c0ea0e85 100644 --- a/ksql-cli/src/main/java/io/confluent/ksql/cli/console/Console.java +++ b/ksql-cli/src/main/java/io/confluent/ksql/cli/console/Console.java @@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.jline.reader.EndOfFileException; -import org.jline.reader.History; import org.jline.terminal.Terminal; import org.jline.utils.InfoCmp; import org.slf4j.Logger; @@ -198,184 +197,17 @@ public void setOutputFormat(String newFormat) { /* private */ private void registerDefaultCommands() { - registerCliSpecificCommand(new CliSpecificCommand() { - @Override - public String getName() { - return "help"; - } - - @Override - public void printHelp() { - writer().println("help:"); - writer().println("\tShow this message."); - } - - @Override - public void execute(String line) { - writer().println(); - writer().println("Description:"); - writer().println( - "\tThe KSQL CLI provides a terminal-based interactive shell" - + " for running queries. Each command must be on a separate line. " - + "For KSQL command syntax, see the documentation at " - + "https://github.com/confluentinc/ksql/docs/." - ); - writer().println(); - for (CliSpecificCommand cliSpecificCommand : cliSpecificCommands.values()) { - cliSpecificCommand.printHelp(); - writer().println(); - } - writer().println(); - writer().println("Keyboard shortcuts:"); - writer().println(); - writer().println(" The KSQL CLI supports these keyboard shorcuts:"); - writer().println(); - writer().println("CTRL+D:"); - writer().println("\tEnd your KSQL CLI session."); - writer().println("CTRL+R:"); - writer().println("\tSearch your command history."); - writer().println("Up and Down arrow keys:"); - writer().println("\tScroll up or down through your command history."); - writer().println(); - writer().println("Default behavior:"); - writer().println(); - writer().println( - " Lines are read one at a time and are sent to the " - + "server as KSQL unless one of the following is true:" - ); - writer().println(); - writer().println( - " 1. The line is empty or entirely whitespace. In this" - + " case, no request is made to the server." - ); - writer().println(); - writer().println( - " 2. The line ends with backslash ('\\'). In this case, lines are " - + "continuously read and stripped of their trailing newline and '\\' " - + "until one is " - + "encountered that does not end with '\\'; then, the concatenation of " - + "all lines read " - + "during this time is sent to the server as KSQL." - ); - writer().println(); - } - }); - - registerCliSpecificCommand(new CliSpecificCommand() { - @Override - public String getName() { - return "clear"; - } - - @Override - public void printHelp() { - writer().println("clear:"); - writer().println("\tClear the current terminal."); - } - - @Override - public void execute(String commandStrippedLine) throws IOException { - puts(InfoCmp.Capability.clear_screen); - flush(); - } - }); - - registerCliSpecificCommand(new CliSpecificCommand() { - - @Override - public String getName() { - return "output"; - } + registerCliSpecificCommand(new Help()); - @Override - public void printHelp() { - writer().println("output:"); - writer().println("\tView the current output format."); - writer().println(""); - writer().println("output "); - writer().println(""); - writer().printf( - "\tSet the output format to (valid formats: %s)%n", - OutputFormat.VALID_FORMATS - ); - writer().println("\tFor example: \"output JSON\""); - } + registerCliSpecificCommand(new Clear()); - @Override - public void execute(String commandStrippedLine) throws IOException { - String newFormat = commandStrippedLine.trim().toUpperCase(); - if (newFormat.isEmpty()) { - writer().printf("Current output format: %s%n", outputFormat.name()); - } else { - setOutputFormat(newFormat); - } - } - }); + registerCliSpecificCommand(new Output()); - registerCliSpecificCommand(new CliSpecificCommand() { - @Override - public String getName() { - return "history"; - } - - @Override - public void printHelp() { - writer().println( - "history:"); - writer().println( - "\tShow previous lines entered during the current CLI session. You can" - + " use up and down arrow keys to view previous lines." - ); - } + registerCliSpecificCommand(new History()); - @Override - public void execute(String commandStrippedLine) throws IOException { - for (History.Entry historyEntry : lineReader.getHistory()) { - writer().printf("%4d: %s%n", historyEntry.index(), historyEntry.line()); - } - flush(); - } - }); - - registerCliSpecificCommand(new CliSpecificCommand() { - @Override - public String getName() { - return "version"; - } - - @Override - public void printHelp() { - writer().println("version:"); - writer().println("\tGet the current KSQL version."); - } + registerCliSpecificCommand(new Version()); - @Override - public void execute(String commandStrippedLine) throws IOException { - ServerInfo serverInfo = restClient.makeRootRequest().getResponse(); - writer().printf("Version: %s%n", serverInfo.getVersion()); - flush(); - } - }); - - registerCliSpecificCommand(new CliSpecificCommand() { - @Override - public String getName() { - return "exit"; - } - - @Override - public void printHelp() { - writer().println("exit:"); - writer().println( - "\tExit the CLI." - ); - } - - @Override - public void execute(String commandStrippedLine) throws IOException { - throw new EndOfFileException(); - } - }); + registerCliSpecificCommand(new Exit()); } @@ -707,4 +539,182 @@ private static String constructSingleColumnFormatString(Integer length) { return String.format("%%%ds", (-1 * length)); } + private class Help implements CliSpecificCommand { + @Override + public String getName() { + return "help"; + } + + @Override + public void printHelp() { + writer().println("help:"); + writer().println("\tShow this message."); + } + + @Override + public void execute(String line) { + writer().println(); + writer().println("Description:"); + writer().println( + "\tThe KSQL CLI provides a terminal-based interactive shell" + + " for running queries. Each command must be on a separate line. " + + "For KSQL command syntax, see the documentation at " + + "https://github.com/confluentinc/ksql/docs/." + ); + writer().println(); + for (CliSpecificCommand cliSpecificCommand : cliSpecificCommands.values()) { + cliSpecificCommand.printHelp(); + writer().println(); + } + writer().println(); + writer().println("Keyboard shortcuts:"); + writer().println(); + writer().println(" The KSQL CLI supports these keyboard shorcuts:"); + writer().println(); + writer().println("CTRL+D:"); + writer().println("\tEnd your KSQL CLI session."); + writer().println("CTRL+R:"); + writer().println("\tSearch your command history."); + writer().println("Up and Down arrow keys:"); + writer().println("\tScroll up or down through your command history."); + writer().println(); + writer().println("Default behavior:"); + writer().println(); + writer().println( + " Lines are read one at a time and are sent to the " + + "server as KSQL unless one of the following is true:" + ); + writer().println(); + writer().println( + " 1. The line is empty or entirely whitespace. In this" + + " case, no request is made to the server." + ); + writer().println(); + writer().println( + " 2. The line ends with backslash ('\\'). In this case, lines are " + + "continuously read and stripped of their trailing newline and '\\' " + + "until one is " + + "encountered that does not end with '\\'; then, the concatenation of " + + "all lines read " + + "during this time is sent to the server as KSQL." + ); + writer().println(); + } + } + + private class Clear implements CliSpecificCommand { + @Override + public String getName() { + return "clear"; + } + + @Override + public void printHelp() { + writer().println("clear:"); + writer().println("\tClear the current terminal."); + } + + @Override + public void execute(String commandStrippedLine) throws IOException { + puts(InfoCmp.Capability.clear_screen); + flush(); + } + } + + private class Output implements CliSpecificCommand { + + @Override + public String getName() { + return "output"; + } + + @Override + public void printHelp() { + writer().println("output:"); + writer().println("\tView the current output format."); + writer().println(""); + writer().println("output "); + writer().println(""); + writer().printf( + "\tSet the output format to (valid formats: %s)%n", + OutputFormat.VALID_FORMATS + ); + writer().println("\tFor example: \"output JSON\""); + } + + @Override + public void execute(String commandStrippedLine) throws IOException { + String newFormat = commandStrippedLine.trim().toUpperCase(); + if (newFormat.isEmpty()) { + writer().printf("Current output format: %s%n", outputFormat.name()); + } else { + setOutputFormat(newFormat); + } + } + } + + private class History implements CliSpecificCommand { + @Override + public String getName() { + return "history"; + } + + @Override + public void printHelp() { + writer().println( + "history:"); + writer().println( + "\tShow previous lines entered during the current CLI session. You can" + + " use up and down arrow keys to view previous lines." + ); + } + + @Override + public void execute(String commandStrippedLine) throws IOException { + for (org.jline.reader.History.Entry historyEntry : lineReader.getHistory()) { + writer().printf("%4d: %s%n", historyEntry.index(), historyEntry.line()); + } + flush(); + } + } + + private class Version implements CliSpecificCommand { + @Override + public String getName() { + return "version"; + } + + @Override + public void printHelp() { + writer().println("version:"); + writer().println("\tGet the current KSQL version."); + } + + @Override + public void execute(String commandStrippedLine) { + ServerInfo serverInfo = restClient.makeRootRequest().getResponse(); + writer().printf("Version: %s%n", serverInfo.getVersion()); + flush(); + } + } + + private class Exit implements CliSpecificCommand { + @Override + public String getName() { + return "exit"; + } + + @Override + public void printHelp() { + writer().println("exit:"); + writer().println( + "\tExit the CLI." + ); + } + + @Override + public void execute(String commandStrippedLine) throws IOException { + throw new EndOfFileException(); + } + } } diff --git a/ksql-engine/src/main/java/io/confluent/ksql/function/FunctionRegistry.java b/ksql-engine/src/main/java/io/confluent/ksql/function/FunctionRegistry.java index 7c460b8ebb85..74274736c962 100644 --- a/ksql-engine/src/main/java/io/confluent/ksql/function/FunctionRegistry.java +++ b/ksql-engine/src/main/java/io/confluent/ksql/function/FunctionRegistry.java @@ -161,20 +161,24 @@ private void init() { addFunction(jsonArrayContainsString); addFunction(new KsqlFunction( - Schema.BOOLEAN_SCHEMA, Arrays.asList(SchemaBuilder.array(Schema.STRING_SCHEMA).build(), Schema.STRING_SCHEMA), - "ARRAYCONTAINS", ArrayContainsKudf.class)); + Schema.BOOLEAN_SCHEMA, + Arrays.asList(SchemaBuilder.array(Schema.STRING_SCHEMA).build(), Schema.STRING_SCHEMA), + "ARRAYCONTAINS", ArrayContainsKudf.class)); addFunction(new KsqlFunction( - Schema.BOOLEAN_SCHEMA, Arrays.asList(SchemaBuilder.array(Schema.INT32_SCHEMA).build(), Schema.INT32_SCHEMA), - "ARRAYCONTAINS", ArrayContainsKudf.class)); + Schema.BOOLEAN_SCHEMA, + Arrays.asList(SchemaBuilder.array(Schema.INT32_SCHEMA).build(), Schema.INT32_SCHEMA), + "ARRAYCONTAINS", ArrayContainsKudf.class)); addFunction(new KsqlFunction( - Schema.BOOLEAN_SCHEMA, Arrays.asList(SchemaBuilder.array(Schema.INT64_SCHEMA).build(), Schema.INT64_SCHEMA), - "ARRAYCONTAINS", ArrayContainsKudf.class)); + Schema.BOOLEAN_SCHEMA, + Arrays.asList(SchemaBuilder.array(Schema.INT64_SCHEMA).build(), Schema.INT64_SCHEMA), + "ARRAYCONTAINS", ArrayContainsKudf.class)); addFunction(new KsqlFunction( - Schema.BOOLEAN_SCHEMA, Arrays.asList(SchemaBuilder.array(Schema.FLOAT64_SCHEMA).build(), Schema.FLOAT64_SCHEMA), - "ARRAYCONTAINS", ArrayContainsKudf.class)); + Schema.BOOLEAN_SCHEMA, + Arrays.asList(SchemaBuilder.array(Schema.FLOAT64_SCHEMA).build(), Schema.FLOAT64_SCHEMA), + "ARRAYCONTAINS", ArrayContainsKudf.class)); /*************************************** diff --git a/ksql-engine/src/main/java/io/confluent/ksql/function/udf/json/ArrayContainsKudf.java b/ksql-engine/src/main/java/io/confluent/ksql/function/udf/json/ArrayContainsKudf.java index 69bfa20eb8a9..1d90618de11f 100644 --- a/ksql-engine/src/main/java/io/confluent/ksql/function/udf/json/ArrayContainsKudf.java +++ b/ksql-engine/src/main/java/io/confluent/ksql/function/udf/json/ArrayContainsKudf.java @@ -49,7 +49,8 @@ public void init() { @Override public Object evaluate(Object... args) { if (args.length != 2) { - throw new KsqlFunctionException("ARRAY_CONTAINS udf should have two input argument. Given: " + Arrays.toString(args)); + throw new KsqlFunctionException("ARRAY_CONTAINS udf should have two input argument. " + + "Given: " + Arrays.toString(args)); } Object searchValue = args[1]; if(args[0] instanceof String) {