diff options
| author | Brian S. O'Neill <bronee@gmail.com> | 2011-05-04 00:20:02 +0000 |
|---|---|---|
| committer | Brian S. O'Neill <bronee@gmail.com> | 2011-05-04 00:20:02 +0000 |
| commit | 856bebd5f8bf46293edc083aa1a1e9fadab25e70 (patch) | |
| tree | ab8ffc3f5ac1b2d1f2dcfa8942ab8986545c694c | |
| parent | 8985b47069e97df435f44b066bdd3be1c9c83407 (diff) | |
Add support for Query controller and timeouts; remove vestigial support for interrupts.
7 files changed, 233 insertions, 4 deletions
diff --git a/src/test/java/com/amazon/carbonado/TestStorables.java b/src/test/java/com/amazon/carbonado/TestStorables.java index ab78a41..20f640d 100644 --- a/src/test/java/com/amazon/carbonado/TestStorables.java +++ b/src/test/java/com/amazon/carbonado/TestStorables.java @@ -233,7 +233,6 @@ public class TestStorables extends TestCase { catch (UniqueConstraintException e) { } - Storage<StorableTestMultiPK> storageMPK = getRepository().storageFor(StorableTestMultiPK.class); StorableTestMultiPK smpk = storageMPK.prepare(); @@ -250,7 +249,6 @@ public class TestStorables extends TestCase { } public void test_storableStorableStates() throws Exception { - Storage<StorableTestKeyValue> storageMinimal = getRepository().storageFor(StorableTestKeyValue.class); @@ -3454,6 +3452,67 @@ public class TestStorables extends TestCase { assertNull(order); } + public void test_countTimeout() throws Exception { + Storage<StorableTestMinimal> storage = + getRepository().storageFor(StorableTestMinimal.class); + + Transaction txn = getRepository().enterTransaction(); + try { + for (int i=0; i<100000; i++) { + StorableTestMinimal min = storage.prepare(); + min.setId(i); + min.insert(); + if (i % 100 == 0) { + txn.commit(); + } + } + txn.commit(); + } finally { + txn.exit(); + } + + try { + // Use filter to bypass optimizations. + storage.query("id >= ?").with(0).count(Query.Timeout.millis(1)); + fail(); + } catch (FetchInterruptedException e) { + } + } + + public void test_fetchTimeout() throws Exception { + Storage<StorableTestBasic> storage = + getRepository().storageFor(StorableTestBasic.class); + + Transaction txn = getRepository().enterTransaction(); + try { + for (int i=0; i<100000; i++) { + StorableTestBasic stb = storage.prepare(); + stb.setId(i); + stb.setStringProp("str " + Math.random()); + stb.setIntProp(i); + stb.setLongProp(i); + stb.setDoubleProp(i); + stb.insert(); + if (i % 100 == 0) { + txn.commit(); + } + } + txn.commit(); + } finally { + txn.exit(); + } + + try { + Cursor<StorableTestBasic> cursor = + storage.query().orderBy("stringProp").fetch(Query.Timeout.millis(1)); + while (cursor.hasNext()) { + cursor.next(); + } + fail(); + } catch (FetchInterruptedException e) { + } + } + private void assertUninitialized(boolean expected, Storable storable, String... properties) { for (String property : properties) { assertEquals(expected, storable.isPropertyUninitialized(property)); diff --git a/src/test/java/com/amazon/carbonado/cursor/TestCursors.java b/src/test/java/com/amazon/carbonado/cursor/TestCursors.java index 7c4e3de..3b8b305 100644 --- a/src/test/java/com/amazon/carbonado/cursor/TestCursors.java +++ b/src/test/java/com/amazon/carbonado/cursor/TestCursors.java @@ -28,6 +28,8 @@ import junit.framework.TestSuite; import com.amazon.carbonado.Cursor;
import com.amazon.carbonado.FetchException;
+import com.amazon.carbonado.FetchInterruptedException;
+import com.amazon.carbonado.Query;
import com.amazon.carbonado.stored.Dummy;
import com.amazon.carbonado.stored.StorableTestMinimal;
@@ -446,6 +448,23 @@ public class TestCursors extends TestCase { compareElements(diff, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4, 4, 4);
}
+ public void testFetchTimeout() throws Exception {
+ Infinite inf = new Infinite();
+ long start = System.nanoTime();
+ Cursor<Element> cursor = ControllerCursor.apply(inf, Query.Timeout.seconds(2));
+ try {
+ while (cursor.hasNext()) {
+ cursor.next();
+ }
+ fail();
+ } catch (FetchInterruptedException e) {
+ long end = System.nanoTime();
+ assertTrue(inf.mClosed);
+ double duration = (end - start) / 1000000000.0d;
+ assertTrue(1.5 <= duration && duration <= 2.5);
+ }
+ }
+
private Cursor<Element> createElements(int... ids) {
Arrays.sort(ids);
Element[] elements = new Element[ids.length];
@@ -511,4 +530,21 @@ public class TestCursors extends TestCase { return 0;
}
}
+
+ private static class Infinite extends AbstractCursor<Element> {
+ private int mID;
+ boolean mClosed;
+
+ public boolean hasNext() {
+ return true;
+ }
+
+ public Element next() {
+ return new Element(++mID);
+ }
+
+ public void close() {
+ mClosed = true;
+ }
+ }
}
diff --git a/src/test/java/com/amazon/carbonado/cursor/TestMergeSortBuffer.java b/src/test/java/com/amazon/carbonado/cursor/TestMergeSortBuffer.java index ea13665..4c27f1f 100644 --- a/src/test/java/com/amazon/carbonado/cursor/TestMergeSortBuffer.java +++ b/src/test/java/com/amazon/carbonado/cursor/TestMergeSortBuffer.java @@ -18,6 +18,8 @@ package com.amazon.carbonado.cursor;
+import java.lang.reflect.UndeclaredThrowableException;
+
import java.util.Comparator;
import java.util.NoSuchElementException;
import java.util.Random;
@@ -148,6 +150,15 @@ public class TestMergeSortBuffer extends TestCase { testBuffer(null, HUGE_BUFFER_SIZE);
}
+ public void testHugeWithTimeout() throws Exception {
+ try {
+ testBuffer(null, HUGE_BUFFER_SIZE, Query.Timeout.millis(100));
+ fail();
+ } catch (UndeclaredThrowableException e) {
+ assertTrue(e.getCause() instanceof FetchInterruptedException);
+ }
+ }
+
public void testLobs() throws Exception {
Comparator<StorableWithLobs> c = BeanComparator.forClass(StorableWithLobs.class)
.orderBy("-id");
@@ -179,8 +190,18 @@ public class TestMergeSortBuffer extends TestCase { buffer.close();
}
- private void testBuffer(Storage<StorableTestBasic> storage, int size) throws Exception {
- SortBuffer<StorableTestBasic> buffer = new MergeSortBuffer<StorableTestBasic>(storage);
+ private void testBuffer(Storage<StorableTestBasic> storage, int size)
+ throws Exception
+ {
+ testBuffer(storage, size, null);
+ }
+
+ private void testBuffer(Storage<StorableTestBasic> storage, int size,
+ Query.Controller controller)
+ throws Exception
+ {
+ SortBuffer<StorableTestBasic> buffer =
+ new MergeSortBuffer<StorableTestBasic>(storage, controller);
buffer.prepare(mComparator);
if (storage == null) {
diff --git a/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryAnalyzer.java b/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryAnalyzer.java index 524b532..5861023 100644 --- a/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryAnalyzer.java +++ b/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryAnalyzer.java @@ -495,18 +495,36 @@ public class TestIndexedQueryAnalyzer extends TestCase { return new ArraySortBuffer<S>();
}
+ public SortBuffer<S> createSortBuffer(Query.Controller controller) {
+ return new ArraySortBuffer<S>();
+ }
+
public long countAll() {
throw new UnsupportedOperationException();
}
+ public long countAll(Query.Controller controller) {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchAll() {
throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchAll(Query.Controller controller) {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchOne(StorableIndex<S> index, Object[] identityValues) {
throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchOne(StorableIndex<S> index, Object[] identityValues,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
+
public Query<?> indexEntryQuery(StorableIndex<S> index) {
return new EmptyQuery();
}
@@ -516,6 +534,12 @@ public class TestIndexedQueryAnalyzer extends TestCase { throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchFromIndexEntryQuery(StorableIndex<S> index, Query<?> indexEntryQuery,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchSubset(StorableIndex<S> index,
Object[] identityValues,
BoundaryType rangeStartBoundary,
@@ -527,5 +551,18 @@ public class TestIndexedQueryAnalyzer extends TestCase { {
throw new UnsupportedOperationException();
}
+
+ public Cursor<S> fetchSubset(StorableIndex<S> index,
+ Object[] identityValues,
+ BoundaryType rangeStartBoundary,
+ Object rangeStartValue,
+ BoundaryType rangeEndBoundary,
+ Object rangeEndValue,
+ boolean reverseRange,
+ boolean reverseOrder,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
}
}
diff --git a/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryExecutor.java b/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryExecutor.java index 3b62971..0e59f44 100644 --- a/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryExecutor.java +++ b/src/test/java/com/amazon/carbonado/qe/TestIndexedQueryExecutor.java @@ -741,6 +741,12 @@ public class TestIndexedQueryExecutor extends TestCase { throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchFromIndexEntryQuery(StorableIndex<S> index, Query<?> indexEntryQuery,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchSubset(StorableIndex<S> index,
Object[] identityValues,
BoundaryType rangeStartBoundary,
@@ -761,5 +767,25 @@ public class TestIndexedQueryExecutor extends TestCase { Collection<S> empty = Collections.emptyList();
return new IteratorCursor<S>(empty);
}
+
+ public Cursor<S> fetchSubset(StorableIndex<S> index,
+ Object[] identityValues,
+ BoundaryType rangeStartBoundary,
+ Object rangeStartValue,
+ BoundaryType rangeEndBoundary,
+ Object rangeEndValue,
+ boolean reverseRange,
+ boolean reverseOrder,
+ Query.Controller controller)
+ {
+ return fetchSubset(index,
+ identityValues,
+ rangeStartBoundary,
+ rangeStartValue,
+ rangeEndBoundary,
+ rangeEndValue,
+ reverseRange,
+ reverseOrder);
+ }
}
}
diff --git a/src/test/java/com/amazon/carbonado/qe/TestJoinedQueryExecutor.java b/src/test/java/com/amazon/carbonado/qe/TestJoinedQueryExecutor.java index 4eaad57..b4b97d4 100644 --- a/src/test/java/com/amazon/carbonado/qe/TestJoinedQueryExecutor.java +++ b/src/test/java/com/amazon/carbonado/qe/TestJoinedQueryExecutor.java @@ -252,18 +252,36 @@ public class TestJoinedQueryExecutor extends TestQueryExecutor { return new ArraySortBuffer<S>();
}
+ public SortBuffer<S> createSortBuffer(Query.Controller controller) {
+ return new ArraySortBuffer<S>();
+ }
+
public long countAll() {
throw new UnsupportedOperationException();
}
+ public long countAll(Query.Controller controller) {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchAll() {
throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchAll(Query.Controller controller) {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchOne(StorableIndex<S> index, Object[] identityValues) {
throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchOne(StorableIndex<S> index, Object[] identityValues,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
+
public Query<?> indexEntryQuery(StorableIndex<S> index) {
return null;
}
@@ -273,6 +291,12 @@ public class TestJoinedQueryExecutor extends TestQueryExecutor { throw new UnsupportedOperationException();
}
+ public Cursor<S> fetchFromIndexEntryQuery(StorableIndex<S> index, Query<?> indexEntryQuery,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
+
public Cursor<S> fetchSubset(StorableIndex<S> index,
Object[] identityValues,
BoundaryType rangeStartBoundary,
@@ -284,6 +308,19 @@ public class TestJoinedQueryExecutor extends TestQueryExecutor { {
throw new UnsupportedOperationException();
}
+
+ public Cursor<S> fetchSubset(StorableIndex<S> index,
+ Object[] identityValues,
+ BoundaryType rangeStartBoundary,
+ Object rangeStartValue,
+ BoundaryType rangeEndBoundary,
+ Object rangeEndValue,
+ boolean reverseRange,
+ boolean reverseOrder,
+ Query.Controller controller)
+ {
+ throw new UnsupportedOperationException();
+ }
}
static class ScanQuerySupport<S extends Storable> implements FullScanQueryExecutor.Support<S> {
@@ -301,8 +338,16 @@ public class TestJoinedQueryExecutor extends TestQueryExecutor { return mQuery.count();
}
+ public long countAll(Query.Controller controller) throws FetchException {
+ return mQuery.count(controller);
+ }
+
public Cursor<S> fetchAll() throws FetchException {
return mQuery.fetch();
}
+
+ public Cursor<S> fetchAll(Query.Controller controller) throws FetchException {
+ return mQuery.fetch(controller);
+ }
}
}
diff --git a/src/test/java/com/amazon/carbonado/repo/jdbc/TestH2.java b/src/test/java/com/amazon/carbonado/repo/jdbc/TestH2.java index 4e4b622..b5e7103 100644 --- a/src/test/java/com/amazon/carbonado/repo/jdbc/TestH2.java +++ b/src/test/java/com/amazon/carbonado/repo/jdbc/TestH2.java @@ -383,6 +383,11 @@ public class TestH2 extends com.amazon.carbonado.TestStorables { }
@Override
+ public void test_countTimeout() throws Exception {
+ // Timeout granularity is too high. (one second)
+ }
+
+ @Override
protected BigInteger expected(BigInteger bi) {
// Used to detect that BigIntegerAdapter was selected.
return bi.add(BigInteger.ONE);
|
