Skip to content
This repository has been archived by the owner on Sep 4, 2020. It is now read-only.

Commit

Permalink
Iterate using foreach for keysIterator* operations
Browse files Browse the repository at this point in the history
  • Loading branch information
nhachicha committed Oct 11, 2014
1 parent e29a446 commit fc6429d
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 11 deletions.
Expand Up @@ -16,6 +16,8 @@

package com.snappydb.sample.tests.api;

import android.annotation.TargetApi;
import android.os.Build;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;

Expand Down Expand Up @@ -750,6 +752,12 @@ public void testKeyRange() throws SnappydbException {
assertEquals("android:09", keys[1]);
assertEquals("android:11", keys[2]);

keys = snappyDB.findKeysBetween("android:04", "android:15", 3);
assertEquals(3, keys.length);
assertEquals("android:09", keys[0]);
assertEquals("android:11", keys[1]);
assertEquals("android:14", keys[2]);

// 2 case FROM exist but not TO
keys = snappyDB.findKeysBetween("android:05", "android:10");
assertEquals(3, keys.length);
Expand Down Expand Up @@ -989,4 +997,87 @@ public void testKeyIterator() throws SnappydbException, IOException {

snappyDB.destroy();
}

public void testForEachLoop() throws SnappydbException {
snappyDB = new SnappyDB.Builder(getContext()).name(dbName).build();

snappyDB.put("android:03", "Cupcake");// adding 0 to maintain the lexicographical order
snappyDB.put("android:04", "Donut");
snappyDB.put("android:05", "Eclair");
snappyDB.put("android:08", "Froyo");
snappyDB.put("android:09", "Gingerbread");
snappyDB.put("android:11", "Honeycomb");
snappyDB.put("android:14", "Ice Cream Sandwich");
snappyDB.put("android:16", "Jelly Bean");
snappyDB.put("android:19", "KitKat");

String[] expected = {"android:03",
"android:04",
"android:05",
"android:08",
"android:09",
"android:11",
"android:14",
"android:16",
"android:19"};

int i=0;
for (String key : snappyDB.findKeysIterator("android")) {
assertEquals(expected[i++], key);
}

//Two Iterators
for (String key : snappyDB.findKeysIterator("android")) {
i = 0;
for (String subkey:snappyDB.findKeysBetween("android", key)) {
assertEquals(expected[i++], subkey);
}
}

snappyDB.destroy();
}


public void testMultipleClose () throws SnappydbException, IOException {
snappyDB = new SnappyDB.Builder(getContext()).name(dbName).build();

snappyDB.put("android:03", "Cupcake");// adding 0 to maintain the lexicographical order
snappyDB.put("android:04", "Donut");
snappyDB.put("android:05", "Eclair");
snappyDB.put("android:08", "Froyo");
snappyDB.put("android:09", "Gingerbread");
snappyDB.put("android:11", "Honeycomb");
snappyDB.put("android:14", "Ice Cream Sandwich");
snappyDB.put("android:16", "Jelly Bean");
snappyDB.put("android:19", "KitKat");

KeyIterator it = snappyDB.findKeysIterator("android");
String keys[];

keys = it.next(2);
assertEquals("android:03", keys[0]);
assertEquals("android:04", keys[1]);


keys = it.next(4);
assertEquals("android:05", keys[0]);
assertEquals("android:08", keys[1]);
assertEquals("android:09", keys[2]);
assertEquals("android:11", keys[3]);

keys = it.next(2);
assertEquals("android:14", keys[0]);
assertEquals("android:16", keys[1]);

keys = it.next(5);
assertEquals("android:19", keys[0]);

assertFalse(it.hasNext());
assertFalse(it.hasNext());
it.close();
assertFalse(it.hasNext());
assertFalse(it.hasNext());

snappyDB.destroy();
}
}
3 changes: 2 additions & 1 deletion library/src/main/java/com/snappydb/KeyIterator.java
@@ -1,9 +1,10 @@
package com.snappydb;

import java.io.Closeable;
import java.io.IOException;
import java.util.Iterator;

public interface KeyIterator extends Iterator<String>, Closeable {
public interface KeyIterator extends Iterable<String>, Iterator<String>, Closeable {

public String[] next(int max);

Expand Down
31 changes: 26 additions & 5 deletions library/src/main/java/com/snappydb/internal/KeyIteratorImpl.java
Expand Up @@ -6,7 +6,9 @@
import com.snappydb.SnappydbException;

import java.io.IOException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicBoolean;

class KeyIteratorImpl implements KeyIterator {

Expand All @@ -15,7 +17,6 @@ class KeyIteratorImpl implements KeyIterator {
private final boolean reverse;

private long ptr;

private String nextKey;

protected KeyIteratorImpl(DBImpl db, long ptr, String endPrefix, boolean reverse) {
Expand Down Expand Up @@ -45,15 +46,30 @@ protected void finalize() throws Throwable {

@Override
public boolean hasNext() {
return nextKey != null;
if (nextKey == null) {
if (ptr != 0) {
try {//auto close the Iterator (if the user is traversing the keys with a for-each loop)
close();
ptr = 0;
} catch (IOException e) {
throw new RuntimeException(e);
}
}

return false;

} else {
return true;
}
}

@Override
public String next() {
if (nextKey == null) {
throw new NoSuchElementException();
}
try {
if (nextKey == null) {
throw new NoSuchElementException();
}

String key = nextKey;
nextKey = db.__iteratorNextKey(ptr, endPrefix, reverse);
return key;
Expand All @@ -80,4 +96,9 @@ public String[] next(int max) {
public void remove() {
throw new UnsupportedOperationException();
}

@Override
public Iterator<String> iterator() {
return this;
}
}
10 changes: 5 additions & 5 deletions library/src/main/jni/snappydb.cpp
Expand Up @@ -768,7 +768,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_snappydb_internal_DBImpl__1_1findKeys
std::vector<std::string>::size_type n = result.size();
jobjectArray ret= (jobjectArray)env->NewObjectArray(n,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
NULL);

jstring str;
for (int i=0; i<n ; i++) {
Expand Down Expand Up @@ -948,8 +948,8 @@ JNIEXPORT jstring JNICALL Java_com_snappydb_internal_DBImpl__1_1iteratorNextKey
if (jEndPrefix) {
const char* endPrefix = env->GetStringUTFChars(jEndPrefix, 0);
if ((!reverse && it->key().compare(endPrefix) > 0) || (reverse && it->key().compare(endPrefix) < 0)) {
return NULL;
env->ReleaseStringUTFChars(jEndPrefix, endPrefix);
return NULL;
}
env->ReleaseStringUTFChars(jEndPrefix, endPrefix);
}
Expand Down Expand Up @@ -983,8 +983,8 @@ JNIEXPORT jobjectArray JNICALL Java_com_snappydb_internal_DBImpl__1_1iteratorNex
while (count < max && it->Valid() && (!endPrefix || (!reverse && it->key().compare(endPrefix) <= 0) || (reverse && it->key().compare(endPrefix) >= 0))) {
result.push_back(it->key().ToString());
++count;
if (reverse) { it->Prev(); }
else { it->Next(); }
if (reverse) { it->Prev(); }
else { it->Next(); }
}

if (jEndPrefix) {
Expand Down Expand Up @@ -1019,8 +1019,8 @@ JNIEXPORT jstring JNICALL Java_com_snappydb_internal_DBImpl__1_1iteratorKey
if (jEndPrefix) {
const char* endPrefix = env->GetStringUTFChars(jEndPrefix, 0);
if ((!reverse && it->key().compare(endPrefix) > 0) || (reverse && it->key().compare(endPrefix) < 0)) {
return NULL;
env->ReleaseStringUTFChars(jEndPrefix, endPrefix);
return NULL;
}
env->ReleaseStringUTFChars(jEndPrefix, endPrefix);
}
Expand Down

0 comments on commit fc6429d

Please sign in to comment.