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 <jmar...@apache.org> 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