This is an automated email from the ASF dual-hosted git repository. jmanno pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/main by this push: new 9dd6580 Added ColFam and ColQual opts to scan command (#2255) 9dd6580 is described below commit 9dd65807008d3d3ed313d7cfd10bfb68c4ccc597 Author: harjitdotsingh <75006+harjitdotsi...@users.noreply.github.com> AuthorDate: Thu Sep 16 09:39:03 2021 -0400 Added ColFam and ColQual opts to scan command (#2255) * This will enable users to have scan for column families with characters such as colons in them. * Added tests to verify this functionality. Co-authored-by: Hsingh <harjsin@Hsinghs-MacBook-Pro.local> Co-authored-by: Jeffrey Manno <jeffreymann...@gmail.com> --- .../accumulo/shell/commands/ScanCommand.java | 49 +++++++++++++++++++++- .../accumulo/shell/commands/ScanCommandTest.java | 12 ++++++ .../org/apache/accumulo/test/ShellServerIT.java | 11 +++++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java index 8f5fe5f..d1c0b8d 100644 --- a/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java +++ b/shell/src/main/java/org/apache/accumulo/shell/commands/ScanCommand.java @@ -59,7 +59,7 @@ import org.apache.hadoop.io.Text; public class ScanCommand extends Command { private Option scanOptAuths, scanOptRow, scanOptColumns, disablePaginationOpt, showFewOpt, - formatterOpt, interpreterOpt, formatterInterpeterOpt, outputFileOpt; + formatterOpt, interpreterOpt, formatterInterpeterOpt, outputFileOpt, scanOptCf, scanOptCq; protected Option timestampOpt; protected Option profileOpt; @@ -114,6 +114,7 @@ public class ScanCommand extends Command { // handle columns fetchColumns(cl, scanner, interpeter); + fetchColumsWithCFAndCQ(cl, scanner, interpeter); // set timeout scanner.setTimeout(getTimeout(cl), TimeUnit.MILLISECONDS); @@ -270,6 +271,16 @@ public class ScanCommand extends Command { protected void fetchColumns(final CommandLine cl, final ScannerBase scanner, final ScanInterpreter formatter) throws UnsupportedEncodingException { + + if ((cl.hasOption(scanOptCf.getOpt()) || cl.hasOption(scanOptCq.getOpt())) + && cl.hasOption(scanOptColumns.getOpt())) { + + String formattedString = + String.format("Option -%s is mutually exclusive with options -%s and -%s.", + scanOptColumns.getOpt(), scanOptCf.getOpt(), scanOptCq.getOpt()); + throw new IllegalArgumentException(formattedString); + } + if (cl.hasOption(scanOptColumns.getOpt())) { for (String a : cl.getOptionValue(scanOptColumns.getOpt()).split(",")) { final String[] sa = a.split(":", 2); @@ -285,6 +296,32 @@ public class ScanCommand extends Command { } } + private void fetchColumsWithCFAndCQ(CommandLine cl, Scanner scanner, ScanInterpreter interpeter) { + String cf = ""; + String cq = ""; + if (cl.hasOption(scanOptCf.getOpt())) { + cf = cl.getOptionValue(scanOptCf.getOpt()); + } + if (cl.hasOption(scanOptCq.getOpt())) { + cq = cl.getOptionValue(scanOptCq.getOpt()); + } + + if (cf.isEmpty() && !cq.isEmpty()) { + String formattedString = String.format("Option -%s is required when using -%s.", + scanOptCf.getOpt(), scanOptCq.getOpt()); + throw new IllegalArgumentException(formattedString); + } else if (!cf.isEmpty() && cq.isEmpty()) { + scanner.fetchColumnFamily( + interpeter.interpretColumnFamily(new Text(cf.getBytes(Shell.CHARSET)))); + + } else if (!cf.isEmpty() && !cq.isEmpty()) { + scanner.fetchColumn(interpeter.interpretColumnFamily(new Text(cf.getBytes(Shell.CHARSET))), + interpeter.interpretColumnQualifier(new Text(cq.getBytes(Shell.CHARSET)))); + + } + + } + protected Range getRange(final CommandLine cl, final ScanInterpreter formatter) throws UnsupportedEncodingException { if ((cl.hasOption(OptUtil.START_ROW_OPT) || cl.hasOption(OptUtil.END_ROW_OPT)) @@ -347,7 +384,11 @@ public class ScanCommand extends Command { "make end row exclusive (by default it's inclusive)"); optEndRowExclusive.setArgName("end-exclusive"); scanOptRow = new Option("r", "row", true, "row to scan"); - scanOptColumns = new Option("c", "columns", true, "comma-separated columns"); + scanOptColumns = new Option("c", "columns", true, + "comma-separated columns.This" + " option is mutually exclusive with cf and cq"); + scanOptCf = new Option("cf", "column-family", true, "column family to scan."); + scanOptCq = new Option("cq", "column-qualifier", true, "column qualifier to scan"); + timestampOpt = new Option("st", "show-timestamps", false, "display timestamps"); disablePaginationOpt = new Option("np", "no-pagination", false, "disable pagination of output"); showFewOpt = new Option("f", "show-few", true, "show only a specified number of characters"); @@ -369,6 +410,8 @@ public class ScanCommand extends Command { scanOptRow.setArgName("row"); scanOptColumns .setArgName("<columnfamily>[:<columnqualifier>]{,<columnfamily>[:<columnqualifier>]}"); + scanOptCf.setArgName("column-family"); + scanOptCq.setArgName("column-qualifier"); showFewOpt.setRequired(false); showFewOpt.setArgName("int"); formatterOpt.setArgName("className"); @@ -390,6 +433,8 @@ public class ScanCommand extends Command { o.addOption(optStartRowExclusive); o.addOption(optEndRowExclusive); o.addOption(scanOptColumns); + o.addOption(scanOptCf); + o.addOption(scanOptCq); o.addOption(timestampOpt); o.addOption(disablePaginationOpt); o.addOption(OptUtil.tableOpt("table to be scanned")); diff --git a/shell/src/test/java/org/apache/accumulo/shell/commands/ScanCommandTest.java b/shell/src/test/java/org/apache/accumulo/shell/commands/ScanCommandTest.java index 66b26d9..a41c062 100644 --- a/shell/src/test/java/org/apache/accumulo/shell/commands/ScanCommandTest.java +++ b/shell/src/test/java/org/apache/accumulo/shell/commands/ScanCommandTest.java @@ -30,4 +30,16 @@ public class ScanCommandTest { new ScanCommand().getOptions().getOption("b").getDescription().contains("row (inclusive)")); } + @Test + public void testCFRowHelp() { + assertTrue("Column Family", + new ScanCommand().getOptions().getOption("cf").getDescription().contains("family")); + } + + @Test + public void testCQHelp() { + assertTrue("Column Qualifier", + new ScanCommand().getOptions().getOption("cq").getDescription().contains("qualifier")); + } + } diff --git a/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java b/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java index 012dc4b..a5c8cfe 100644 --- a/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java +++ b/test/src/main/java/org/apache/accumulo/test/ShellServerIT.java @@ -1940,6 +1940,17 @@ public class ShellServerIT extends SharedMiniClusterBase { } @Test + public void scansWithColon() throws Exception { + ts.exec("createtable twithcolontest"); + ts.exec("insert row c:f cq value"); + ts.exec("scan -r row -cf c:f", true, "value"); + ts.exec("scan -b row -cf c:f -cq cq -e row", true, "value"); + ts.exec("scan -b row -c cf -cf c:f -cq cq -e row", false, "mutually exclusive"); + ts.exec("scan -b row -cq col1 -e row", false, "Option -cf is required when using -cq"); + ts.exec("deletetable -f twithcolontest"); + } + + @Test public void scansWithClassLoaderContext() throws IOException { try {