This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new bcb99336ab HDDS-8886. Refactor RDBStoreIterator and 
TypedTableIterator. (#4930)
bcb99336ab is described below

commit bcb99336ab9bfe0d6bf04ea2c66f61dca0554de1
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Tue Jun 20 02:30:51 2023 +0800

    HDDS-8886. Refactor RDBStoreIterator and TypedTableIterator. (#4930)
---
 ...Iterator.java => RDBStoreAbstractIterator.java} | 110 ++++++++++-----------
 .../hdds/utils/db/RDBStoreByteArrayIterator.java   |  84 ++++++++++++++++
 .../org/apache/hadoop/hdds/utils/db/RDBTable.java  |   4 +-
 .../{ByteArrayKeyValue.java => RawKeyValue.java}   |  65 +++++++-----
 .../org/apache/hadoop/hdds/utils/db/Table.java     |   5 +
 .../apache/hadoop/hdds/utils/db/TableIterator.java |   5 +-
 .../apache/hadoop/hdds/utils/db/TypedTable.java    |  60 +++++++----
 ...tor.java => TestRDBStoreByteArrayIterator.java} |  59 ++++++-----
 8 files changed, 263 insertions(+), 129 deletions(-)

diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreIterator.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreAbstractIterator.java
similarity index 57%
rename from 
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreIterator.java
rename to 
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreAbstractIterator.java
index ee96072f46..e7b8fb4c63 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreIterator.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreAbstractIterator.java
@@ -14,13 +14,10 @@
  * 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.hdds.utils.db;
 
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.NoSuchElementException;
 import java.util.function.Consumer;
 
@@ -29,42 +26,61 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * RocksDB store iterator.
+ * An abstract {@link TableIterator} to iterate raw {@link Table.KeyValue}s.
+ *
+ * @param <RAW> the raw type.
  */
-public class RDBStoreIterator
-    implements TableIterator<byte[], Table.KeyValue<byte[], byte[]>> {
+public abstract class RDBStoreAbstractIterator<RAW>
+    implements TableIterator<RAW, Table.KeyValue<RAW, RAW>> {
 
   private static final Logger LOG =
-      LoggerFactory.getLogger(RDBStoreIterator.class);
+      LoggerFactory.getLogger(RDBStoreAbstractIterator.class);
 
   private final ManagedRocksIterator rocksDBIterator;
   private final RDBTable rocksDBTable;
-  private ByteArrayKeyValue currentEntry;
+  private Table.KeyValue<RAW, RAW> currentEntry;
   // This is for schemas that use a fixed-length
   // prefix for each key.
-  private byte[] prefix;
+  private final RAW prefix;
 
-  public RDBStoreIterator(ManagedRocksIterator iterator) {
-    this(iterator, null);
+  RDBStoreAbstractIterator(ManagedRocksIterator iterator, RDBTable table,
+      RAW prefix) {
+    this.rocksDBIterator = iterator;
+    this.rocksDBTable = table;
+    this.prefix = prefix;
+    seekToFirst();
   }
 
-  public RDBStoreIterator(ManagedRocksIterator iterator, RDBTable table) {
-    this(iterator, table, null);
+  /** @return the key for the current entry. */
+  abstract RAW key();
+
+  /** @return the {@link Table.KeyValue} for the current entry. */
+  abstract Table.KeyValue<RAW, RAW> getKeyValue();
+
+  /** Seek to the given key. */
+  abstract void seek0(RAW key);
+
+  /** Delete the given key. */
+  abstract void delete(RAW key) throws IOException;
+
+  /** Does the given key start with the prefix? */
+  abstract boolean startsWithPrefix(RAW key);
+
+  final ManagedRocksIterator getRocksDBIterator() {
+    return rocksDBIterator;
   }
 
-  public RDBStoreIterator(ManagedRocksIterator iterator, RDBTable table,
-      byte[] prefix) {
-    this.rocksDBIterator = iterator;
-    this.rocksDBTable = table;
-    if (prefix != null) {
-      this.prefix = Arrays.copyOf(prefix, prefix.length);
-    }
-    seekToFirst();
+  final RDBTable getRocksDBTable() {
+    return rocksDBTable;
+  }
+
+  final RAW getPrefix() {
+    return prefix;
   }
 
   @Override
-  public void forEachRemaining(
-      Consumer<? super Table.KeyValue<byte[], byte[]>> action) {
+  public final void forEachRemaining(
+      Consumer<? super Table.KeyValue<RAW, RAW>> action) {
     while (hasNext()) {
       action.accept(next());
     }
@@ -72,21 +88,20 @@ public class RDBStoreIterator
 
   private void setCurrentEntry() {
     if (rocksDBIterator.get().isValid()) {
-      currentEntry = ByteArrayKeyValue.create(rocksDBIterator.get().key(),
-          rocksDBIterator.get().value());
+      currentEntry = getKeyValue();
     } else {
       currentEntry = null;
     }
   }
 
   @Override
-  public boolean hasNext() {
+  public final boolean hasNext() {
     return rocksDBIterator.get().isValid() &&
-        (prefix == null || startsWith(prefix, rocksDBIterator.get().key()));
+        (prefix == null || startsWithPrefix(key()));
   }
 
   @Override
-  public ByteArrayKeyValue next() {
+  public final Table.KeyValue<RAW, RAW> next() {
     setCurrentEntry();
     if (currentEntry != null) {
       rocksDBIterator.get().next();
@@ -96,41 +111,41 @@ public class RDBStoreIterator
   }
 
   @Override
-  public void seekToFirst() {
+  public final void seekToFirst() {
     if (prefix == null) {
       rocksDBIterator.get().seekToFirst();
     } else {
-      rocksDBIterator.get().seek(prefix);
+      seek0(prefix);
     }
     setCurrentEntry();
   }
 
   @Override
-  public void seekToLast() {
+  public final void seekToLast() {
     if (prefix == null) {
       rocksDBIterator.get().seekToLast();
     } else {
-      throw new UnsupportedOperationException("seekToLast");
+      throw new UnsupportedOperationException("seekToLast: prefix != null");
     }
     setCurrentEntry();
   }
 
   @Override
-  public ByteArrayKeyValue seek(byte[] key) {
-    rocksDBIterator.get().seek(key);
+  public final Table.KeyValue<RAW, RAW> seek(RAW key) {
+    seek0(key);
     setCurrentEntry();
     return currentEntry;
   }
 
   @Override
-  public void removeFromDB() throws IOException {
+  public final void removeFromDB() throws IOException {
     if (rocksDBTable == null) {
       throw new UnsupportedOperationException("remove");
     }
     if (currentEntry != null) {
-      rocksDBTable.delete(currentEntry.getKey());
+      delete(currentEntry.getKey());
     } else {
-      LOG.info("Unable to delete currentEntry as it does not exist.");
+      LOG.info("Failed to removeFromDB: currentEntry == null");
     }
   }
 
@@ -138,25 +153,4 @@ public class RDBStoreIterator
   public void close() throws IOException {
     rocksDBIterator.close();
   }
-
-  private static boolean startsWith(byte[] prefix, byte[] value) {
-    if (prefix == null) {
-      return true;
-    }
-    if (value == null) {
-      return false;
-    }
-
-    int length = prefix.length;
-    if (value.length < length) {
-      return false;
-    }
-
-    for (int i = 0; i < length; i++) {
-      if (value[i] != prefix[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreByteArrayIterator.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreByteArrayIterator.java
new file mode 100644
index 0000000000..2fac7038c8
--- /dev/null
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStoreByteArrayIterator.java
@@ -0,0 +1,84 @@
+/*
+ * 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.hdds.utils.db;
+
+import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksIterator;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * RocksDB store iterator using the byte[] API.
+ */
+public class RDBStoreByteArrayIterator
+    extends RDBStoreAbstractIterator<byte[]> {
+  public RDBStoreByteArrayIterator(ManagedRocksIterator iterator,
+      RDBTable table) {
+    this(iterator, table, null);
+  }
+
+  public RDBStoreByteArrayIterator(ManagedRocksIterator iterator,
+      RDBTable table, byte[] prefix) {
+    super(iterator, table,
+        prefix == null ? null : Arrays.copyOf(prefix, prefix.length));
+  }
+
+  @Override
+  byte[] key() {
+    return getRocksDBIterator().get().key();
+  }
+
+  @Override
+  Table.KeyValue<byte[], byte[]> getKeyValue() {
+    final ManagedRocksIterator i = getRocksDBIterator();
+    return RawKeyValue.create(i.get().key(), i.get().value());
+  }
+
+  @Override
+  void seek0(byte[] key) {
+    getRocksDBIterator().get().seek(key);
+  }
+
+  @Override
+  void delete(byte[] key) throws IOException {
+    getRocksDBTable().delete(key);
+  }
+
+  @Override
+  boolean startsWithPrefix(byte[] value) {
+    final byte[] prefix = getPrefix();
+    if (prefix == null) {
+      return true;
+    }
+    if (value == null) {
+      return false;
+    }
+
+    int length = prefix.length;
+    if (value.length < length) {
+      return false;
+    }
+
+    for (int i = 0; i < length; i++) {
+      if (value[i] != prefix[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBTable.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBTable.java
index 53ca13c4da..f57a6bcfe5 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBTable.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBTable.java
@@ -217,13 +217,13 @@ class RDBTable implements Table<byte[], byte[]> {
   @Override
   public TableIterator<byte[], KeyValue<byte[], byte[]>> iterator()
       throws IOException {
-    return new RDBStoreIterator(db.newIterator(family, false), this);
+    return new RDBStoreByteArrayIterator(db.newIterator(family, false), this);
   }
 
   @Override
   public TableIterator<byte[], KeyValue<byte[], byte[]>> iterator(byte[] 
prefix)
       throws IOException {
-    return new RDBStoreIterator(db.newIterator(family, false), this,
+    return new RDBStoreByteArrayIterator(db.newIterator(family, false), this,
         prefix);
   }
 
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/ByteArrayKeyValue.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RawKeyValue.java
similarity index 56%
rename from 
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/ByteArrayKeyValue.java
rename to 
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RawKeyValue.java
index 48db1a2161..6a659b1c59 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/ByteArrayKeyValue.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RawKeyValue.java
@@ -20,18 +20,14 @@ package org.apache.hadoop.hdds.utils.db;
 
 import org.apache.hadoop.hdds.utils.db.Table.KeyValue;
 
+import java.util.Arrays;
+
 /**
- * Key value for raw Table implementations.
+ * {@link KeyValue} for a raw type.
+ *
+ * @param <RAW> The raw type.
  */
-public final class ByteArrayKeyValue implements KeyValue<byte[], byte[]> {
-  private byte[] key;
-  private byte[] value;
-
-  private ByteArrayKeyValue(byte[] key, byte[] value) {
-    this.key = key;
-    this.value = value;
-  }
-
+public abstract class RawKeyValue<RAW> implements KeyValue<RAW, RAW> {
   /**
    * Create a KeyValue pair.
    *
@@ -39,31 +35,52 @@ public final class ByteArrayKeyValue implements 
KeyValue<byte[], byte[]> {
    * @param value - Value bytes
    * @return KeyValue object.
    */
-  public static ByteArrayKeyValue create(byte[] key, byte[] value) {
-    return new ByteArrayKeyValue(key, value);
+  public static ByteArray create(byte[] key, byte[] value) {
+    return new ByteArray(key, value);
+  }
+
+  /** Implement {@link RawKeyValue} with byte[]. */
+  public static final class ByteArray extends RawKeyValue<byte[]> {
+    static byte[] copy(byte[] bytes) {
+      return Arrays.copyOf(bytes, bytes.length);
+    }
+
+    private ByteArray(byte[] key, byte[] value) {
+      super(key, value);
+    }
+
+    @Override
+    public byte[] getKey() {
+      return copy(super.getKey());
+    }
+
+    @Override
+    public byte[] getValue() {
+      return copy(super.getValue());
+    }
+  }
+
+  private final RAW key;
+  private final RAW value;
+
+  private RawKeyValue(RAW key, RAW value) {
+    this.key = key;
+    this.value = value;
   }
 
   /**
    * Return key.
-   *
-   * @return byte[]
    */
   @Override
-  public byte[] getKey() {
-    byte[] result = new byte[key.length];
-    System.arraycopy(key, 0, result, 0, key.length);
-    return result;
+  public RAW getKey() {
+    return key;
   }
 
   /**
    * Return value.
-   *
-   * @return byte[]
    */
   @Override
-  public byte[] getValue() {
-    byte[] result = new byte[value.length];
-    System.arraycopy(value, 0, result, 0, value.length);
-    return result;
+  public RAW getValue() {
+    return value;
   }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/Table.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/Table.java
index 3d85b357b1..6399718ce2 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/Table.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/Table.java
@@ -337,4 +337,9 @@ public interface Table<KEY, VALUE> extends AutoCloseable {
 
     VALUE getValue() throws IOException;
   }
+
+  /** A {@link TableIterator} to iterate {@link KeyValue}s. */
+  interface KeyValueIterator<KEY, VALUE>
+      extends TableIterator<KEY, KeyValue<KEY, VALUE>> {
+  }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TableIterator.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TableIterator.java
index ce1807356c..9a9393582c 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TableIterator.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TableIterator.java
@@ -24,9 +24,10 @@ import java.io.IOException;
 import java.util.Iterator;
 
 /**
- * Iterator for MetaDataStore DB.
+ * To iterate a {@link Table}.
  *
- * @param <T>
+ * @param <KEY> The key type to support {@link #seek(Object)}.
+ * @param <T> The type to be iterated.
  */
 public interface TableIterator<KEY, T> extends Iterator<T>, Closeable {
 
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TypedTable.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TypedTable.java
index ad5cb20e6e..7a825f9df9 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TypedTable.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/TypedTable.java
@@ -424,12 +424,12 @@ public class TypedTable<KEY, VALUE> implements Table<KEY, 
VALUE> {
   }
 
   @Override
-  public TableIterator<KEY, TypedKeyValue> iterator() throws IOException {
+  public Table.KeyValueIterator<KEY, VALUE> iterator() throws IOException {
     return new TypedTableIterator(rawTable.iterator());
   }
 
   @Override
-  public TableIterator<KEY, TypedKeyValue> iterator(KEY prefix)
+  public Table.KeyValueIterator<KEY, VALUE> iterator(KEY prefix)
       throws IOException {
     final byte[] prefixBytes = encodeKey(prefix);
     return new TypedTableIterator(rawTable.iterator(prefixBytes));
@@ -551,11 +551,11 @@ public class TypedTable<KEY, VALUE> implements Table<KEY, 
VALUE> {
   /**
    * Key value implementation for strongly typed tables.
    */
-  public class TypedKeyValue implements KeyValue<KEY, VALUE> {
+  public final class TypedKeyValue implements KeyValue<KEY, VALUE> {
 
     private final KeyValue<byte[], byte[]> rawKeyValue;
 
-    public TypedKeyValue(KeyValue<byte[], byte[]> rawKeyValue) {
+    private TypedKeyValue(KeyValue<byte[], byte[]> rawKeyValue) {
       this.rawKeyValue = rawKeyValue;
     }
 
@@ -573,15 +573,45 @@ public class TypedTable<KEY, VALUE> implements Table<KEY, 
VALUE> {
   /**
    * Table Iterator implementation for strongly typed tables.
    */
-  public class TypedTableIterator implements TableIterator<KEY, TypedKeyValue> 
{
-
-    private final TableIterator<byte[], KeyValue<byte[], byte[]>> rawIterator;
-
+  public class TypedTableIterator extends AbstractIterator<byte[]> {
     public TypedTableIterator(
         TableIterator<byte[], KeyValue<byte[], byte[]>> rawIterator) {
+      super(rawIterator);
+    }
+
+    @Override
+    byte[] convert(KEY key) throws IOException {
+      return encodeKey(key);
+    }
+
+    @Override
+    KeyValue<KEY, VALUE> convert(KeyValue<byte[], byte[]> raw) {
+      return new TypedKeyValue(raw);
+    }
+  }
+
+  /**
+   * An abstract {@link Table.KeyValueIterator} backed by a raw iterator.
+   *
+   * @param <RAW> The raw type.
+   */
+  abstract class AbstractIterator<RAW>
+      implements Table.KeyValueIterator<KEY, VALUE> {
+    private final TableIterator<RAW, KeyValue<RAW, RAW>> rawIterator;
+
+    AbstractIterator(TableIterator<RAW, KeyValue<RAW, RAW>> rawIterator) {
       this.rawIterator = rawIterator;
     }
 
+    /** Covert the given key to the {@link RAW} type. */
+    abstract RAW convert(KEY key) throws IOException;
+
+    /**
+     * Covert the given {@link Table.KeyValue}
+     * from ({@link RAW}, {@link RAW}) to ({@link KEY}, {@link VALUE}).
+     */
+    abstract KeyValue<KEY, VALUE> convert(KeyValue<RAW, RAW> raw);
+
     @Override
     public void seekToFirst() {
       rawIterator.seekToFirst();
@@ -593,13 +623,9 @@ public class TypedTable<KEY, VALUE> implements Table<KEY, 
VALUE> {
     }
 
     @Override
-    public TypedKeyValue seek(KEY key) throws IOException {
-      final byte[] keyBytes = encodeKey(key);
-      KeyValue<byte[], byte[]> result = rawIterator.seek(keyBytes);
-      if (result == null) {
-        return null;
-      }
-      return new TypedKeyValue(result);
+    public KeyValue<KEY, VALUE> seek(KEY key) throws IOException {
+      final KeyValue<RAW, RAW> result = rawIterator.seek(convert(key));
+      return result == null ? null : convert(result);
     }
 
     @Override
@@ -613,8 +639,8 @@ public class TypedTable<KEY, VALUE> implements Table<KEY, 
VALUE> {
     }
 
     @Override
-    public TypedKeyValue next() {
-      return new TypedKeyValue(rawIterator.next());
+    public KeyValue<KEY, VALUE> next() {
+      return convert(rawIterator.next());
     }
 
     @Override
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStoreIterator.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStoreByteArrayIterator.java
similarity index 86%
rename from 
hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStoreIterator.java
rename to 
hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStoreByteArrayIterator.java
index 9006fb5721..23c8dee142 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStoreIterator.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStoreByteArrayIterator.java
@@ -55,7 +55,7 @@ import static org.mockito.Mockito.when;
  * RDBStoreIterator to provide iteration over table elements in a typed manner.
  * The tests are to ensure we access RocksDB via the iterator properly.
  */
-public class TestRDBStoreIterator {
+public class TestRDBStoreByteArrayIterator {
 
   private RocksIterator rocksDBIteratorMock;
   private ManagedRocksIterator managedRocksIterator;
@@ -69,6 +69,15 @@ public class TestRDBStoreIterator {
     Logger.getLogger(ManagedRocksObjectUtils.class).setLevel(Level.DEBUG);
   }
 
+  RDBStoreByteArrayIterator newIterator() {
+    return new RDBStoreByteArrayIterator(managedRocksIterator, null);
+  }
+
+  RDBStoreByteArrayIterator newIterator(byte[] prefix) {
+    return new RDBStoreByteArrayIterator(
+        managedRocksIterator, rocksTableMock, prefix);
+  }
+
   @Test
   public void testForeachRemainingCallsConsumerWithAllElements() {
     when(rocksDBIteratorMock.isValid())
@@ -85,11 +94,11 @@ public class TestRDBStoreIterator {
     final Consumer<Table.KeyValue<byte[], byte[]>> consumerStub
         = mock(Consumer.class);
 
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
     iter.forEachRemaining(consumerStub);
 
-    ArgumentCaptor<ByteArrayKeyValue> capture =
-        ArgumentCaptor.forClass(ByteArrayKeyValue.class);
+    ArgumentCaptor<RawKeyValue.ByteArray> capture =
+        ArgumentCaptor.forClass(RawKeyValue.ByteArray.class);
     verify(consumerStub, times(3)).accept(capture.capture());
     assertArrayEquals(
         new byte[]{0x00}, capture.getAllValues().get(0).getKey());
@@ -109,7 +118,7 @@ public class TestRDBStoreIterator {
   public void testHasNextDependsOnIsvalid() {
     when(rocksDBIteratorMock.isValid()).thenReturn(true, true, false);
 
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
 
     assertTrue(iter.hasNext());
     assertFalse(iter.hasNext());
@@ -118,7 +127,7 @@ public class TestRDBStoreIterator {
   @Test
   public void testNextCallsIsValidThenGetsTheValueAndStepsToNext() {
     when(rocksDBIteratorMock.isValid()).thenReturn(true);
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
 
     InOrder verifier = inOrder(rocksDBIteratorMock);
 
@@ -132,14 +141,14 @@ public class TestRDBStoreIterator {
 
   @Test
   public void testConstructorSeeksToFirstElement() {
-    new RDBStoreIterator(managedRocksIterator);
+    newIterator();
 
     verify(rocksDBIteratorMock, times(1)).seekToFirst();
   }
 
   @Test
   public void testSeekToFirstSeeks() {
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
 
     iter.seekToFirst();
 
@@ -148,7 +157,7 @@ public class TestRDBStoreIterator {
 
   @Test
   public void testSeekToLastSeeks() {
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
 
     iter.seekToLast();
 
@@ -156,13 +165,13 @@ public class TestRDBStoreIterator {
   }
 
   @Test
-  public void testSeekReturnsTheActualKey() {
+  public void testSeekReturnsTheActualKey() throws Exception {
     when(rocksDBIteratorMock.isValid()).thenReturn(true);
     when(rocksDBIteratorMock.key()).thenReturn(new byte[]{0x00});
     when(rocksDBIteratorMock.value()).thenReturn(new byte[]{0x7f});
 
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
-    ByteArrayKeyValue val = iter.seek(new byte[]{0x55});
+    RDBStoreByteArrayIterator iter = newIterator();
+    final Table.KeyValue<byte[], byte[]> val = iter.seek(new byte[]{0x55});
 
     InOrder verifier = inOrder(rocksDBIteratorMock);
 
@@ -177,14 +186,14 @@ public class TestRDBStoreIterator {
   }
 
   @Test
-  public void testGettingTheKeyIfIteratorIsValid() {
+  public void testGettingTheKeyIfIteratorIsValid() throws Exception {
     when(rocksDBIteratorMock.isValid()).thenReturn(true);
     when(rocksDBIteratorMock.key()).thenReturn(new byte[]{0x00});
 
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
     byte[] key = null;
     if (iter.hasNext()) {
-      ByteArrayKeyValue entry = iter.next();
+      final Table.KeyValue<byte[], byte[]> entry = iter.next();
       key = entry.getKey();
     }
 
@@ -196,13 +205,13 @@ public class TestRDBStoreIterator {
   }
 
   @Test
-  public void testGettingTheValueIfIteratorIsValid() {
+  public void testGettingTheValueIfIteratorIsValid() throws Exception {
     when(rocksDBIteratorMock.isValid()).thenReturn(true);
     when(rocksDBIteratorMock.key()).thenReturn(new byte[]{0x00});
     when(rocksDBIteratorMock.value()).thenReturn(new byte[]{0x7f});
 
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
-    ByteArrayKeyValue entry;
+    RDBStoreByteArrayIterator iter = newIterator();
+    Table.KeyValue<byte[], byte[]> entry;
     byte[] key = null;
     byte[] value = null;
     if (iter.hasNext()) {
@@ -225,8 +234,8 @@ public class TestRDBStoreIterator {
     when(rocksDBIteratorMock.isValid()).thenReturn(true);
     when(rocksDBIteratorMock.key()).thenReturn(testKey);
 
-    RDBStoreIterator iter =
-        new RDBStoreIterator(managedRocksIterator, rocksTableMock);
+    RDBStoreByteArrayIterator iter =
+        new RDBStoreByteArrayIterator(managedRocksIterator, rocksTableMock);
     iter.removeFromDB();
 
     InOrder verifier = inOrder(rocksDBIteratorMock, rocksTableMock);
@@ -237,14 +246,14 @@ public class TestRDBStoreIterator {
 
   @Test
   public void testRemoveFromDBWithoutDBTableSet() {
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
     assertThrows(UnsupportedOperationException.class,
         iter::removeFromDB);
   }
 
   @Test
   public void testCloseCloses() throws Exception {
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator);
+    RDBStoreByteArrayIterator iter = newIterator();
     iter.close();
 
     verify(rocksDBIteratorMock, times(1)).close();
@@ -252,8 +261,7 @@ public class TestRDBStoreIterator {
 
   @Test
   public void testNullPrefixedIterator() throws IOException {
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator,
-        rocksTableMock, null);
+    RDBStoreByteArrayIterator iter = newIterator(null);
     verify(rocksDBIteratorMock, times(1)).seekToFirst();
     clearInvocations(rocksDBIteratorMock);
 
@@ -275,8 +283,7 @@ public class TestRDBStoreIterator {
   @Test
   public void testNormalPrefixedIterator() throws IOException {
     byte[] testPrefix = "sample".getBytes(StandardCharsets.UTF_8);
-    RDBStoreIterator iter = new RDBStoreIterator(managedRocksIterator,
-        rocksTableMock, testPrefix);
+    RDBStoreByteArrayIterator iter = newIterator(testPrefix);
     verify(rocksDBIteratorMock, times(1)).seek(testPrefix);
     clearInvocations(rocksDBIteratorMock);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to