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 c6e31e2cc2 Add prettyPrint method to ConditionalMutatoin (#4694)
c6e31e2cc2 is described below
commit c6e31e2cc252e324c5bd3635a9f7edffffbbce79
Author: Mark Owens <[email protected]>
AuthorDate: Mon Jun 24 13:29:38 2024 -0400
Add prettyPrint method to ConditionalMutatoin (#4694)
Added prettyPrint method to ConditionalMutatiol. The method prints the
usual information that is currently printed when prettyPrint is called on a
mutation, but adds additional condition information for the provided
conditionalMutation.
Closes #4675
---
.../accumulo/core/data/ConditionalMutation.java | 46 +++++++++++
.../core/data/ConditionalMutationTest.java | 92 ++++++++++++++++++++++
2 files changed, 138 insertions(+)
diff --git
a/core/src/main/java/org/apache/accumulo/core/data/ConditionalMutation.java
b/core/src/main/java/org/apache/accumulo/core/data/ConditionalMutation.java
index 1fe82e4717..4db8ca8e00 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/ConditionalMutation.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/ConditionalMutation.java
@@ -19,12 +19,14 @@
package org.apache.accumulo.core.data;
import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.hadoop.io.Text;
/**
@@ -82,6 +84,50 @@ public class ConditionalMutation extends Mutation {
return Collections.unmodifiableList(conditions);
}
+ private String toString(ByteSequence bs) {
+ if (bs == null) {
+ return null;
+ }
+ return new String(bs.toArray(), UTF_8);
+ }
+
+ @Override
+ public String prettyPrint() {
+ StringBuilder sb = new StringBuilder(super.prettyPrint());
+ for (Condition c : conditions) {
+ sb.append(" condition: ");
+ sb.append(toString(c.getFamily()));
+ sb.append(":");
+ sb.append(toString(c.getQualifier()));
+ if (c.getValue() != null && !toString(c.getValue()).isBlank()) {
+ sb.append(" value: ");
+ sb.append(toString(c.getValue()));
+ }
+ if (c.getVisibility() != null && !toString(c.getVisibility()).isBlank())
{
+ sb.append(" visibility: '");
+ sb.append(toString(c.getVisibility()));
+ sb.append("'");
+ }
+ if (c.getTimestamp() != null) {
+ sb.append(" timestamp: ");
+ sb.append("'");
+ sb.append(c.getTimestamp());
+ sb.append("'");
+ }
+ if (c.getIterators().length != 0) {
+ sb.append(" iterator: ");
+ IteratorSetting[] iterators = c.getIterators();
+ for (IteratorSetting its : iterators) {
+ sb.append("'");
+ sb.append(its.toString());
+ sb.append("' ");
+ }
+ }
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
@Override
public boolean equals(Object o) {
if (o == this) {
diff --git
a/core/src/test/java/org/apache/accumulo/core/data/ConditionalMutationTest.java
b/core/src/test/java/org/apache/accumulo/core/data/ConditionalMutationTest.java
index 161dfe5c32..a563c6101b 100644
---
a/core/src/test/java/org/apache/accumulo/core/data/ConditionalMutationTest.java
+++
b/core/src/test/java/org/apache/accumulo/core/data/ConditionalMutationTest.java
@@ -25,18 +25,29 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import java.util.HashMap;
import java.util.List;
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.iterators.user.SummingCombiner;
+import org.apache.accumulo.core.iterators.user.VersioningIterator;
+import org.apache.accumulo.core.security.ColumnVisibility;
import org.apache.hadoop.io.Text;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class ConditionalMutationTest {
private static final byte[] ROW = "row".getBytes(UTF_8);
+ private static final String VALUE = "val01";
private static final String FAMILY = "family";
+ private static final String FAMILY2 = "family2";
+ private static final String FAMILY3 = "family3";
private static final String QUALIFIER = "qualifier";
private static final String QUALIFIER2 = "qualifier2";
private static final String QUALIFIER3 = "qualifier3";
+ private static final ColumnVisibility CVIS1 = new ColumnVisibility("A");
+ private static final ColumnVisibility CVIS2 = new ColumnVisibility("B|C");
+ private static final long TIMESTAMP = 1234567890;
private Condition c1, c2;
private ConditionalMutation cm;
@@ -116,6 +127,87 @@ public class ConditionalMutationTest {
assertEquals(c3, cs.get(2));
}
+ @Test
+ public void testPrettyPrint() {
+ c1 = new Condition(FAMILY, QUALIFIER);
+ cm = new ConditionalMutation(ROW, c1);
+ cm.put("name", "last", CVIS1, "doe");
+ cm.put("name", "first", CVIS1, "john");
+ cm.put("tx", "seq", CVIS1, "1");
+ String pp = cm.prettyPrint();
+ assertTrue(pp.contains("mutation: " + new String(ROW, UTF_8)));
+ assertTrue(pp.contains("update: name:last value doe"));
+ assertTrue(pp.contains("update: name:first value john"));
+ assertTrue(pp.contains("update: tx:seq value 1"));
+ assertTrue(pp.contains("condition: " + FAMILY + ":" + QUALIFIER));
+ assertFalse(pp.contains("value:"));
+ // add a value
+ c1.setValue(VALUE);
+ pp = cm.prettyPrint();
+ assertTrue(pp.contains("condition: " + FAMILY + ":" + QUALIFIER + " value:
" + VALUE));
+
+ // multiple conditions
+ c1 = new Condition(FAMILY, QUALIFIER).setValue(VALUE);
+ c2 = new Condition(FAMILY2, QUALIFIER2).setTimestamp(TIMESTAMP);
+ Condition c3 = new Condition(FAMILY3, QUALIFIER3).setVisibility(CVIS1);
+ cm = new ConditionalMutation(ROW, c1, c2, c3);
+ cm.put("name", "last", CVIS1, "doe");
+ cm.put("name", "first", CVIS1, "john");
+ pp = cm.prettyPrint();
+ assertTrue(pp.contains("mutation: " + new String(ROW, UTF_8)));
+ assertTrue(pp.contains("update: name:last value doe"));
+ assertTrue(pp.contains("update: name:first value john"));
+ assertTrue(pp.contains("condition: " + FAMILY + ":" + QUALIFIER + " value:
" + VALUE));
+ assertTrue(pp
+ .contains("condition: " + FAMILY2 + ":" + QUALIFIER2 + " timestamp: '"
+ TIMESTAMP + "'"));
+ assertTrue(pp.contains(
+ "condition: " + FAMILY3 + ":" + QUALIFIER3 + " visibility: '" +
c3.getVisibility() + "'"));
+
+ // iterators
+ IteratorSetting is1 = new IteratorSetting(5, VersioningIterator.class);
+ c1.setIterators(is1);
+ cm = new ConditionalMutation(ROW, c1);
+ cm.put("name", "last", CVIS1, "doe");
+ cm.put("name", "first", CVIS1, "john");
+ pp = cm.prettyPrint();
+ assertTrue(pp.contains("mutation: " + new String(ROW, UTF_8)));
+ assertTrue(pp.contains("update: name:last value doe"));
+ assertTrue(pp.contains("update: name:first value john"));
+ IteratorSetting[] iters = c1.getIterators();
+ assertTrue(pp.contains("condition: " + FAMILY + ":" + QUALIFIER + " value:
" + VALUE
+ + " iterator: '" + iters[0] + "'"));
+
+ // multiple iterators
+ IteratorSetting is2 = new IteratorSetting(6, SummingCombiner.class);
+ HashMap<String,String> map = new HashMap<>();
+ map.put("prop1", "val1");
+ map.put("prop2", "val2");
+ is2.addOptions(map);
+ c1.setIterators(is1, is2);
+ pp = cm.prettyPrint();
+ assertTrue(pp.contains("mutation: " + new String(ROW, UTF_8)));
+ assertTrue(pp.contains("update: name:last value doe"));
+ assertTrue(pp.contains("update: name:first value john"));
+ iters = c1.getIterators();
+ assertTrue(pp.contains("condition: " + FAMILY + ":" + QUALIFIER + " value:
" + VALUE
+ + " iterator: '" + iters[0] + "' '" + iters[1] + "'"));
+
+ // all conditions together
+ c1 = new Condition(FAMILY2,
QUALIFIER2).setValue(VALUE).setVisibility(CVIS2)
+ .setTimestamp(TIMESTAMP).setIterators(is2);
+ cm = new ConditionalMutation(ROW, c1);
+ cm.put("name", "last", CVIS1, "doe");
+ cm.put("name", "first", CVIS1, "john");
+ pp = cm.prettyPrint();
+ assertTrue(pp.contains("mutation: " + new String(ROW, UTF_8)));
+ assertTrue(pp.contains("update: name:last value doe"));
+ assertTrue(pp.contains("update: name:first value john"));
+ iters = c1.getIterators();
+ assertTrue(pp.contains("condition: " + FAMILY2 + ":" + QUALIFIER2 + "
value: " + VALUE
+ + " visibility: '" + c1.getVisibility() + "' timestamp: '" + TIMESTAMP
+ "' iterator: '"
+ + iters[0] + "'"));
+ }
+
@Test
public void testEquals() {
// reflexivity