Bulk load change and patch set data, reuse approvals

When querying for change information, try to bulk load any change
records or current patch set records that are not yet loaded, and
reuse any patch set approvals to avoid repeated scans of the same
data during a single query.

Change-Id: I4656925c4d2cf406d0a3be99fd554aa505af6e34
This commit is contained in:
Shawn O. Pearce
2012-05-01 17:54:23 -07:00
parent ff29dca4de
commit 31fc8efcd8
6 changed files with 99 additions and 42 deletions

View File

@@ -9,7 +9,9 @@ import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.rules.PrologEnvironment;
import com.google.gerrit.rules.StoredValues;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
import com.google.inject.util.Providers;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.JavaException;
@@ -45,9 +47,17 @@ class PRED__load_commit_labels_1 extends Predicate.P1 {
PrologEnvironment env = (PrologEnvironment) engine.control;
ReviewDb db = StoredValues.REVIEW_DB.get(engine);
PatchSet patchSet = StoredValues.PATCH_SET.get(engine);
ChangeData cd = StoredValues.CHANGE_DATA.getOrNull(engine);
ApprovalTypes types = env.getInjector().getInstance(ApprovalTypes.class);
for (PatchSetApproval a : db.patchSetApprovals().byPatchSet(patchSet.getId())) {
Iterable<PatchSetApproval> approvals;
if (cd != null) {
approvals = cd.currentApprovals(Providers.of(db));
} else {
approvals = db.patchSetApprovals().byPatchSet(patchSet.getId());
}
for (PatchSetApproval a : approvals) {
if (a.getValue() == 0) {
continue;
}