accumulo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ktur...@apache.org
Subject [1/2] git commit: ACCUMULO-1627 Add equals() and hashCode() for Condition, ConditionalMutation; refine equals() implementation for Mutation and subclasses.
Date Tue, 08 Oct 2013 21:05:56 GMT
Updated Branches:
  refs/heads/master e70a40dba -> 70031c4dc


ACCUMULO-1627 Add equals() and hashCode() for Condition, ConditionalMutation; refine equals()
implementation for Mutation and subclasses.

Signed-off-by: Keith Turner <kturner@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/4ac31c3f
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/4ac31c3f
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/4ac31c3f

Branch: refs/heads/master
Commit: 4ac31c3f9df7388f1be3d29865fbb534106bd77d
Parents: e70a40d
Author: Bill Havanki <bhavanki@cloudera.com>
Authored: Wed Sep 25 15:24:42 2013 -0400
Committer: Keith Turner <kturner@apache.org>
Committed: Tue Oct 8 15:20:44 2013 -0400

----------------------------------------------------------------------
 .../apache/accumulo/core/data/Condition.java    |  43 ++++
 .../accumulo/core/data/ConditionalMutation.java |  21 ++
 .../org/apache/accumulo/core/data/Mutation.java |  21 +-
 .../accumulo/core/data/ConditionTest.java       | 206 +++++++++++++++++++
 .../core/data/ConditionalMutationTest.java      | 146 +++++++++++++
 .../accumulo/server/data/ServerMutation.java    |  22 ++
 6 files changed, 456 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/4ac31c3f/core/src/main/java/org/apache/accumulo/core/data/Condition.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/data/Condition.java b/core/src/main/java/org/apache/accumulo/core/data/Condition.java
index 97df7e0..df20682 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/Condition.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/Condition.java
@@ -16,6 +16,7 @@
  */
 package org.apache.accumulo.core.data;
 
+import java.util.Arrays;
 import java.util.HashSet;
 
 import org.apache.accumulo.core.Constants;
@@ -145,4 +146,46 @@ public class Condition {
     return iterators;
   }
 
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+    if (o == null || o.getClass() != Condition.class) {
+      return false;
+    }
+    Condition c = (Condition) o;
+    if (!(c.cf.equals(cf))) {
+      return false;
+    }
+    if (!(c.cq.equals(cq))) {
+      return false;
+    }
+    if (!(c.cv.equals(cv))) {
+      return false;
+    }
+    if (!(c.val == null ? val == null : c.val.equals(val))) {
+      return false;
+    }
+    if (!(c.ts == null ? ts == null : c.ts.equals(ts))) {
+      return false;
+    }
+    if (!(Arrays.equals(c.iterators, iterators))) {
+      return false;
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = 17;
+    result = 31 * result + cf.hashCode();
+    result = 31 * result + cq.hashCode();
+    result = 31 * result + cv.hashCode();
+    result = 31 * result + (val == null ? 0 : val.hashCode());
+    result = 31 * result + (ts == null ? 0 : ts.hashCode());
+    result = 31 * result + Arrays.hashCode(iterators);
+    return result;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/4ac31c3f/core/src/main/java/org/apache/accumulo/core/data/ConditionalMutation.java
----------------------------------------------------------------------
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 23bf7d0..510396d 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
@@ -80,4 +80,25 @@ public class ConditionalMutation extends Mutation {
     return Collections.unmodifiableList(conditions);
   }
 
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+    if (o == null || o.getClass() != ConditionalMutation.class) {
+      return false;
+    }
+    ConditionalMutation cm = (ConditionalMutation) o;
+    if (!conditions.equals(cm.conditions)) {
+      return false;
+    }
+    return super.equals(o);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = super.hashCode();
+    result = 37 * result + conditions.hashCode();
+    return result;
+  }
 }

http://git-wip-us.apache.org/repos/asf/accumulo/blob/4ac31c3f/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/data/Mutation.java b/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
index 161b239..5e281f2 100644
--- a/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
+++ b/core/src/main/java/org/apache/accumulo/core/data/Mutation.java
@@ -567,8 +567,12 @@ public class Mutation implements Writable {
   
   @Override
   public boolean equals(Object o) {
-    if (o instanceof Mutation)
-      return equals((Mutation) o);
+    if (o == this) {
+      return true;
+    }
+    if (o != null && o.getClass().equals(this.getClass())) {
+      return equalMutation((Mutation) o);
+    }
     return false;
   }
   
@@ -576,8 +580,19 @@ public class Mutation implements Writable {
   public int hashCode() {
     return toThrift().hashCode();
   }
-  
+
+  /**
+   * Checks if this mutation equals another. This method may be removed in a
+   * future API revision in favor of {@link #equals(Object)}. See ACCUMULO-1627
+   * for more information.
+   *
+   * @param m mutation
+   * @return true if the given mutation equals this one, false otehrwise
+   */
   public boolean equals(Mutation m) {
+    return this.equals((Object) m);
+  }
+  private boolean equalMutation(Mutation m) {
     serialize();
     m.serialize();
     if (Arrays.equals(row, m.row) && entries == m.entries && Arrays.equals(data,
m.data)) {

http://git-wip-us.apache.org/repos/asf/accumulo/blob/4ac31c3f/core/src/test/java/org/apache/accumulo/core/data/ConditionTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/accumulo/core/data/ConditionTest.java b/core/src/test/java/org/apache/accumulo/core/data/ConditionTest.java
new file mode 100644
index 0000000..37ffea2
--- /dev/null
+++ b/core/src/test/java/org/apache/accumulo/core/data/ConditionTest.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.core.data;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.security.ColumnVisibility;
+import org.apache.hadoop.io.Text;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class ConditionTest {
+  private static final ByteSequence EMPTY = new ArrayByteSequence(new byte[0]);
+  private static final String FAMILY = "family";
+  private static final String QUALIFIER = "qualifier";
+  private static final String VISIBILITY = "visibility";
+  private static final String VALUE = "value";
+  private static final IteratorSetting[] ITERATORS = {new IteratorSetting(1, "first", "someclass"),
new IteratorSetting(2, "second", "someotherclass"),
+      new IteratorSetting(3, "third", "yetanotherclass")};
+
+  private String toString(ByteSequence bs) {
+    if (bs == null) {
+      return null;
+    }
+    return new String(bs.toArray(), Constants.UTF8);
+  }
+
+  private Condition c;
+
+  @Before
+  public void setUp() throws Exception {
+    c = new Condition(FAMILY, QUALIFIER);
+  }
+
+  @Test
+  public void testConstruction_CharSequence() {
+    assertEquals(FAMILY, toString(c.getFamily()));
+    assertEquals(QUALIFIER, toString(c.getQualifier()));
+    assertEquals(EMPTY, c.getVisibility());
+  }
+
+  @Test
+  public void testConstruction_ByteArray() {
+    c = new Condition(FAMILY.getBytes(Constants.UTF8), QUALIFIER.getBytes(Constants.UTF8));
+    assertEquals(FAMILY, toString(c.getFamily()));
+    assertEquals(QUALIFIER, toString(c.getQualifier()));
+    assertEquals(EMPTY, c.getVisibility());
+  }
+
+  @Test
+  public void testConstruction_Text() {
+    c = new Condition(new Text(FAMILY), new Text(QUALIFIER));
+    assertEquals(FAMILY, toString(c.getFamily()));
+    assertEquals(QUALIFIER, toString(c.getQualifier()));
+    assertEquals(EMPTY, c.getVisibility());
+  }
+
+  @Test
+  public void testConstruction_ByteSequence() {
+    c = new Condition(new ArrayByteSequence(FAMILY.getBytes(Constants.UTF8)), new ArrayByteSequence(QUALIFIER.getBytes(Constants.UTF8)));
+    assertEquals(FAMILY, toString(c.getFamily()));
+    assertEquals(QUALIFIER, toString(c.getQualifier()));
+    assertEquals(EMPTY, c.getVisibility());
+  }
+
+  @Test
+  public void testGetSetTimestamp() {
+    c.setTimestamp(1234L);
+    assertEquals(Long.valueOf(1234L), c.getTimestamp());
+  }
+
+  @Test
+  public void testSetValue_CharSequence() {
+    c.setValue(VALUE);
+    assertEquals(VALUE, toString(c.getValue()));
+  }
+
+  @Test
+  public void testSetValue_ByteArray() {
+    c.setValue(VALUE.getBytes(Constants.UTF8));
+    assertEquals(VALUE, toString(c.getValue()));
+  }
+
+  @Test
+  public void testSetValue_Text() {
+    c.setValue(new Text(VALUE));
+    assertEquals(VALUE, toString(c.getValue()));
+  }
+
+  @Test
+  public void testSetValue_ByteSequence() {
+    c.setValue(new ArrayByteSequence(VALUE.getBytes(Constants.UTF8)));
+    assertEquals(VALUE, toString(c.getValue()));
+  }
+
+  @Test
+  public void testGetSetVisibility() {
+    ColumnVisibility vis = new ColumnVisibility(VISIBILITY);
+    c.setVisibility(vis);
+    assertEquals(VISIBILITY, toString(c.getVisibility()));
+  }
+
+  @Test
+  public void testGetSetIterators() {
+    c.setIterators(ITERATORS);
+    assertArrayEquals(ITERATORS, c.getIterators());
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testSetIterators_DuplicateName() {
+    IteratorSetting[] iterators = {new IteratorSetting(1, "first", "someclass"), new IteratorSetting(2,
"second", "someotherclass"),
+        new IteratorSetting(3, "first", "yetanotherclass")};
+    c.setIterators(iterators);
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testSetIterators_DuplicatePriority() {
+    IteratorSetting[] iterators = {new IteratorSetting(1, "first", "someclass"), new IteratorSetting(2,
"second", "someotherclass"),
+        new IteratorSetting(1, "third", "yetanotherclass")};
+    c.setIterators(iterators);
+  }
+
+  @Test
+  public void testEquals() {
+    ColumnVisibility cvis = new ColumnVisibility(VISIBILITY);
+    c.setVisibility(cvis);
+    c.setValue(VALUE);
+    c.setTimestamp(1234L);
+    c.setIterators(ITERATORS);
+
+    // reflexivity
+    assertTrue(c.equals(c));
+
+    // non-nullity
+    assertFalse(c.equals(null));
+
+    // symmetry
+    Condition c2 = new Condition(FAMILY, QUALIFIER);
+    c2.setVisibility(cvis);
+    c2.setValue(VALUE);
+    c2.setTimestamp(1234L);
+    c2.setIterators(ITERATORS);
+    assertTrue(c.equals(c2));
+    assertTrue(c2.equals(c));
+
+    Condition c3 = new Condition("nope", QUALIFIER);
+    c3.setVisibility(cvis);
+    c3.setValue(VALUE);
+    c3.setTimestamp(1234L);
+    c3.setIterators(ITERATORS);
+    assertFalse(c.equals(c3));
+    c3 = new Condition(FAMILY, "nope");
+    c3.setVisibility(cvis);
+    c3.setValue(VALUE);
+    c3.setTimestamp(1234L);
+    c3.setIterators(ITERATORS);
+    assertFalse(c.equals(c3));
+
+    c2.setVisibility(new ColumnVisibility("sekrit"));
+    assertFalse(c.equals(c2));
+    c2.setVisibility(cvis);
+    c2.setValue(EMPTY);
+    assertFalse(c.equals(c2));
+    c2.setValue(VALUE);
+    c2.setTimestamp(2345L);
+    assertFalse(c.equals(c2));
+    c2.setTimestamp(1234L);
+    c2.setIterators(new IteratorSetting[0]);
+    assertFalse(c.equals(c2));
+    c2.setIterators(ITERATORS);
+    assertTrue(c.equals(c2));
+  }
+
+  @Test
+  public void testHashCode() {
+    ColumnVisibility cvis = new ColumnVisibility(VISIBILITY);
+    c.setVisibility(cvis);
+    c.setValue(VALUE);
+    c.setTimestamp(1234L);
+    c.setIterators(ITERATORS);
+    int hc1 = c.hashCode();
+
+    Condition c2 = new Condition(FAMILY, QUALIFIER);
+    c2.setVisibility(cvis);
+    c2.setValue(VALUE);
+    c2.setTimestamp(1234L);
+    c2.setIterators(ITERATORS);
+    assertTrue(c.equals(c2));
+    assertEquals(hc1, c2.hashCode());
+  }
+}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/4ac31c3f/core/src/test/java/org/apache/accumulo/core/data/ConditionalMutationTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..1dcee99
--- /dev/null
+++ b/core/src/test/java/org/apache/accumulo/core/data/ConditionalMutationTest.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.core.data;
+
+import java.util.List;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.hadoop.io.Text;
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class ConditionalMutationTest {
+  private static final byte[] ROW = "row".getBytes(Constants.UTF8);
+  private static final String FAMILY = "family";
+  private static final String QUALIFIER = "qualifier";
+  private static final String QUALIFIER2 = "qualifier2";
+  private static final String QUALIFIER3 = "qualifier3";
+
+  private Condition c1, c2;
+  private ConditionalMutation cm;
+
+  @Before
+  public void setUp() throws Exception {
+    c1 = new Condition(FAMILY, QUALIFIER);
+    c2 = new Condition(FAMILY, QUALIFIER2);
+    assertFalse(c1.equals(c2));
+    cm = new ConditionalMutation(ROW, c1, c2);
+  }
+
+  @Test
+  public void testConstruction_ByteArray() {
+    assertArrayEquals(ROW, cm.getRow());
+    List<Condition> cs = cm.getConditions();
+    assertEquals(2, cs.size());
+    assertEquals(c1, cs.get(0));
+    assertEquals(c2, cs.get(1));
+  }
+
+  @Test
+  public void testConstruction_ByteArray_StartAndLength() {
+    cm = new ConditionalMutation(ROW, 1, 1, c1, c2);
+    assertArrayEquals("o".getBytes(Constants.UTF8), cm.getRow());
+    List<Condition> cs = cm.getConditions();
+    assertEquals(2, cs.size());
+    assertEquals(c1, cs.get(0));
+    assertEquals(c2, cs.get(1));
+  }
+
+  @Test
+  public void testConstruction_Text() {
+    cm = new ConditionalMutation(new Text(ROW), c1, c2);
+    assertArrayEquals(ROW, cm.getRow());
+    List<Condition> cs = cm.getConditions();
+    assertEquals(2, cs.size());
+    assertEquals(c1, cs.get(0));
+    assertEquals(c2, cs.get(1));
+  }
+
+  @Test
+  public void testConstruction_CharSequence() {
+    cm = new ConditionalMutation(new String(ROW, Constants.UTF8), c1, c2);
+    assertArrayEquals(ROW, cm.getRow());
+    List<Condition> cs = cm.getConditions();
+    assertEquals(2, cs.size());
+    assertEquals(c1, cs.get(0));
+    assertEquals(c2, cs.get(1));
+  }
+
+  @Test
+  public void testConstruction_ByteSequence() {
+    cm = new ConditionalMutation(new ArrayByteSequence(ROW), c1, c2);
+    assertArrayEquals(ROW, cm.getRow());
+    List<Condition> cs = cm.getConditions();
+    assertEquals(2, cs.size());
+    assertEquals(c1, cs.get(0));
+    assertEquals(c2, cs.get(1));
+  }
+
+  @Test
+  public void testCopyConstructor() {
+    ConditionalMutation cm2 = new ConditionalMutation(cm);
+    assertArrayEquals(cm.getRow(), cm2.getRow());
+    assertEquals(cm.getConditions(), cm2.getConditions());
+  }
+
+  @Test
+  public void testAddCondition() {
+    Condition c3 = new Condition(FAMILY, QUALIFIER3);
+    cm.addCondition(c3);
+    List<Condition> cs = cm.getConditions();
+    assertEquals(3, cs.size());
+    assertEquals(c1, cs.get(0));
+    assertEquals(c2, cs.get(1));
+    assertEquals(c3, cs.get(2));
+  }
+
+  @Test
+  public void testEquals() {
+    // reflexivity
+    assertTrue(cm.equals(cm));
+
+    // non-nullity
+    assertFalse(cm.equals((Object) null));
+
+    // symmetry
+    ConditionalMutation cm2 = new ConditionalMutation(ROW, c1, c2);
+    assertTrue(cm.equals(cm2));
+    assertTrue(cm2.equals(cm));
+
+    ConditionalMutation cm3 = new ConditionalMutation("row2".getBytes(Constants.UTF8), c1,
c2);
+    assertFalse(cm.equals(cm3));
+    cm3 = new ConditionalMutation(ROW, c2, c1);
+    assertFalse(cm.getConditions().equals(cm3.getConditions()));
+    assertFalse(cm.equals(cm3));
+  }
+
+  @Test
+  public void testEquals_Mutation() {
+    Mutation m = new Mutation(ROW);
+    assertFalse(m.equals(cm));
+    assertFalse(cm.equals(m));
+  }
+
+  @Test
+  public void testHashcode() {
+    int hc1 = cm.hashCode();
+    ConditionalMutation cm2 = new ConditionalMutation(ROW, c1, c2);
+    assertTrue(cm.equals(cm2));
+    assertEquals(cm2.hashCode(), cm.hashCode());
+  }
+}

http://git-wip-us.apache.org/repos/asf/accumulo/blob/4ac31c3f/server/src/main/java/org/apache/accumulo/server/data/ServerMutation.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/accumulo/server/data/ServerMutation.java b/server/src/main/java/org/apache/accumulo/server/data/ServerMutation.java
index 28a3515..389cc33 100644
--- a/server/src/main/java/org/apache/accumulo/server/data/ServerMutation.java
+++ b/server/src/main/java/org/apache/accumulo/server/data/ServerMutation.java
@@ -78,4 +78,26 @@ public class ServerMutation extends Mutation {
   public long estimatedMemoryUsed() {
     return super.estimatedMemoryUsed() + 8;
   }
+
+  @Override
+  public boolean equals(Object o) {
+    if (o == this) {
+      return true;
+    }
+    if (o == null || o.getClass() != ServerMutation.class) {
+      return false;
+    }
+    ServerMutation sm = (ServerMutation) o;
+    if (sm.systemTime != systemTime) {
+      return false;
+    }
+    return super.equals(o);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = super.hashCode();
+    result = 31 * result + (int) (systemTime & 0xffffffff);
+    return result;
+  }
 }


Mime
View raw message