Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Johnson2019-11-20 21:24:58 +0000
committerAndrew Johnson2019-11-20 21:24:58 +0000
commit08558dd811931ebbdc8ffc850632e2d19177c575 (patch)
tree23a1d47a52bd533fd159543f1f79f79494c4c4f0
parent05fb6aa5ca9af3f8e7d25fe4517ef5bf76d75941 (diff)
downloadorg.eclipse.mat-08558dd811931ebbdc8ffc850632e2d19177c575.tar.gz
org.eclipse.mat-08558dd811931ebbdc8ffc850632e2d19177c575.tar.xz
org.eclipse.mat-08558dd811931ebbdc8ffc850632e2d19177c575.zip
552879: OQL enhancements for sub-selects, maps, context providers
Progress monitoring and JOIN simulation Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=552879 Change-Id: I62d3e09ef4e03523d50b45d5203d7826019f2cb6
-rw-r--r--plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java1
-rw-r--r--plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties1
-rw-r--r--plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/oql/OQLQueryImpl.java86
-rw-r--r--plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/snapshot/OQLTest.java179
4 files changed, 257 insertions, 10 deletions
diff --git a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java
index 66c7168a..6e2d5e66 100644
--- a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java
+++ b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/Messages.java
@@ -116,6 +116,7 @@ public class Messages extends NLS
public static String OQLQueryImpl_Error_QueryMustReturnObjects;
public static String OQLQueryImpl_Error_ResultMustReturnObjectList;
public static String OQLQueryImpl_Errot_IsNotClass;
+ public static String OQLQueryImpl_Selecting;
public static String OQLQueryImpl_SelectingObjects;
public static String ParserRegistry_ErrorCompilingFileNamePattern;
public static String ParserRegistry_ErrorWhileCreating;
diff --git a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties
index 2dfe35bc..b9e3e374 100644
--- a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties
+++ b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/messages.properties
@@ -109,6 +109,7 @@ OQLQueryImpl_Error_QueryMustHaveIdenticalSelectItems=UNION query must have ident
OQLQueryImpl_Error_QueryMustReturnObjects=UNION query must return objects: {0}
OQLQueryImpl_Error_ResultMustReturnObjectList=Result must return an object list: Query: {0} Value: {1}
OQLQueryImpl_Errot_IsNotClass=Object 0x{0} is not a class
+Messages.OQLQueryImpl_Selecting=Selecting
OQLQueryImpl_SelectingObjects=Selecting objects of classes
ParserRegistry_ErrorCompilingFileNamePattern=Error compiling file name pattern of extension {0}
diff --git a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/oql/OQLQueryImpl.java b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/oql/OQLQueryImpl.java
index 34b03d1c..1243cb98 100644
--- a/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/oql/OQLQueryImpl.java
+++ b/plugins/org.eclipse.mat.parser/src/org/eclipse/mat/parser/internal/oql/OQLQueryImpl.java
@@ -415,6 +415,31 @@ public class OQLQueryImpl implements IOQLQuery
}
return builder.build();
}
+
+ /**
+ * Simple toString() which does not evaluate all the rows and columns,
+ * which otherwise a subclass of AbstractList would do.
+ */
+ public String toString()
+ {
+ int ncols = getColumns() != null ? getColumns().length : 0;
+ StringBuilder sb = new StringBuilder();
+ sb.append(this.getClass().getSimpleName()).append('@').append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append('[').append(getRowCount()).append(']');
+ sb.append('[').append(ncols).append(']');
+ sb.append('[');
+ final int maxRows = 2;
+ for (int i = 0; i < Math.min(maxRows, getRowCount()); ++i)
+ {
+ sb.append(get(i).toString());
+ if (i + 1 < getRowCount())
+ sb.append(',');
+ }
+ if (getRowCount() > maxRows)
+ sb.append("..."); //$NON-NLS-1$
+ sb.append(']');
+ return sb.toString();
+ }
}
/**
@@ -490,9 +515,13 @@ public class OQLQueryImpl implements IOQLQuery
try
{
source.ctx.setSubject(holder.subject);
+ // Don't track progress here for reading the cell
+ IProgressListener old = source.ctx.getProgressListener();
+ source.ctx.setProgressListener(new SilentProgressListener(old));
Query.SelectItem column = source.query.getSelectClause().getSelectList().get(columnIndex);
Object v = column.getExpression().compute(source.ctx);
+ source.ctx.setProgressListener(old);
holder.values[columnIndex] = v == null ? NULL_VALUE : v;
}
catch (SnapshotException e)
@@ -597,6 +626,7 @@ public class OQLQueryImpl implements IOQLQuery
List<SelectItem> selectList = source.query.getSelectClause().getSelectList();
columns = new Column[selectList.size()];
+
try
{
for (int ii = 0; ii < columns.length; ii++)
@@ -606,7 +636,6 @@ public class OQLQueryImpl implements IOQLQuery
{
throw SnapshotException.rethrow(e);
}
-
}
public ResultMetaData getResultMetaData()
@@ -638,9 +667,13 @@ public class OQLQueryImpl implements IOQLQuery
{
IObject object = source.ctx.getSnapshot().getObject(objectIds[index]);
source.ctx.setSubject(object);
+ // Don't track progress here for reading the cell
+ IProgressListener old = source.ctx.getProgressListener();
+ source.ctx.setProgressListener(new SilentProgressListener(old));
List<SelectItem> selectList = source.query.getSelectClause().getSelectList();
Object value = selectList.get(columnIndex).getExpression().compute(source.ctx);
+ source.ctx.setProgressListener(old);
objects[index].values[columnIndex] = value != null ? value : NULL_VALUE;
}
catch (SnapshotException e)
@@ -1196,9 +1229,17 @@ public class OQLQueryImpl implements IOQLQuery
initSnapshot(snapshot);
if (monitor == null)
- monitor = new VoidProgressListener();
+ {
+ if (this.ctx.getProgressListener() != null)
+ monitor = new SilentProgressListener(this.ctx.getProgressListener());
+ else
+ monitor = new VoidProgressListener();
+ }
+ IProgressListener old = this.ctx.getProgressListener();
+ this.ctx.setProgressListener(monitor);
Object result = internalExecute(monitor);
+ this.ctx.setProgressListener(old);
return result instanceof IntResult ? ((IntResult) result).toArray() : result;
}
@@ -1229,6 +1270,7 @@ public class OQLQueryImpl implements IOQLQuery
result = union(listener, result);
}
+ monitor.done();
return result;
}
@@ -1316,8 +1358,11 @@ public class OQLQueryImpl implements IOQLQuery
private Object doSubQuery(IProgressListener monitor) throws SnapshotException
{
+ int percentages[] = new int[] {300,100};
+ SimpleMonitor listener = new SimpleMonitor(query.toString(), monitor, percentages);
OQLQueryImpl subQuery = new OQLQueryImpl(this.ctx, query.getFromClause().getSubSelect());
- Object result = subQuery.internalExecute(monitor);
+ Object result = subQuery.internalExecute(listener.nextMonitor());
+ monitor = listener.nextMonitor();
if (query.getFromClause().includeObjects() && !query.getFromClause().includeSubClasses())
{
@@ -1340,6 +1385,8 @@ public class OQLQueryImpl implements IOQLQuery
{
if (accept(obj, monitor))
r.add(obj);
+ if (monitor.isCanceled())
+ throw new IProgressListener.OperationCanceledException();
}
return r.isEmpty() ? null : select(r, monitor);
@@ -1354,6 +1401,8 @@ public class OQLQueryImpl implements IOQLQuery
Object obj = Array.get(result, ii);
if (accept(obj, monitor))
r.add(obj);
+ if (monitor.isCanceled())
+ throw new IProgressListener.OperationCanceledException();
}
return r.isEmpty() ? null : select(r, monitor);
}
@@ -1544,12 +1593,15 @@ public class OQLQueryImpl implements IOQLQuery
*/
private Object doMethodCall(IProgressListener listener) throws SnapshotException
{
+ int percentages[] = new int[] {300,100};
+ SimpleMonitor smlistener = new SimpleMonitor(query.toString(), listener, percentages);
Expression method = query.getFromClause().getCall();
this.ctx.setSubject(this.ctx.getSnapshot());
- this.ctx.setProgressListener(listener);
IProgressListener old = ctx.getProgressListener();
+ this.ctx.setProgressListener(smlistener.nextMonitor());
Object result = method.compute(this.ctx);
this.ctx.setProgressListener(old);
+ listener = smlistener.nextMonitor();
if (query.getFromClause().includeObjects() && !query.getFromClause().includeSubClasses())
{
@@ -1565,6 +1617,8 @@ public class OQLQueryImpl implements IOQLQuery
{
if (accept(obj, listener))
r.add(obj);
+ if (listener.isCanceled())
+ throw new IProgressListener.OperationCanceledException();
}
return r.isEmpty() ? null : select(r, listener);
@@ -1579,6 +1633,8 @@ public class OQLQueryImpl implements IOQLQuery
Object obj = Array.get(result, ii);
if (accept(obj, listener))
r.add(obj);
+ if (listener.isCanceled())
+ throw new IProgressListener.OperationCanceledException();
}
return r.isEmpty() ? null : select(r, listener);
@@ -1848,7 +1904,7 @@ public class OQLQueryImpl implements IOQLQuery
// calculate retained set
if (select.isRetainedSet())
{
- objectIds = new IntArrayResult(ctx.getSnapshot().getRetainedSet(objectIds.toArray(), listener));
+ objectIds = new IntArrayResult(ctx.getSnapshot().getRetainedSet(objectIds.toArray(), new SilentProgressListener(listener)));
}
if (select.getSelectList().isEmpty())
@@ -1931,6 +1987,7 @@ public class OQLQueryImpl implements IOQLQuery
IStructuredResult irt = (IStructuredResult)result;
List<?>elements = irt instanceof IResultTree ? ((IResultTree)irt).getElements() : null;
int count = irt instanceof IResultTable ? ((IResultTable)irt).getRowCount() : elements.size();
+ listener.beginTask(Messages.OQLQueryImpl_Selecting, count);
for (int ii = 0; ii < count; ii++)
{
if (listener.isCanceled())
@@ -1941,14 +1998,19 @@ public class OQLQueryImpl implements IOQLQuery
//IObject o = ctx.getSnapshot().getObject(ic.getObjectId());
if (accept(rowobj, listener))
r.add(rowobj);
+ listener.worked(1);
}
+ listener.done();
return r.isEmpty() ? null : select(r, listener);
}
private Object filterAndSelect(AbstractCustomTableResultSet result, IProgressListener listener) throws SnapshotException
{
List<Object> r = new ArrayList<Object>();
+ listener.beginTask(Messages.OQLQueryImpl_Selecting, result.getRowCount() * 2);
+ IProgressListener old = this.ctx.getProgressListener();
+ this.ctx.setProgressListener(new SilentProgressListener(listener));
for (AbstractCustomTableResultSet.RowMap rowobj : result)
{
if (listener.isCanceled())
@@ -1966,13 +2028,14 @@ public class OQLQueryImpl implements IOQLQuery
if (ll > maxlen)
maxlen = ll;
}
- else if (v !=null && v.getClass().isArray())
+ else if (v != null && v.getClass().isArray())
{
int ll = Array.getLength(v);
if (ll > maxlen)
maxlen = ll;
- }
+ };
}
+ listener.worked(1);
if (maxlen >= 0)
{
@@ -2006,6 +2069,8 @@ public class OQLQueryImpl implements IOQLQuery
};
if (accept(rm2, listener))
r.add(rm2);
+ if (listener.isCanceled())
+ throw new IProgressListener.OperationCanceledException();
}
}
else
@@ -2013,7 +2078,10 @@ public class OQLQueryImpl implements IOQLQuery
if (accept(rowobj, listener))
r.add(rowobj);
}
+ listener.worked(1);
}
+ this.ctx.setProgressListener(old);
+ listener.done();
return r.isEmpty() ? null : select(r, listener);
}
@@ -2093,6 +2161,9 @@ public class OQLQueryImpl implements IOQLQuery
if (set.getColumns().length != 1) { throw new SnapshotException(MessageUtil.format(
Messages.OQLQueryImpl_Error_QueryCannotBeConverted, new Object[] { set.getOQLQuery() })); }
+ // We don't track work for converting objects
+ IProgressListener old = ctx.getProgressListener();
+ ctx.setProgressListener(new SilentProgressListener(listener));
int count = set.getRowCount();
for (int ii = 0; ii < count; ii++)
{
@@ -2163,6 +2234,7 @@ public class OQLQueryImpl implements IOQLQuery
}
}
}
+ ctx.setProgressListener(old);
}
private IntResult createIntResult(int capacity)
diff --git a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/snapshot/OQLTest.java b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/snapshot/OQLTest.java
index 817acabc..c1abb3f6 100644
--- a/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/snapshot/OQLTest.java
+++ b/plugins/org.eclipse.mat.tests/src/org/eclipse/mat/tests/snapshot/OQLTest.java
@@ -13,9 +13,12 @@
package org.eclipse.mat.tests.snapshot;
import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.anyOf;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -42,6 +45,7 @@ import org.eclipse.mat.snapshot.SnapshotFactory;
import org.eclipse.mat.snapshot.model.IClass;
import org.eclipse.mat.snapshot.model.IObject;
import org.eclipse.mat.tests.TestSnapshots;
+import org.eclipse.mat.util.IProgressListener;
import org.eclipse.mat.util.MessageUtil;
import org.eclipse.mat.util.VoidProgressListener;
import org.junit.Test;
@@ -1301,6 +1305,141 @@ public class OQLTest
checkGetOQL(irt);
}
+ @Test
+ public void testCrossJoin() throws SnapshotException {
+ String dump = TestSnapshots.SUN_JDK6_18_32BIT;
+ int ints[] = (int[])execute("SELECT * from java.lang.Integer", dump);
+ assertNotNull(ints);
+ int longs[] = (int[])execute("SELECT * from java.lang.Long", dump);
+ assertNotNull(longs);
+ IResultTable irt = (IResultTable)execute("SELECT z.i AS Integer, z.i.value AS \"Integer value\", z.lv.l AS Long, z.lv.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT i, (SELECT l FROM java.lang.Long l ) AS lv FROM java.lang.Integer i ) z", dump);
+ assertThat(irt.getRowCount(), equalTo(ints.length * longs.length));
+ for (int i = 0; i < irt.getRowCount(); ++i) {
+ Object row = irt.getRow(i);
+ Object iv1 = irt.getColumnValue(row, 1);
+ assertThat(iv1, instanceOf(Integer.class));
+ Object iv2 = irt.getColumnValue(row, 3);
+ assertThat(iv2, instanceOf(Long.class));
+ }
+ checkGetOQL(irt);
+ }
+
+ @Test
+ public void testLeftJoin() throws SnapshotException {
+ String dump = TestSnapshots.SUN_JDK6_18_32BIT;
+ int ints[] = (int[])execute("SELECT * from java.lang.Integer", dump);
+ assertNotNull(ints);
+ int longs[] = (int[])execute("SELECT * from java.lang.Long", dump);
+ assertNotNull(longs);
+ IResultTable irt = (IResultTable)execute("SELECT z.i AS Integer, z.i.value AS \"Integer value\", z.lv.l AS Long, z.lv.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT i, (SELECT l FROM java.lang.Long l WHERE (l.value = i.value)) AS lv FROM java.lang.Integer i ) z", dump);
+ assertThat(irt.getRowCount(), greaterThanOrEqualTo(ints.length));
+ for (int i = 0; i < irt.getRowCount(); ++i) {
+ Object row = irt.getRow(i);
+ Object iv1 = irt.getColumnValue(row, 1);
+ assertThat(iv1, instanceOf(Integer.class));
+ Object iv2 = irt.getColumnValue(row, 3);
+ assertThat(iv2, anyOf(nullValue(),instanceOf(Long.class)));
+ if (iv2 != null)
+ assertThat((long)(Integer)iv1, equalTo(iv2));
+ }
+ checkGetOQL(irt);
+ }
+
+ @Test
+ public void testInnerJoin1() throws SnapshotException {
+ String dump = TestSnapshots.SUN_JDK6_18_32BIT;
+ int ints[] = (int[])execute("SELECT * from java.lang.Integer", dump);
+ assertNotNull(ints);
+ int longs[] = (int[])execute("SELECT * from java.lang.Long", dump);
+ assertNotNull(longs);
+ IResultTable irt = (IResultTable)execute("SELECT z.i AS Integer, z.i.value AS \"Integer value\", z.lv.l AS Long, z.lv.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT i, (SELECT l FROM java.lang.Long l WHERE (l.value = i.value)) AS lv FROM java.lang.Integer i ) z WHERE (z.lv != null)", dump);
+ assertThat(irt.getRowCount(), lessThanOrEqualTo(ints.length));
+ assertThat(irt.getRowCount(), lessThanOrEqualTo(longs.length));
+ for (int i = 0; i < irt.getRowCount(); ++i) {
+ Object row = irt.getRow(i);
+ Object iv1 = irt.getColumnValue(row, 1);
+ assertThat(iv1, instanceOf(Integer.class));
+ Object iv2 = irt.getColumnValue(row, 3);
+ assertThat(iv2, instanceOf(Long.class));
+ assertThat((long)(Integer)iv1, equalTo(iv2));
+ }
+ checkGetOQL(irt);
+ }
+
+ @Test
+ public void testInnerJoin2() throws SnapshotException {
+ String dump = TestSnapshots.SUN_JDK6_18_32BIT;
+ int ints[] = (int[])execute("SELECT * from java.lang.Integer", dump);
+ assertNotNull(ints);
+ int longs[] = (int[])execute("SELECT * from java.lang.Long", dump);
+ assertNotNull(longs);
+ IResultTable irt = (IResultTable)execute("SELECT z.iv.i AS Integer, z.iv.i.value AS \"Integer value\", z.l AS Long, z.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT (SELECT i FROM java.lang.Integer i WHERE (i.value = l.value)) AS iv, l FROM java.lang.Long l ) z WHERE (z.iv != null)", dump);
+ assertThat(irt.getRowCount(), lessThanOrEqualTo(ints.length));
+ assertThat(irt.getRowCount(), lessThanOrEqualTo(longs.length));
+ for (int i = 0; i < irt.getRowCount(); ++i) {
+ Object row = irt.getRow(i);
+ Object iv1 = irt.getColumnValue(row, 1);
+ assertThat(iv1, instanceOf(Integer.class));
+ Object iv2 = irt.getColumnValue(row, 3);
+ assertThat(iv2, instanceOf(Long.class));
+ assertThat((long)(Integer)iv1, equalTo(iv2));
+ }
+ checkGetOQL(irt);
+ }
+
+ @Test
+ public void testRightJoin() throws SnapshotException {
+ String dump = TestSnapshots.SUN_JDK6_18_32BIT;
+ int ints[] = (int[])execute("SELECT * from java.lang.Integer", dump);
+ assertNotNull(ints);
+ int longs[] = (int[])execute("SELECT * from java.lang.Long", dump);
+ assertNotNull(longs);
+ IResultTable irt = (IResultTable)execute("SELECT z.iv.i AS Integer, z.iv.i.value AS \"Integer value\", z.l AS Long, z.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT (SELECT i FROM java.lang.Integer i WHERE (i.value = l.value)) AS iv, l FROM java.lang.Long l ) z", dump);
+ assertThat(irt.getRowCount(), greaterThanOrEqualTo(longs.length));
+ for (int i = 0; i < irt.getRowCount(); ++i) {
+ Object row = irt.getRow(i);
+ Object iv1 = irt.getColumnValue(row, 1);
+ assertThat(iv1, anyOf(nullValue(),instanceOf(Integer.class)));
+ Object iv2 = irt.getColumnValue(row, 3);
+ assertThat(iv2, instanceOf(Long.class));
+ if (iv1 != null)
+ assertThat((long)(Integer)iv1, equalTo(iv2));
+ }
+ checkGetOQL(irt);
+ }
+
+ @Test
+ public void testFullOuterJoin() throws SnapshotException {
+ String dump = TestSnapshots.SUN_JDK6_18_32BIT;
+ int ints[] = (int[])execute("SELECT * from java.lang.Integer", dump);
+ assertNotNull(ints);
+ int longs[] = (int[])execute("SELECT * from java.lang.Long", dump);
+ assertNotNull(longs);
+ IResultTable irt = (IResultTable)execute("SELECT z.i AS Integer, z.i.value AS \"Integer value\", z.lv.l AS Long, z.lv.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT i, (SELECT l FROM java.lang.Long l WHERE (l.value = i.value)) AS lv FROM java.lang.Integer i ) z \r\n" +
+ "UNION (\r\n" +
+ "SELECT z.iv.i AS Integer, z.iv.i.value AS \"Integer value\", z.l AS Long, z.l.value as \"Long value\" \r\n" +
+ "FROM OBJECTS ( SELECT (SELECT i FROM java.lang.Integer i WHERE (i.value = l.value)) AS iv, l FROM java.lang.Long l ) z WHERE (z.iv = null)\r\n" +
+ ")", dump);
+ assertThat(irt.getRowCount(), greaterThanOrEqualTo(ints.length));
+ assertThat(irt.getRowCount(), greaterThanOrEqualTo(longs.length));
+ for (int i = 0; i < irt.getRowCount(); ++i) {
+ Object row = irt.getRow(i);
+ Object iv1 = irt.getColumnValue(row, 1);
+ assertThat(iv1, anyOf(nullValue(),instanceOf(Integer.class)));
+ Object iv2 = irt.getColumnValue(row, 3);
+ assertThat(iv2, anyOf(nullValue(),instanceOf(Long.class)));
+ if (iv1 != null && iv2 != null)
+ assertThat((long)(Integer)iv1, equalTo(iv2));
+ }
+ checkGetOQL(irt);
+ }
+
/**
* Check all getOQL() from contexts from the result are sensible.
* @param rt ResultTable
@@ -1568,16 +1707,50 @@ public class OQLTest
}
// //////////////////////////////////////////////////////////////
- // internal helper
+ // internal helpers
// //////////////////////////////////////////////////////////////
+ /**
+ * Use to check that the work reports from OQL processing are sensible.
+ */
+ static class CountListener extends VoidProgressListener
+ {
+ int work;
+ int done;
+ public void beginTask(String name, int totalWork)
+ {
+ work = totalWork;
+ }
+
+ public void done()
+ {
+ if (done < work)
+ done = work;
+ }
+
+ public void worked(int work)
+ {
+ if (done + work > this.work)
+ throw new IllegalArgumentException("Too much work "+work+" for a listener "+done+"/"+this.work);
+ done += work;
+ }
+ }
+
private Object execute(String oql) throws SnapshotException
{
+ return execute(oql, TestSnapshots.SUN_JDK5_64BIT);
+ }
+
+ private Object execute(String oql, String snapshotName) throws SnapshotException
+ {
try
{
- ISnapshot snapshot = TestSnapshots.getSnapshot(TestSnapshots.SUN_JDK5_64BIT, false);
+ ISnapshot snapshot = TestSnapshots.getSnapshot(snapshotName, false);
IOQLQuery query = SnapshotFactory.createQuery(oql);
- return query.execute(snapshot, new VoidProgressListener());
+ CountListener cl = new CountListener();
+ Object ret = query.execute(snapshot, cl);
+ assertThat(oql, cl.done, equalTo(cl.work));
+ return ret;
}
catch (OQLParseException e)
{

Back to the top