package com.qubling.sidekick.fetch;
import java.util.Collection;
import com.qubling.sidekick.instance.Instance;
import com.qubling.sidekick.model.Model;
import com.qubling.sidekick.search.ResultSet;
import com.qubling.sidekick.search.Results;
import com.qubling.sidekick.search.ResultsForUpdate;
public class SubqueryFetcher<SomeInstance extends Instance<SomeInstance>, ForeignInstance extends Instance<ForeignInstance>>
extends AbstractFetcher<SomeInstance>
implements UpdateFetcher<SomeInstance> {
private Results.Remap<SomeInstance, ForeignInstance> remapper;
private UpdateFetcher<ForeignInstance> fetcher;
public SubqueryFetcher(Model<SomeInstance> model, UpdateFetcher<ForeignInstance> fetcher, Results.Remap<SomeInstance, ForeignInstance> remapper) {
super(model);
this.fetcher = fetcher;
this.remapper = remapper;
}
@Override
public boolean needsUpdate(SomeInstance instance) {
Collection<ForeignInstance> others = remapper.map(instance);
for (ForeignInstance other : others) {
if (fetcher.needsUpdate(other))
return true;
}
return false;
}
@Override
public void setIncomingResultSet(ResultsForUpdate<SomeInstance> inputResults) {
setResultSet(inputResults);
}
@Override
protected void execute() {
// Log.d("SubqueryFetcher", "START execute()");
ResultSet<ForeignInstance> inputResults = new Results<ForeignInstance>();
inputResults.addRemap(getResultSet(), remapper);
fetcher.setIncomingResultSet(
new ResultsForUpdate<ForeignInstance>(fetcher, inputResults));
fetcher.run();
// Log.d("SubqueryFetcher", "END execute()");
}
@Override
public String toString() {
return getModel() + ":SubqueryFetcher(" + fetcher + ";" + getResultSet() + ")";
}
@Override
public SerialUpdateFetcher<SomeInstance> thenDoFetch(UpdateFetcher<SomeInstance> fetcher) {
return super.thenDoFetch(fetcher);
}
}