You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by jm...@apache.org on 2020/11/10 16:54:43 UTC
[accumulo] branch main updated: Add tablename option to shell
insert command. (#1771)
This is an automated email from the ASF dual-hosted git repository.
jmark99 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 7e563c8 Add tablename option to shell insert command. (#1771)
7e563c8 is described below
commit 7e563c8e9ef94991efe3fde12f48b2e8e68cd964
Author: Mark Owens <jm...@apache.org>
AuthorDate: Tue Nov 10 11:51:33 2020 -0500
Add tablename option to shell insert command. (#1771)
This change adds the --table/-t option to the insert command when inside the shell or when using the accumulo command with 'accumulo shell -e <task>'. The option is not required, but if used it allows data to be inserted into a table in situations where the shell is not within a table context or when in a table context to insert data into another table.
Although I would not expect this option to be utilized very often, I found myself in need of it when working with the various accumulo examples in the accumulo-examples repo. I had many situations where I wished to insert some test data from a bash shell using the 'accumulo shell -e insert r f q v' form but this would fail due to there being no table context for the insertion. This update allows data inserts from a command line using the 'accumulo shell' format.
---
.../accumulo/shell/commands/InsertCommand.java | 8 ++--
.../java/org/apache/accumulo/test/ShellIT.java | 49 ++++++++++++++++++++++
2 files changed, 54 insertions(+), 3 deletions(-)
diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/InsertCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/InsertCommand.java
index 051e307..283387f 100644
--- a/shell/src/main/java/org/apache/accumulo/shell/commands/InsertCommand.java
+++ b/shell/src/main/java/org/apache/accumulo/shell/commands/InsertCommand.java
@@ -63,7 +63,8 @@ public class InsertCommand extends Command {
public int execute(final String fullCommand, final CommandLine cl, final Shell shellState)
throws AccumuloException, AccumuloSecurityException, TableNotFoundException, IOException,
ConstraintViolationException {
- shellState.checkTableState();
+
+ final String tableName = OptUtil.getTableOpt(cl, shellState);
final Mutation m = new Mutation(new Text(cl.getArgs()[0].getBytes(Shell.CHARSET)));
final Text colf = new Text(cl.getArgs()[1].getBytes(Shell.CHARSET));
@@ -105,8 +106,7 @@ public class InsertCommand extends Command {
throw new IllegalArgumentException("Unknown durability: " + userDurability);
}
}
- final BatchWriter bw =
- shellState.getAccumuloClient().createBatchWriter(shellState.getTableName(), cfg);
+ final BatchWriter bw = shellState.getAccumuloClient().createBatchWriter(tableName, cfg);
bw.addMutation(m);
try {
bw.close();
@@ -171,6 +171,8 @@ public class InsertCommand extends Command {
"durability to use for insert, should be one of \"none\" \"log\" \"flush\" or \"sync\"");
o.addOption(durabilityOption);
+ o.addOption(OptUtil.tableOpt("table into which data will be inserted"));
+
return o;
}
diff --git a/test/src/main/java/org/apache/accumulo/test/ShellIT.java b/test/src/main/java/org/apache/accumulo/test/ShellIT.java
index 753aeca..a109f2d 100644
--- a/test/src/main/java/org/apache/accumulo/test/ShellIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/ShellIT.java
@@ -239,6 +239,55 @@ public class ShellIT extends SharedMiniClusterBase {
}
@Test
+ public void insertIntoSpecifiedTableTest() throws IOException {
+ Shell.log.debug("Starting insertIntoSpecifiedTableTest -----------------");
+ // create two tables for insertion tests
+ exec("createtable tab1", true);
+ exec("createtable tab2", true);
+ // insert data into tab2 while in tab2 context
+ exec("insert row1 f q tab2", true);
+ // insert another with the table and t argument to verify also works
+ exec("insert row2 f q tab2 --table tab2", true);
+ exec("insert row3 f q tab2 -t tab2", true);
+ // leave all table contexts
+ exec("notable", true);
+ // without option cannot insert when not in a table context, also cannot add to a table
+ // using 'accumulo shell -e "insert ...." fron command line due to no table context being set.
+ exec("insert row1 f q tab1", false, "java.lang.IllegalStateException: Not in a table context");
+ // but using option can insert to a table with tablename option without being in a table context
+ exec("insert row1 f q tab1 --table tab1", true);
+ exec("insert row4 f q tab2 -t tab2", true);
+ exec("table tab2", true);
+ // can also insert into another table even if a different table context
+ exec("insert row2 f q tab1 -t tab1", true);
+ exec("notable", true);
+ // must supply a tablename if option is used
+ exec("insert row5 f q tab5 --table", false,
+ "org.apache.commons.cli.MissingArgumentException: Missing argument for option:");
+ exec("insert row5 f q tab5 --t", false,
+ "org.apache.commons.cli.AmbiguousOptionException: Ambiguous option: '--t'");
+ // verify expected data is in both tables
+ exec("scan -t tab1", true, "row1 f:q [] tab1\nrow2 f:q [] tab1");
+ exec("scan -t tab2", true,
+ "row1 f:q [] tab2\nrow2 f:q [] tab2\nrow3 f:q [] tab2\nrow4 f:q [] tab2");
+ // check that if in table context, inserting into a non-existent table does not change context
+ exec("createtable tab3", true);
+ exec("table tab3", true);
+ exec("insert row1 f1 q1 tab3", true);
+ exec("insert row2 f2 q2 tab3 --table idontexist", false,
+ "org.apache.accumulo.core.client.TableNotFoundException:");
+ exec("insert row2 f2 q2 tab3 -t idontexist", false,
+ "org.apache.accumulo.core.client.TableNotFoundException:");
+ exec("insert row3 f3 q3 tab3", true); // should be able to insert w/o changing tables
+ // verify expected data is in tab3
+ exec("scan", true, "row1 f1:q1 [] tab3\nrow3 f3:q3 [] tab3");
+ // cleanup
+ exec("deletetable tab1 -f", true, "Table: [tab1] has been deleted");
+ exec("deletetable tab2 -f", true, "Table: [tab2] has been deleted");
+ exec("deletetable tab3 -f", true, "Table: [tab3] has been deleted");
+ }
+
+ @Test
public void deleteManyTest() throws IOException {
exec("deletemany", false, "java.lang.IllegalStateException: Not in a table context");
exec("createtable test", true);