use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ProxyServer method updateRowsConditionally.
@Override
public Map<ByteBuffer, ConditionalStatus> updateRowsConditionally(String conditionalWriter, Map<ByteBuffer, ConditionalUpdates> updates) throws UnknownWriter, org.apache.accumulo.proxy.thrift.AccumuloException, org.apache.accumulo.proxy.thrift.AccumuloSecurityException, TException {
ConditionalWriter cw = conditionalWriterCache.getIfPresent(UUID.fromString(conditionalWriter));
if (cw == null) {
throw new UnknownWriter();
}
try {
HashMap<Text, ColumnVisibility> vizMap = new HashMap<>();
ArrayList<ConditionalMutation> cmuts = new ArrayList<>(updates.size());
for (Entry<ByteBuffer, ConditionalUpdates> cu : updates.entrySet()) {
ConditionalMutation cmut = new ConditionalMutation(ByteBufferUtil.toBytes(cu.getKey()));
for (Condition tcond : cu.getValue().conditions) {
org.apache.accumulo.core.data.Condition cond = new org.apache.accumulo.core.data.Condition(tcond.column.getColFamily(), tcond.column.getColQualifier());
if (tcond.getColumn().getColVisibility() != null && tcond.getColumn().getColVisibility().length > 0) {
cond.setVisibility(getCahcedCV(vizMap, tcond.getColumn().getColVisibility()));
}
if (tcond.isSetValue())
cond.setValue(tcond.getValue());
if (tcond.isSetTimestamp())
cond.setTimestamp(tcond.getTimestamp());
if (tcond.isSetIterators()) {
cond.setIterators(getIteratorSettings(tcond.getIterators()).toArray(new IteratorSetting[tcond.getIterators().size()]));
}
cmut.addCondition(cond);
}
addUpdatesToMutation(vizMap, cmut, cu.getValue().updates);
cmuts.add(cmut);
}
Iterator<Result> results = cw.write(cmuts.iterator());
HashMap<ByteBuffer, ConditionalStatus> resultMap = new HashMap<>();
while (results.hasNext()) {
Result result = results.next();
ByteBuffer row = ByteBuffer.wrap(result.getMutation().getRow());
ConditionalStatus status = ConditionalStatus.valueOf(result.getStatus().name());
resultMap.put(row, status);
}
return resultMap;
} catch (Exception e) {
handleException(e);
return null;
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testTableAndConditionIterators.
@Test
public void testTableAndConditionIterators() throws Exception {
// test w/ table that has iterators configured
Connector conn = getConnector();
String tableName = getUniqueNames(1)[0];
IteratorSetting aiConfig1 = new IteratorSetting(30, "AI1", AddingIterator.class);
aiConfig1.addOption("amount", "2");
IteratorSetting aiConfig2 = new IteratorSetting(35, "MI1", MultiplyingIterator.class);
aiConfig2.addOption("amount", "3");
IteratorSetting aiConfig3 = new IteratorSetting(40, "AI2", AddingIterator.class);
aiConfig3.addOption("amount", "5");
conn.tableOperations().create(tableName);
BatchWriter bw = conn.createBatchWriter(tableName, new BatchWriterConfig());
Mutation m = new Mutation("ACCUMULO-1000");
m.put("count", "comments", "6");
bw.addMutation(m);
m = new Mutation("ACCUMULO-1001");
m.put("count", "comments", "7");
bw.addMutation(m);
m = new Mutation("ACCUMULO-1002");
m.put("count", "comments", "8");
bw.addMutation(m);
bw.close();
conn.tableOperations().attachIterator(tableName, aiConfig1, EnumSet.of(IteratorScope.scan));
conn.tableOperations().offline(tableName, true);
conn.tableOperations().online(tableName, true);
try (ConditionalWriter cw = conn.createConditionalWriter(tableName, new ConditionalWriterConfig());
Scanner scanner = conn.createScanner(tableName, new Authorizations())) {
ConditionalMutation cm6 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("8"));
cm6.put("count", "comments", "7");
Assert.assertEquals(Status.ACCEPTED, cw.write(cm6).getStatus());
scanner.setRange(new Range("ACCUMULO-1000"));
scanner.fetchColumn(new Text("count"), new Text("comments"));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("9", entry.getValue().toString());
ConditionalMutation cm7 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2).setValue("27"));
cm7.put("count", "comments", "8");
Assert.assertEquals(Status.ACCEPTED, cw.write(cm7).getStatus());
entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("10", entry.getValue().toString());
ConditionalMutation cm8 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2, aiConfig3).setValue("35"));
cm8.put("count", "comments", "9");
Assert.assertEquals(Status.ACCEPTED, cw.write(cm8).getStatus());
entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("11", entry.getValue().toString());
ConditionalMutation cm3 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2).setValue("33"));
cm3.put("count", "comments", "3");
ConditionalMutation cm4 = new ConditionalMutation("ACCUMULO-1001", new Condition("count", "comments").setIterators(aiConfig3).setValue("14"));
cm4.put("count", "comments", "3");
ConditionalMutation cm5 = new ConditionalMutation("ACCUMULO-1002", new Condition("count", "comments").setIterators(aiConfig3).setValue("10"));
cm5.put("count", "comments", "3");
Iterator<Result> results = cw.write(Arrays.asList(cm3, cm4, cm5).iterator());
Map<String, Status> actual = new HashMap<>();
while (results.hasNext()) {
Result result = results.next();
String k = new String(result.getMutation().getRow());
Assert.assertFalse("Did not expect to see multiple resultus for the row: " + k, actual.containsKey(k));
actual.put(k, result.getStatus());
}
Map<String, Status> expected = new HashMap<>();
expected.put("ACCUMULO-1000", Status.ACCEPTED);
expected.put("ACCUMULO-1001", Status.ACCEPTED);
expected.put("ACCUMULO-1002", Status.REJECTED);
Assert.assertEquals(expected, actual);
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testDeleteTable.
@Test
public void testDeleteTable() throws Exception {
String table = getUniqueNames(1)[0];
Connector conn = getConnector();
try {
conn.createConditionalWriter(table, new ConditionalWriterConfig());
Assert.fail("Creating conditional writer for table that doesn't exist should fail");
} catch (TableNotFoundException e) {
}
conn.tableOperations().create(table);
try (ConditionalWriter cw = conn.createConditionalWriter(table, new ConditionalWriterConfig())) {
conn.tableOperations().delete(table);
ConditionalMutation cm1 = new ConditionalMutation("r1", new Condition("tx", "seq"));
cm1.put("tx", "seq", "1");
cm1.put("data", "x", "a");
Result result = cw.write(cm1);
try {
Status status = result.getStatus();
Assert.fail("Expected exception writing conditional mutation to deleted table. Got status: " + status);
} catch (AccumuloException ae) {
Assert.assertEquals(TableDeletedException.class, ae.getCause().getClass());
}
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testIterators.
@Test
public void testIterators() throws Exception {
Connector conn = getConnector();
String tableName = getUniqueNames(1)[0];
conn.tableOperations().create(tableName, new NewTableConfiguration().withoutDefaultIterators());
BatchWriter bw = conn.createBatchWriter(tableName, new BatchWriterConfig());
Mutation m = new Mutation("ACCUMULO-1000");
m.put("count", "comments", "1");
bw.addMutation(m);
bw.addMutation(m);
bw.addMutation(m);
m = new Mutation("ACCUMULO-1001");
m.put("count2", "comments", "1");
bw.addMutation(m);
bw.addMutation(m);
m = new Mutation("ACCUMULO-1002");
m.put("count2", "comments", "1");
bw.addMutation(m);
bw.addMutation(m);
bw.close();
IteratorSetting iterConfig = new IteratorSetting(10, SummingCombiner.class);
SummingCombiner.setEncodingType(iterConfig, Type.STRING);
SummingCombiner.setColumns(iterConfig, Collections.singletonList(new IteratorSetting.Column("count")));
IteratorSetting iterConfig2 = new IteratorSetting(10, SummingCombiner.class);
SummingCombiner.setEncodingType(iterConfig2, Type.STRING);
SummingCombiner.setColumns(iterConfig2, Collections.singletonList(new IteratorSetting.Column("count2", "comments")));
IteratorSetting iterConfig3 = new IteratorSetting(5, VersioningIterator.class);
VersioningIterator.setMaxVersions(iterConfig3, 1);
try (Scanner scanner = conn.createScanner(tableName, new Authorizations())) {
scanner.addScanIterator(iterConfig);
scanner.setRange(new Range("ACCUMULO-1000"));
scanner.fetchColumn(new Text("count"), new Text("comments"));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("3", entry.getValue().toString());
try (ConditionalWriter cw = conn.createConditionalWriter(tableName, new ConditionalWriterConfig())) {
ConditionalMutation cm0 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("3"));
cm0.put("count", "comments", "1");
Assert.assertEquals(Status.REJECTED, cw.write(cm0).getStatus());
entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("3", entry.getValue().toString());
ConditionalMutation cm1 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(iterConfig).setValue("3"));
cm1.put("count", "comments", "1");
Assert.assertEquals(Status.ACCEPTED, cw.write(cm1).getStatus());
entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("4", entry.getValue().toString());
ConditionalMutation cm2 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("4"));
cm2.put("count", "comments", "1");
Assert.assertEquals(Status.REJECTED, cw.write(cm1).getStatus());
entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("4", entry.getValue().toString());
// run test with multiple iterators passed in same batch and condition with two iterators
ConditionalMutation cm3 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(iterConfig).setValue("4"));
cm3.put("count", "comments", "1");
ConditionalMutation cm4 = new ConditionalMutation("ACCUMULO-1001", new Condition("count2", "comments").setIterators(iterConfig2).setValue("2"));
cm4.put("count2", "comments", "1");
ConditionalMutation cm5 = new ConditionalMutation("ACCUMULO-1002", new Condition("count2", "comments").setIterators(iterConfig2, iterConfig3).setValue("2"));
cm5.put("count2", "comments", "1");
Iterator<Result> results = cw.write(Arrays.asList(cm3, cm4, cm5).iterator());
Map<String, Status> actual = new HashMap<>();
while (results.hasNext()) {
Result result = results.next();
String k = new String(result.getMutation().getRow());
Assert.assertFalse("Did not expect to see multiple resultus for the row: " + k, actual.containsKey(k));
actual.put(k, result.getStatus());
}
Map<String, Status> expected = new HashMap<>();
expected.put("ACCUMULO-1000", Status.ACCEPTED);
expected.put("ACCUMULO-1001", Status.ACCEPTED);
expected.put("ACCUMULO-1002", Status.REJECTED);
Assert.assertEquals(expected, actual);
}
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testBatch.
@Test
public void testBatch() throws Exception {
Connector conn = getConnector();
String tableName = getUniqueNames(1)[0];
conn.tableOperations().create(tableName);
conn.securityOperations().changeUserAuthorizations(getAdminPrincipal(), new Authorizations("A", "B"));
ColumnVisibility cvab = new ColumnVisibility("A|B");
ArrayList<ConditionalMutation> mutations = new ArrayList<>();
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvab));
cm0.put("name", "last", cvab, "doe");
cm0.put("name", "first", cvab, "john");
cm0.put("tx", "seq", cvab, "1");
mutations.add(cm0);
ConditionalMutation cm1 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvab));
cm1.put("name", "last", cvab, "doe");
cm1.put("name", "first", cvab, "jane");
cm1.put("tx", "seq", cvab, "1");
mutations.add(cm1);
ConditionalMutation cm2 = new ConditionalMutation("19059", new Condition("tx", "seq").setVisibility(cvab));
cm2.put("name", "last", cvab, "doe");
cm2.put("name", "first", cvab, "jack");
cm2.put("tx", "seq", cvab, "1");
mutations.add(cm2);
try (ConditionalWriter cw = conn.createConditionalWriter(tableName, new ConditionalWriterConfig().setAuthorizations(new Authorizations("A")));
Scanner scanner = conn.createScanner(tableName, new Authorizations("A"))) {
Iterator<Result> results = cw.write(mutations.iterator());
int count = 0;
while (results.hasNext()) {
Result result = results.next();
Assert.assertEquals(Status.ACCEPTED, result.getStatus());
count++;
}
Assert.assertEquals(3, count);
scanner.fetchColumn(new Text("tx"), new Text("seq"));
for (String row : new String[] { "99006", "59056", "19059" }) {
scanner.setRange(new Range(row));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("1", entry.getValue().toString());
}
TreeSet<Text> splits = new TreeSet<>();
splits.add(new Text("7"));
splits.add(new Text("3"));
conn.tableOperations().addSplits(tableName, splits);
mutations.clear();
ConditionalMutation cm3 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvab).setValue("1"));
cm3.put("name", "last", cvab, "Doe");
cm3.put("tx", "seq", cvab, "2");
mutations.add(cm3);
ConditionalMutation cm4 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvab));
cm4.put("name", "last", cvab, "Doe");
cm4.put("tx", "seq", cvab, "1");
mutations.add(cm4);
ConditionalMutation cm5 = new ConditionalMutation("19059", new Condition("tx", "seq").setVisibility(cvab).setValue("2"));
cm5.put("name", "last", cvab, "Doe");
cm5.put("tx", "seq", cvab, "3");
mutations.add(cm5);
results = cw.write(mutations.iterator());
int accepted = 0;
int rejected = 0;
while (results.hasNext()) {
Result result = results.next();
if (new String(result.getMutation().getRow()).equals("99006")) {
Assert.assertEquals(Status.ACCEPTED, result.getStatus());
accepted++;
} else {
Assert.assertEquals(Status.REJECTED, result.getStatus());
rejected++;
}
}
Assert.assertEquals("Expected only one accepted conditional mutation", 1, accepted);
Assert.assertEquals("Expected two rejected conditional mutations", 2, rejected);
for (String row : new String[] { "59056", "19059" }) {
scanner.setRange(new Range(row));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("1", entry.getValue().toString());
}
scanner.setRange(new Range("99006"));
Entry<Key, Value> entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("2", entry.getValue().toString());
scanner.clearColumns();
scanner.fetchColumn(new Text("name"), new Text("last"));
entry = Iterables.getOnlyElement(scanner);
Assert.assertEquals("Doe", entry.getValue().toString());
}
}
Aggregations