package org.araqne.logdb;
public class SubQueryTask extends QueryTask {
private Query subQuery;
private QueryContext mainContext;
public SubQueryTask(Query subQuery) {
this.subQuery = subQuery;
}
public SubQueryTask(Query subQuery, QueryContext mainContext) {
// procedure should not expose sub query, however sub query error should
// be propagated.
this.subQuery = subQuery;
this.mainContext = mainContext;
}
public Query getSubQuery() {
return subQuery;
}
@Override
public boolean isRunnable() {
if (!subQuery.isRunnable())
return false;
return super.isRunnable();
}
@Override
public void run() {
subQuery.run();
subQuery.awaitFinish();
if (subQuery.isCancelled()) {
if (mainContext != null)
mainContext.getMainQuery().cancel(subQuery.getCause());
else
subQuery.getContext().getMainQuery().cancel(subQuery.getCause());
}
}
@Override
public synchronized void setStatus(TaskStatus status) {
if (status == TaskStatus.CANCELED)
subQuery.cancel(QueryStopReason.Interrupted);
super.setStatus(status);
}
@Override
public String toString() {
return "subquery task: " + subQuery.toString();
}
}