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 {

Reply via email to