You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2012/05/23 05:18:39 UTC

svn commit: r1341737 - in /hbase/trunk/src: main/java/org/apache/hadoop/hbase/client/Put.java test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java

Author: tedyu
Date: Wed May 23 03:18:39 2012
New Revision: 1341737

URL: http://svn.apache.org/viewvc?rev=1341737&view=rev
Log:
HBASE-6047 Put.has() can't determine result correctly (Alex Newman)

Added:
    hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java
Modified:
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/Put.java

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/Put.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/Put.java?rev=1341737&r1=1341736&r2=1341737&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/Put.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/Put.java Wed May 23 03:18:39 2012
@@ -256,8 +256,8 @@ public class Put extends Mutation
    * @return returns true if the given family, qualifier timestamp and value
    * already has an existing KeyValue object in the family map.
    */
-  private boolean has(byte [] family, byte [] qualifier, long ts, byte [] value,
-      boolean ignoreTS, boolean ignoreValue) {
+  private boolean has(byte[] family, byte[] qualifier, long ts, byte[] value,
+                      boolean ignoreTS, boolean ignoreValue) {
     List<KeyValue> list = getKeyValueList(family);
     if (list.size() == 0) {
       return false;
@@ -268,20 +268,32 @@ public class Put extends Mutation
     // F T => 2
     // F F => 1
     if (!ignoreTS && !ignoreValue) {
-      KeyValue kv = createPutKeyValue(family, qualifier, ts, value);
-      return (list.contains(kv));
-    } else if (ignoreValue) {
-      for (KeyValue kv: list) {
+      for (KeyValue kv : list) {
+        if (Arrays.equals(kv.getFamily(), family) &&
+            Arrays.equals(kv.getQualifier(), qualifier) &&
+            Arrays.equals(kv.getValue(), value) &&
+            kv.getTimestamp() == ts) {
+          return true;
+        }
+      }
+    } else if (ignoreValue && !ignoreTS) {
+      for (KeyValue kv : list) {
         if (Arrays.equals(kv.getFamily(), family) && Arrays.equals(kv.getQualifier(), qualifier)
             && kv.getTimestamp() == ts) {
           return true;
         }
       }
+    } else if (!ignoreValue && ignoreTS) {
+      for (KeyValue kv : list) {
+        if (Arrays.equals(kv.getFamily(), family) && Arrays.equals(kv.getQualifier(), qualifier)
+            && Arrays.equals(kv.getValue(), value)) {
+          return true;
+        }
+      }
     } else {
-      // ignoreTS is always true
-      for (KeyValue kv: list) {
-      if (Arrays.equals(kv.getFamily(), family) && Arrays.equals(kv.getQualifier(), qualifier)
-              && Arrays.equals(kv.getValue(), value)) {
+      for (KeyValue kv : list) {
+        if (Arrays.equals(kv.getFamily(), family) &&
+            Arrays.equals(kv.getQualifier(), qualifier)) {
           return true;
         }
       }

Added: hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java?rev=1341737&view=auto
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java (added)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/client/TestPutDotHas.java Wed May 23 03:18:39 2012
@@ -0,0 +1,76 @@
+/*
+ * 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.hadoop.hbase.client;
+
+import org.apache.hadoop.hbase.SmallTests;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category(SmallTests.class)
+/**
+ * Addresses HBASE-6047
+ * We test put.has call with all of its polymorphic magic
+ */
+public class TestPutDotHas {
+
+  public static final byte[] ROW_01 = Bytes.toBytes("row-01");
+  public static final byte[] QUALIFIER_01 = Bytes.toBytes("qualifier-01");
+  public static final byte[] VALUE_01 = Bytes.toBytes("value-01");
+  public static final byte[] FAMILY_01 = Bytes.toBytes("family-01");
+  public static final long TS = 1234567L;
+  public Put put = new Put(ROW_01);
+
+  @Before
+  public void setUp() {
+    put.add(FAMILY_01, QUALIFIER_01, TS, VALUE_01);
+  }
+
+  @Test
+  public void testHasIgnoreValueIgnoreTS() {
+    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01));
+    Assert.assertFalse(put.has(QUALIFIER_01, FAMILY_01));
+  }
+
+  @Test
+  public void testHasIgnoreValue() {
+    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01, TS));
+    Assert.assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS + 1));
+  }
+
+  @Test
+  public void testHasIgnoreTS() {
+    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01, VALUE_01));
+    Assert.assertFalse(put.has(FAMILY_01, VALUE_01, QUALIFIER_01));
+  }
+
+  @Test
+  public void testHas() {
+    Assert.assertTrue(put.has(FAMILY_01, QUALIFIER_01, TS, VALUE_01));
+    // Bad TS
+    Assert.assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS + 1, VALUE_01));
+    // Bad Value
+    Assert.assertFalse(put.has(FAMILY_01, QUALIFIER_01, TS, QUALIFIER_01));
+    // Bad Family
+    Assert.assertFalse(put.has(QUALIFIER_01, QUALIFIER_01, TS, VALUE_01));
+    // Bad Qual
+    Assert.assertFalse(put.has(FAMILY_01, FAMILY_01, TS, VALUE_01));
+  }
+}