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

Reply via email to