Skip to content

Commit

Permalink
change prev():
Browse files Browse the repository at this point in the history
1. prev(): return current and then prev.
2. hasPrev(): is equal to Valid(),hasNext().
3. peekPrev() is equal to peekNext(), peekPrev() and peekNext() is marked as Deprecated, use key(),value().
  • Loading branch information
halibobo1205 committed Aug 23, 2022
1 parent fd7446f commit ca2b1b2
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 66 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
<forge-project-id-uc>LEVELDBJNI</forge-project-id-uc>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hawtjni-version>1.18</hawtjni-version>
<leveldb-api-version>1.23</leveldb-api-version>
<leveldb-api-version>1.23.1</leveldb-api-version>
<junit-version>4.13.2</junit-version>
<jacoco.version>0.8.8</jacoco.version>
</properties>
Expand Down
55 changes: 23 additions & 32 deletions src/main/java/org/fusesource/leveldbjni/internal/JniDBIterator.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public void remove() {
* Position at the first key in the source that is at or past target.
* The iterator is Valid() after this call iff the source contains
* an entry that comes at or past target.
*
* If key > max key, Valid() return false.
* @param key
*/
public void seek(byte[] key) {
Expand Down Expand Up @@ -161,7 +161,11 @@ public byte[] value() {
}
}


/**
*
* @return the current entry.
*/
@Deprecated
public Map.Entry<byte[], byte[]> peekNext() {
if (!iterator.isValid()) {
throw new NoSuchElementException();
Expand Down Expand Up @@ -193,37 +197,26 @@ public Map.Entry<byte[], byte[]> next() {
return rc;
}

/**
* Keep same as hasNext.
* Used in combination with pre().
* @return
*/
public boolean hasPrev() {
if (!iterator.isValid()) {
return false;
}
try {
iterator.prev();
try {
return iterator.isValid();
} finally {
if (iterator.isValid()) {
iterator.next();
} else {
iterator.seekToFirst();
}
}
} catch (NativeDB.DBException e) {
throw new RuntimeException(e);
}
return iterator.isValid();
}

/**
* Keep same as peekNext
* @return the current entry.
*/
@Deprecated
public Map.Entry<byte[], byte[]> peekPrev() {
if (!iterator.isValid()) {
throw new NoSuchElementException();
}
try {
try {
return this.prev();
} finally {
if (iterator.isValid()) {
iterator.next();
} else {
iterator.seekToFirst();
}
}
return new AbstractMap.SimpleImmutableEntry<>(iterator.key(), iterator.value());
} catch (NativeDB.DBException e) {
throw new RuntimeException(e);
}
Expand All @@ -236,14 +229,12 @@ public Map.Entry<byte[], byte[]> peekPrev() {
* @return the current entry.
*/
public Map.Entry<byte[], byte[]> prev() {
if (!iterator.isValid()) {
throw new NoSuchElementException();
}
Map.Entry<byte[], byte[]> rc = this.peekPrev();
try {
iterator.prev();
return this.peekNext();
} catch (NativeDB.DBException e) {
throw new RuntimeException(e);
}
return rc;
}
}
92 changes: 59 additions & 33 deletions src/test/java/org/fusesource/leveldbjni/test/DBTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -796,9 +796,9 @@ public void testSeekAndIterator() throws IOException {
// check hasPrev
//
it.seek(key_001);
assertFalse(it.hasPrev());
assertTrue(it.hasPrev());
it.seek(key_025);
assertFalse(it.hasPrev());
assertTrue(it.hasPrev());
it.seek(key_050);
assertTrue(it.hasPrev());
it.seek(key_055);
Expand All @@ -807,18 +807,26 @@ public void testSeekAndIterator() throws IOException {
assertTrue(it.hasPrev());
it.seek(key_100);
assertFalse(it.hasPrev()); // TODO: Expected result?

it.seekForPrev(key_100);
assertTrue(it.hasPrev());
//
// check prev:
//
it.seek(key_001);
entry = it.prev();
assertEquals(key_025, entry.getKey());
assertEquals(value_025, entry.getValue());

try {
it.prev();
fail("NoSuchElementException is expected");
} catch (NoSuchElementException ex) {
}

it.seek(key_025);
entry = it.prev();
assertEquals(key_025, entry.getKey());
assertEquals(value_025, entry.getValue());
try {
it.prev();
fail("NoSuchElementException is expected");
Expand All @@ -827,23 +835,45 @@ public void testSeekAndIterator() throws IOException {

it.seek(key_050);
entry = it.prev();
assertEquals(key_025, entry.getKey());
assertEquals(value_025, entry.getValue());
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_025, it.key());
assertEquals(value_025, it.value());

it.seek(key_055);
it.prev();
entry = it.prev();
assertEquals(key_075, entry.getKey());
assertEquals(value_075, entry.getValue());
assertEquals(key_050, it.key());
assertEquals(value_050, it.value());

it.seek(key_065);
it.seekForPrev(key_055);
entry = it.prev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_025, it.key());
assertEquals(value_025, it.value());

it.seek(key_075);
it.seek(key_065);
entry = it.prev();
assertEquals(key_075, entry.getKey());
assertEquals(value_075, entry.getValue());
assertEquals(key_050, it.key());
assertEquals(value_050, it.value());

it.seekForPrev(key_065);
entry = it.prev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_025, it.key());
assertEquals(value_025, it.value());

it.seek(key_075);
entry = it.prev();
assertEquals(key_075, entry.getKey());
assertEquals(value_075, entry.getValue());
assertEquals(key_050, it.key());
assertEquals(value_050, it.value());

it.seek(key_100);
try {
Expand All @@ -856,43 +886,37 @@ public void testSeekAndIterator() throws IOException {
// check peekPrev:
//
it.seek(key_001);
try {
it.peekPrev();
fail("NoSuchElementException is expected");
} catch (NoSuchElementException ex) {
}
it.peekPrev();


it.seek(key_025);
try {
it.peekPrev();
fail("NoSuchElementException is expected");
} catch (NoSuchElementException ex) {
}
it.peekPrev();


it.seek(key_050);
entry = it.peekPrev();
assertEquals(key_025, entry.getKey());
assertEquals(value_025, entry.getValue());
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());

it.seek(key_075);
entry = it.peekPrev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_075, entry.getKey());
assertEquals(value_075, entry.getValue());

it.seek(key_055);
it.seekForPrev(key_055);
entry = it.peekPrev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());

it.seek(key_065);
it.seekForPrev(key_065);
entry = it.peekPrev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());

it.seek(key_075);
it.seekForPrev(key_075);
entry = it.peekPrev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_075, entry.getKey());
assertEquals(value_075, entry.getValue());

it.seek(key_100);
try {
Expand Down Expand Up @@ -957,17 +981,21 @@ public void testIteratorNegative() throws IOException {
//
it.seekToLast();
entry = it.prev();
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_075, entry.getKey());
assertEquals(value_075, entry.getValue());
assertEquals(key_050, it.key());
assertEquals(value_050, it.value());

entry = it.prev();
assertEquals(key_025, entry.getKey());
assertEquals(value_025, entry.getValue());
assertEquals(key_050, entry.getKey());
assertEquals(value_050, entry.getValue());
assertEquals(key_025, it.key());
assertEquals(value_025, it.value());

entry = it.prev();
assertEquals(key_025, entry.getKey());
assertEquals(value_025, entry.getValue());

try {
it.prev();
fail("NoSuchElementException is expected");
Expand Down Expand Up @@ -1014,7 +1042,6 @@ public void testIteratorNegative2() throws IOException {
System.out.println();

iterable3.seekToLast();
System.out.println("iterable3:" + fromByteArray(iterable3.peekNext().getKey()));
while (iterable3.hasPrev()) {
System.out.println("iterable3:" + fromByteArray(iterable3.prev().getKey()));
}
Expand All @@ -1025,7 +1052,6 @@ public void testIteratorNegative2() throws IOException {
System.out.println("iterable4:" + fromByteArray(key));

}
System.out.println("iterable4:" + fromByteArray(iterable4.peekNext().getKey()));
iterable.close();
iterable2.close();
iterable3.close();
Expand Down

0 comments on commit ca2b1b2

Please sign in to comment.