Stop passing ReviewDb, etc. to ChangeData methods

Many methods that are intended for lazy initialization take a
ReviewDb, and some take other helper objects such as
GitRepositoryManager. This achieves the intended lazy-loading behavior
but requires a lot of injection of dependencies into callers, and may
become untenable as lazy loading of ChangeData requires more helpers.

Instead, since after all this is Java, construct ChangeData with a
Factory. This is subtle because it is used from a lot of places that
need control over which ReviewDb handle to pass in, so the factory
methods still need to take a db. ChangeData objects are still intended
(i.e. safe) for use only by one thread, so having a single ReviewDb
instance stored for the lifetime of the ChangeData should be fine. We
just need to be careful about which we pass in, particularly in a
place like ChangeIndexer.

As a side effect, clean up some other injection, particularly in the
predicate class hierarchy.

Change-Id: I52e1eb2a76788c12dd95767e89095ab80df7e1cc
This commit is contained in:
Dave Borowitz
2013-12-20 11:38:13 -08:00
parent 24b40a9592
commit 7547233449
67 changed files with 470 additions and 505 deletions

View File

@@ -454,7 +454,7 @@ public class ChangeUtil {
db.changeMessages().delete(db.changeMessages().byChange(changeId));
db.starredChanges().delete(db.starredChanges().byChange(changeId));
db.changes().delete(Collections.singleton(change));
indexer.delete(change);
indexer.delete(db, change);
}
public void deleteOnlyDraftPatchSet(PatchSet patch, Change change)

View File

@@ -77,7 +77,6 @@ import com.google.gerrit.server.account.AccountInfo;
import com.google.gerrit.server.actions.ActionInfo;
import com.google.gerrit.server.extensions.webui.UiActions;
import com.google.gerrit.server.git.LabelNormalizer;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.patch.PatchListNotAvailableException;
import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
@@ -132,6 +131,7 @@ public class ChangeJson {
private final AnonymousUser anonymous;
private final IdentifiedUser.GenericFactory userFactory;
private final ProjectControl.GenericFactory projectControlFactory;
private final ChangeData.Factory changeDataFactory;
private final PatchSetInfoFactory patchSetInfoFactory;
private final ChangesCollection changes;
private final FileInfoJson fileInfoJson;
@@ -140,7 +140,6 @@ public class ChangeJson {
private final DynamicMap<DownloadCommand> downloadCommands;
private final DynamicMap<RestView<ChangeResource>> changeViews;
private final Revisions revisions;
private final PatchListCache patchListCache;
private EnumSet<ListChangesOption> options;
private AccountInfo.Loader accountLoader;
@@ -156,6 +155,7 @@ public class ChangeJson {
AnonymousUser au,
IdentifiedUser.GenericFactory uf,
ProjectControl.GenericFactory pcf,
ChangeData.Factory cdf,
PatchSetInfoFactory psi,
ChangesCollection changes,
FileInfoJson fileInfoJson,
@@ -163,14 +163,14 @@ public class ChangeJson {
DynamicMap<DownloadScheme> downloadSchemes,
DynamicMap<DownloadCommand> downloadCommands,
DynamicMap<RestView<ChangeResource>> changeViews,
Revisions revisions,
PatchListCache patchListCache) {
Revisions revisions) {
this.db = db;
this.labelNormalizer = ln;
this.userProvider = user;
this.anonymous = au;
this.userFactory = uf;
this.projectControlFactory = pcf;
this.changeDataFactory = cdf;
this.patchSetInfoFactory = psi;
this.changes = changes;
this.fileInfoJson = fileInfoJson;
@@ -179,7 +179,6 @@ public class ChangeJson {
this.downloadCommands = downloadCommands;
this.changeViews = changeViews;
this.revisions = revisions;
this.patchListCache = patchListCache;
options = EnumSet.noneOf(ListChangesOption.class);
projectControls = CacheBuilder.newBuilder()
@@ -204,15 +203,15 @@ public class ChangeJson {
}
public ChangeInfo format(ChangeResource rsrc) throws OrmException {
return format(new ChangeData(rsrc.getControl()));
return format(changeDataFactory.create(db.get(), rsrc.getControl()));
}
public ChangeInfo format(Change change) throws OrmException {
return format(new ChangeData(change));
return format(changeDataFactory.create(db.get(), change));
}
public ChangeInfo format(Change.Id id) throws OrmException {
return format(new ChangeData(id));
return format(changeDataFactory.create(db.get(), id));
}
public ChangeInfo format(ChangeData cd) throws OrmException {
@@ -221,7 +220,7 @@ public class ChangeJson {
}
public ChangeInfo format(RevisionResource rsrc) throws OrmException {
ChangeData cd = new ChangeData(rsrc.getControl());
ChangeData cd = changeDataFactory.create(db.get(), rsrc.getControl());
cd.limitToPatchSets(ImmutableList.of(rsrc.getPatchSet().getId()));
return format(cd);
}
@@ -270,13 +269,13 @@ public class ChangeJson {
private ChangeInfo toChangeInfo(ChangeData cd) throws OrmException {
ChangeInfo out = new ChangeInfo();
Change in = cd.change(db);
Change in = cd.change();
out.project = in.getProject().get();
out.branch = in.getDest().getShortName();
out.topic = in.getTopic();
out.changeId = in.getKey().get();
out.mergeable = in.getStatus() != Change.Status.MERGED ? in.isMergeable() : null;
ChangedLines changedLines = cd.changedLines(db, patchListCache);
ChangedLines changedLines = cd.changedLines();
if (changedLines != null) {
out.insertions = changedLines.insertions;
out.deletions = changedLines.deletions;
@@ -345,7 +344,7 @@ public class ChangeJson {
}
try {
Change change = cd.change(db);
Change change = cd.change();
if (change == null) {
return null;
}
@@ -365,7 +364,7 @@ public class ChangeJson {
if (ctl == null) {
return ImmutableList.of();
}
PatchSet ps = cd.currentPatchSet(db);
PatchSet ps = cd.currentPatchSet();
if (ps == null) {
return ImmutableList.of();
}
@@ -405,7 +404,7 @@ public class ChangeJson {
continue;
}
if (standard) {
for (PatchSetApproval psa : cd.currentApprovals(db)) {
for (PatchSetApproval psa : cd.currentApprovals()) {
if (type.matches(psa)) {
short val = psa.getValue();
Account.Id accountId = psa.getAccountId();
@@ -492,7 +491,7 @@ public class ChangeJson {
// All users ever added, even if they can't vote on one or all labels.
Set<Account.Id> allUsers = Sets.newHashSet();
ListMultimap<PatchSet.Id, PatchSetApproval> allApprovals =
cd.allApprovalsMap(db);
cd.allApprovalsMap();
for (PatchSetApproval psa : allApprovals.values()) {
allUsers.add(psa.getAccountId());
}
@@ -538,13 +537,13 @@ public class ChangeJson {
LabelTypes labelTypes, boolean standard, boolean detailed)
throws OrmException {
Set<Account.Id> allUsers = Sets.newHashSet();
for (PatchSetApproval psa : cd.allApprovals(db)) {
for (PatchSetApproval psa : cd.allApprovals()) {
allUsers.add(psa.getAccountId());
}
Set<String> labelNames = Sets.newHashSet();
Multimap<Account.Id, PatchSetApproval> current = HashMultimap.create();
for (PatchSetApproval a : cd.currentApprovals(db)) {
for (PatchSetApproval a : cd.currentApprovals()) {
LabelType type = labelTypes.byLabel(a.getLabelId());
if (type != null && a.getValue() != 0) {
labelNames.add(type.getName());
@@ -735,8 +734,8 @@ public class ChangeJson {
List<ResultSet<ChangeMessage>> m =
Lists.newArrayListWithCapacity(batch.size());
for (ChangeData cd : batch) {
PatchSet.Id ps = cd.change(db).currentPatchSetId();
if (ps != null && cd.change(db).getStatus().isOpen()) {
PatchSet.Id ps = cd.change().currentPatchSetId();
if (ps != null && cd.change().getStatus().isOpen()) {
m.add(db.get().changeMessages().byPatchSet(ps));
} else {
m.add(NO_MESSAGES);
@@ -761,7 +760,7 @@ public class ChangeJson {
}
});
Account.Id changeOwnerId = cd.change(db).getOwner();
Account.Id changeOwnerId = cd.change().getOwner();
for (ChangeMessage cm : msgs) {
if (self.equals(cm.getAuthor())) {
return true;
@@ -780,9 +779,9 @@ public class ChangeJson {
Collection<PatchSet> src;
if (cd.getLimitedPatchSets() != null || has(ALL_REVISIONS)) {
src = cd.patches(db);
src = cd.patches();
} else {
src = Collections.singletonList(cd.currentPatchSet(db));
src = Collections.singletonList(cd.currentPatchSet());
}
Map<String, RevisionInfo> res = Maps.newLinkedHashMap();
for (PatchSet in : src) {
@@ -796,7 +795,7 @@ public class ChangeJson {
private RevisionInfo toRevisionInfo(ChangeData cd, PatchSet in)
throws OrmException {
RevisionInfo out = new RevisionInfo();
out.isCurrent = in.getId().equals(cd.change(db).currentPatchSetId());
out.isCurrent = in.getId().equals(cd.change().currentPatchSetId());
out._number = in.getId().get();
out.draft = in.isDraft() ? true : null;
out.fetch = makeFetchMap(cd, in);
@@ -811,7 +810,7 @@ public class ChangeJson {
if (has(ALL_FILES) || (out.isCurrent && has(CURRENT_FILES))) {
try {
out.files = fileInfoJson.toFileInfoMap(cd.change(db), in);
out.files = fileInfoJson.toFileInfoMap(cd.change(), in);
out.files.remove(Patch.COMMIT_MSG);
} catch (PatchListNotAvailableException e) {
log.warn("Cannot load PatchList " + in.getId(), e);

View File

@@ -103,7 +103,7 @@ public class DeleteReviewer implements RestModifyView<ReviewerResource, Input> {
} finally {
db.rollback();
}
indexer.index(rsrc.getChange());
indexer.index(db, rsrc.getChange());
return Response.none();
}

View File

@@ -18,9 +18,11 @@ import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.change.Index.Input;
import com.google.gerrit.server.index.ChangeIndexer;
import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException;
@@ -29,16 +31,19 @@ public class Index implements RestModifyView<ChangeResource, Input> {
public static class Input {
}
private final Provider<ReviewDb> db;
private final ChangeIndexer indexer;
@Inject
Index(ChangeIndexer indexer) {
Index(Provider<ReviewDb> db,
ChangeIndexer indexer) {
this.db = db;
this.indexer = indexer;
}
@Override
public Response<?> apply(ChangeResource rsrc, Input input) throws IOException {
indexer.index(rsrc.getChange());
indexer.index(db.get(), rsrc.getChange());
return Response.none();
}
}

View File

@@ -182,7 +182,7 @@ public class Mergeable implements RestReadView<RevisionResource> {
c.setMergeable(mergeable);
c.setLastSha1MergeTested(toRevId(ref));
db.get().changes().update(Collections.singleton(c));
indexer.index(c);
indexer.index(db.get(), c);
}
return mergeable;
} catch (MergeException | IOException | NoSuchProjectException e) {

View File

@@ -43,14 +43,17 @@ import java.util.TreeMap;
public class ReviewerJson {
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final LabelNormalizer labelNormalizer;
private final AccountInfo.Loader.Factory accountLoaderFactory;
@Inject
ReviewerJson(Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
LabelNormalizer labelNormalizer,
AccountInfo.Loader.Factory accountLoaderFactory) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.labelNormalizer = labelNormalizer;
this.accountLoaderFactory = accountLoaderFactory;
}
@@ -98,8 +101,8 @@ public class ReviewerJson {
// Add dummy approvals for all permitted labels for the user even if they
// do not exist in the DB.
ChangeData cd = new ChangeData(ctl);
PatchSet ps = cd.currentPatchSet(db);
ChangeData cd = changeDataFactory.create(db.get(), ctl);
PatchSet ps = cd.currentPatchSet();
if (ps != null) {
for (SubmitRecord rec :
ctl.canSubmit(db.get(), ps, cd, true, false, true)) {

View File

@@ -205,7 +205,7 @@ public class Submit implements RestModifyView<RevisionResource, SubmitInput>,
} finally {
db.rollback();
}
indexer.index(change);
indexer.index(db, change);
return change;
}

View File

@@ -57,6 +57,7 @@ public class TestSubmitRule implements RestModifyView<RevisionResource, Input> {
}
private final ReviewDb db;
private final ChangeData.Factory changeDataFactory;
private final RulesCache rules;
private final AccountInfo.Loader.Factory accountInfoFactory;
@@ -64,9 +65,12 @@ public class TestSubmitRule implements RestModifyView<RevisionResource, Input> {
private Filters filters = Filters.RUN;
@Inject
TestSubmitRule(ReviewDb db, RulesCache rules,
TestSubmitRule(ReviewDb db,
ChangeData.Factory changeDataFactory,
RulesCache rules,
AccountInfo.Loader.Factory infoFactory) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.rules = rules;
this.accountInfoFactory = infoFactory;
}
@@ -88,7 +92,7 @@ public class TestSubmitRule implements RestModifyView<RevisionResource, Input> {
rsrc.getControl().getProjectControl(),
rsrc.getControl(),
rsrc.getChange(),
new ChangeData(rsrc.getChange()),
changeDataFactory.create(db, rsrc.getChange()),
false,
"locate_submit_rule", "can_submit",
"locate_submit_filter", "filter_submit_results",

View File

@@ -40,14 +40,18 @@ import java.util.List;
public class TestSubmitType implements RestModifyView<RevisionResource, Input> {
private final ReviewDb db;
private final ChangeData.Factory changeDataFactory;
private final RulesCache rules;
@Option(name = "--filters", usage = "impact of filters in parent projects")
private Filters filters = Filters.RUN;
@Inject
TestSubmitType(ReviewDb db, RulesCache rules) {
TestSubmitType(ReviewDb db,
ChangeData.Factory changeDataFactory,
RulesCache rules) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.rules = rules;
}
@@ -68,7 +72,7 @@ public class TestSubmitType implements RestModifyView<RevisionResource, Input> {
rsrc.getControl().getProjectControl(),
rsrc.getControl(),
rsrc.getChange(),
new ChangeData(rsrc.getChange()),
changeDataFactory.create(db, rsrc.getChange()),
false,
"locate_submit_type", "get_submit_type",
"locate_submit_type_filter", "filter_submit_type_results",

View File

@@ -115,6 +115,7 @@ import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.project.ProjectNode;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.project.SectionSortCache;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.ConflictsCacheImpl;
import com.google.gerrit.server.ssh.SshAddressesModule;
@@ -173,6 +174,7 @@ public class GerritGlobalModule extends FactoryModule {
factory(AccountInfoCacheFactory.Factory.class);
factory(AddReviewerSender.Factory.class);
factory(CapabilityControl.Factory.class);
factory(ChangeData.Factory.class);
factory(ChangeQueryBuilder.Factory.class);
factory(CommitMessageEditedSender.Factory.class);
factory(CreateChangeSender.Factory.class);

View File

@@ -48,7 +48,6 @@ import com.google.gerrit.server.data.RefUpdateAttribute;
import com.google.gerrit.server.data.SubmitLabelAttribute;
import com.google.gerrit.server.data.SubmitRecordAttribute;
import com.google.gerrit.server.data.TrackingIdAttribute;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.patch.PatchList;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.patch.PatchListEntry;
@@ -82,7 +81,7 @@ public class EventFactory {
private final PatchSetInfoFactory psInfoFactory;
private final PersonIdent myIdent;
private final Provider<ReviewDb> db;
private final GitRepositoryManager repoManager;
private final ChangeData.Factory changeDataFactory;
private final ApprovalsUtil approvalsUtil;
@Inject
@@ -91,7 +90,8 @@ public class EventFactory {
PatchSetInfoFactory psif,
PatchListCache patchListCache, SchemaFactory<ReviewDb> schema,
@GerritPersonIdent PersonIdent myIdent,
Provider<ReviewDb> db, GitRepositoryManager repoManager,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
ApprovalsUtil approvalsUtil) {
this.accountCache = accountCache;
this.urlProvider = urlProvider;
@@ -100,7 +100,7 @@ public class EventFactory {
this.psInfoFactory = psif;
this.myIdent = myIdent;
this.db = db;
this.repoManager = repoManager;
this.changeDataFactory = changeDataFactory;
this.approvalsUtil = approvalsUtil;
}
@@ -120,7 +120,8 @@ public class EventFactory {
a.number = change.getId().toString();
a.subject = change.getSubject();
try {
a.commitMessage = new ChangeData(change).commitMessage(repoManager, db);
a.commitMessage =
changeDataFactory.create(db.get(), change).commitMessage();
} catch (Exception e) {
log.error("Error while getting full commit message for"
+ " change " + a.number);

View File

@@ -841,7 +841,7 @@ public class MergeOp {
} finally {
db.rollback();
}
indexer.index(c);
indexer.index(db, c);
}
private void setMergedPatchSet(Change.Id changeId, final PatchSet.Id merged)
@@ -1150,7 +1150,7 @@ public class MergeOp {
msg.setMessage("Project was deleted.");
db.changeMessages().insert(Collections.singleton(msg));
db.commit();
indexer.index(change);
indexer.index(db, change);
}
} finally {
db.rollback();

View File

@@ -2300,7 +2300,7 @@ public class ReceiveCommits {
return change;
}
});
indexer.index(change);
indexer.index(db, change);
}
private void sendMergedEmail(final ReplaceRequest result) {

View File

@@ -105,16 +105,19 @@ public class ChangeBatchIndexer {
}
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final GitRepositoryManager repoManager;
private final ListeningExecutorService executor;
private final ChangeIndexer.Factory indexerFactory;
@Inject
ChangeBatchIndexer(Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
GitRepositoryManager repoManager,
@IndexExecutor ListeningExecutorService executor,
ChangeIndexer.Factory indexerFactory) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.repoManager = repoManager;
this.executor = executor;
this.indexerFactory = indexerFactory;
@@ -211,7 +214,7 @@ public class ChangeBatchIndexer {
for (Change c : db.get().changes().byProject(project)) {
Ref r = refs.get(c.currentPatchSetId().toRefName());
if (r != null) {
byId.put(r.getObjectId(), new ChangeData(c));
byId.put(r.getObjectId(), changeDataFactory.create(db.get(), c));
}
}
new ProjectIndexer(indexer, byId, repo, done, failed, verboseWriter)

View File

@@ -64,7 +64,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).getKey().get();
return input.change().getKey().get();
}
};
@@ -76,7 +76,7 @@ public class ChangeField {
public String get(ChangeData input, FillArgs args)
throws OrmException {
return ChangeStatusPredicate.VALUES.get(
input.change(args.db).getStatus());
input.change().getStatus());
}
};
@@ -87,7 +87,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).getProject().get();
return input.change().getProject().get();
}
};
@@ -98,7 +98,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).getDest().get();
return input.change().getDest().get();
}
};
@@ -109,7 +109,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).getTopic();
return input.change().getTopic();
}
};
@@ -120,7 +120,7 @@ public class ChangeField {
@Override
public Timestamp get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).getLastUpdatedOn();
return input.change().getLastUpdatedOn();
}
};
@@ -140,7 +140,7 @@ public class ChangeField {
@Override
public Long get(ChangeData input, FillArgs args)
throws OrmException {
return legacyParseSortKey(input.change(args.db).getSortKey());
return legacyParseSortKey(input.change().getSortKey());
}
};
@@ -156,7 +156,7 @@ public class ChangeField {
@Override
public Long get(ChangeData input, FillArgs args)
throws OrmException {
return ChangeUtil.parseSortKey(input.change(args.db).getSortKey());
return ChangeUtil.parseSortKey(input.change().getSortKey());
}
};
@@ -167,7 +167,7 @@ public class ChangeField {
@Override
public Iterable<String> get(ChangeData input, FillArgs args)
throws OrmException {
return input.currentFilePaths(args.db, args.patchListCache);
return input.currentFilePaths();
}
};
@@ -178,7 +178,7 @@ public class ChangeField {
@Override
public Integer get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).getOwner().get();
return input.change().getOwner().get();
}
};
@@ -190,7 +190,7 @@ public class ChangeField {
public Iterable<Integer> get(ChangeData input, FillArgs args)
throws OrmException {
Set<Integer> r = Sets.newHashSet();
for (PatchSetApproval a : input.allApprovals(args.db)) {
for (PatchSetApproval a : input.allApprovals()) {
r.add(a.getAccountId().get());
}
return r;
@@ -205,7 +205,7 @@ public class ChangeField {
public Iterable<String> get(ChangeData input, FillArgs args)
throws OrmException {
Set<String> revisions = Sets.newHashSet();
for (PatchSet ps : input.patches(args.db)) {
for (PatchSet ps : input.patches()) {
if (ps.getRevision() != null) {
revisions.add(ps.getRevision().get());
}
@@ -223,7 +223,7 @@ public class ChangeField {
throws OrmException {
try {
return Sets.newHashSet(args.trackingFooters.extract(
input.commitFooters(args.repoManager, args.db)).values());
input.commitFooters()).values());
} catch (IOException e) {
throw new OrmException(e);
}
@@ -239,7 +239,7 @@ public class ChangeField {
throws OrmException {
Set<String> allApprovals = Sets.newHashSet();
Set<String> distinctApprovals = Sets.newHashSet();
for (PatchSetApproval a : input.currentApprovals(args.db)) {
for (PatchSetApproval a : input.currentApprovals()) {
if (a.getValue() != 0) {
allApprovals.add(formatLabel(a.getLabel(), a.getValue(),
a.getAccountId()));
@@ -258,7 +258,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
for (PatchSetApproval a : input.currentApprovals(args.db)) {
for (PatchSetApproval a : input.currentApprovals()) {
if (a.getValue() != 0) {
return "1";
}
@@ -278,7 +278,7 @@ public class ChangeField {
@Override
public byte[] get(ChangeData input, FieldDef.FillArgs args)
throws OrmException {
return CODEC.encodeToByteArray(input.change(args.db));
return CODEC.encodeToByteArray(input.change());
}
}
@@ -297,7 +297,7 @@ public class ChangeField {
@Override
public Iterable<byte[]> get(ChangeData input, FillArgs args)
throws OrmException {
return toProtos(CODEC, input.currentApprovals(args.db));
return toProtos(CODEC, input.currentApprovals());
}
}
@@ -324,7 +324,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args) throws OrmException {
try {
return input.commitMessage(args.repoManager, args.db);
return input.commitMessage();
} catch (IOException e) {
throw new OrmException(e);
}
@@ -339,10 +339,10 @@ public class ChangeField {
public Iterable<String> get(ChangeData input, FillArgs args)
throws OrmException {
Set<String> r = Sets.newHashSet();
for (PatchLineComment c : input.comments(args.db)) {
for (PatchLineComment c : input.comments()) {
r.add(c.getMessage());
}
for (ChangeMessage m : input.messages(args.db)) {
for (ChangeMessage m : input.messages()) {
r.add(m.getMessage());
}
return r;
@@ -356,7 +356,7 @@ public class ChangeField {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
return input.change(args.db).isMergeable() ? "1" : null;
return input.change().isMergeable() ? "1" : null;
}
};

View File

@@ -66,7 +66,7 @@ public interface ChangeIndex {
/**
* Delete a change document from the index.
*
* @param cd change document.
* @param cd change document
*
* @throws IOException
*/

View File

@@ -77,16 +77,19 @@ public class ChangeIndexer {
private final IndexCollection indexes;
private final ChangeIndex index;
private final SchemaFactory<ReviewDb> schemaFactory;
private final ChangeData.Factory changeDataFactory;
private final ThreadLocalRequestContext context;
private final ListeningExecutorService executor;
@AssistedInject
ChangeIndexer(@IndexExecutor ListeningExecutorService executor,
SchemaFactory<ReviewDb> schemaFactory,
ChangeData.Factory changeDataFactory,
ThreadLocalRequestContext context,
@Assisted ChangeIndex index) {
this.executor = executor;
this.schemaFactory = schemaFactory;
this.changeDataFactory = changeDataFactory;
this.context = context;
this.index = index;
this.indexes = null;
@@ -95,10 +98,12 @@ public class ChangeIndexer {
@AssistedInject
ChangeIndexer(@IndexExecutor ListeningExecutorService executor,
SchemaFactory<ReviewDb> schemaFactory,
ChangeData.Factory changeDataFactory,
ThreadLocalRequestContext context,
@Assisted IndexCollection indexes) {
this.executor = executor;
this.schemaFactory = schemaFactory;
this.changeDataFactory = changeDataFactory;
this.context = context;
this.index = null;
this.indexes = indexes;
@@ -112,19 +117,10 @@ public class ChangeIndexer {
*/
public CheckedFuture<?, IOException> indexAsync(Change change) {
return executor != null
? submit(new Task(new ChangeData(change), false))
? submit(new Task(change, false))
: Futures.<Object, IOException> immediateCheckedFuture(null);
}
/**
* Synchronously index a change.
*
* @param change change to index.
*/
public void index(Change change) throws IOException {
index(new ChangeData(change));
}
/**
* Synchronously index a change.
*
@@ -136,6 +132,16 @@ public class ChangeIndexer {
}
}
/**
* Synchronously index a change.
*
* @param change change to index.
* @param db review database.
*/
public void index(ReviewDb db, Change change) throws IOException {
index(changeDataFactory.create(db, change));
}
/**
* Start deleting a change.
*
@@ -144,19 +150,10 @@ public class ChangeIndexer {
*/
public CheckedFuture<?, IOException> deleteAsync(Change change) {
return executor != null
? submit(new Task(new ChangeData(change), true))
? submit(new Task(change, true))
: Futures.<Object, IOException> immediateCheckedFuture(null);
}
/**
* Synchronously delete a change.
*
* @param change change to delete.
*/
public void delete(Change change) throws IOException {
delete(new ChangeData(change));
}
/**
* Synchronously delete a change.
*
@@ -168,6 +165,16 @@ public class ChangeIndexer {
}
}
/**
* Synchronously delete a change.
*
* @param change change to delete.
* @param db review database.
*/
public void delete(ReviewDb db, Change change) throws IOException {
delete(changeDataFactory.create(db, change));
}
private Collection<ChangeIndex> getWriteIndexes() {
return indexes != null
? indexes.getWriteIndexes()
@@ -179,11 +186,11 @@ public class ChangeIndexer {
}
private class Task implements Callable<Void> {
private final ChangeData cd;
private final Change change;
private final boolean delete;
private Task(ChangeData cd, boolean delete) {
this.cd = cd;
private Task(Change change, boolean delete) {
this.change = change;
this.delete = delete;
}
@@ -192,7 +199,7 @@ public class ChangeIndexer {
try {
final AtomicReference<Provider<ReviewDb>> dbRef =
Atomics.newReference();
RequestContext oldCtx = context.setContext(new RequestContext() {
RequestContext newCtx = new RequestContext() {
@Override
public Provider<ReviewDb> getReviewDbProvider() {
Provider<ReviewDb> db = dbRef.get();
@@ -214,8 +221,11 @@ public class ChangeIndexer {
public CurrentUser getCurrentUser() {
throw new OutOfScopeException("No user during ChangeIndexer");
}
});
};
RequestContext oldCtx = context.setContext(newCtx);
try {
ChangeData cd = changeDataFactory.create(
newCtx.getReviewDbProvider().get(), change);
if (delete) {
for (ChangeIndex i : getWriteIndexes()) {
i.delete(cd);
@@ -236,14 +246,14 @@ public class ChangeIndexer {
} catch (Exception e) {
log.error(String.format(
"Failed to index change %d in %s",
cd.getId().get(), cd.getChange().getProject().get()), e);
change.getId().get(), change.getProject().get()), e);
throw e;
}
}
@Override
public String toString() {
return "index-change-" + cd.getId().get();
return "index-change-" + change.getId().get();
}
}
}

View File

@@ -14,13 +14,9 @@
package com.google.gerrit.server.index;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Definition of a field stored in the secondary index.
@@ -58,20 +54,11 @@ public abstract class FieldDef<I, T> {
/** Arguments needed to fill in missing data in the input object. */
public static class FillArgs {
final Provider<ReviewDb> db;
final GitRepositoryManager repoManager;
final TrackingFooters trackingFooters;
final PatchListCache patchListCache;
@Inject
FillArgs(Provider<ReviewDb> db,
GitRepositoryManager repoManager,
TrackingFooters trackingFooters,
PatchListCache patchListCache) {
this.db = db;
this.repoManager = repoManager;
FillArgs(TrackingFooters trackingFooters) {
this.trackingFooters = trackingFooters;
this.patchListCache = patchListCache;
}
}

View File

@@ -145,7 +145,7 @@ public class IndexRewriteImpl implements ChangeQueryRewriter {
Predicate<ChangeData> out = rewriteImpl(in, index, limit);
if (in == out || out instanceof IndexPredicate) {
return new IndexedChangeQuery(db, index, out, limit);
return new IndexedChangeQuery(index, out, limit);
} else if (out == null /* cannot rewrite */) {
return in;
} else {
@@ -222,7 +222,7 @@ public class IndexRewriteImpl implements ChangeQueryRewriter {
if (isIndexed.cardinality() == 1) {
int i = isIndexed.nextSetBit(0);
newChildren.add(
0, new IndexedChangeQuery(db, index, newChildren.remove(i), limit));
0, new IndexedChangeQuery(index, newChildren.remove(i), limit));
return copy(in, newChildren);
}
@@ -242,7 +242,7 @@ public class IndexRewriteImpl implements ChangeQueryRewriter {
all.add(c);
}
}
all.add(0, new IndexedChangeQuery(db, index, in.copy(indexed), limit));
all.add(0, new IndexedChangeQuery(index, in.copy(indexed), limit));
return copy(in, all);
}

View File

@@ -20,7 +20,6 @@ import com.google.common.base.Objects;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData;
@@ -29,7 +28,6 @@ import com.google.gerrit.server.query.change.Paginated;
import com.google.gerrit.server.query.change.SortKeyPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.Collection;
import java.util.Iterator;
@@ -80,16 +78,14 @@ public class IndexedChangeQuery extends Predicate<ChangeData>
}
}
private final Provider<ReviewDb> db;
private final ChangeIndex index;
private final int limit;
private Predicate<ChangeData> pred;
private ChangeDataSource source;
public IndexedChangeQuery(Provider<ReviewDb> db, ChangeIndex index,
Predicate<ChangeData> pred, int limit) throws QueryParseException {
this.db = db;
public IndexedChangeQuery(ChangeIndex index, Predicate<ChangeData> pred,
int limit) throws QueryParseException {
this.index = index;
this.limit = limit;
this.pred = pred;
@@ -168,7 +164,7 @@ public class IndexedChangeQuery extends Predicate<ChangeData>
@Override
public ResultSet<ChangeData> restart(ChangeData last) throws OrmException {
pred = replaceSortKeyPredicates(pred, last.change(db).getSortKey());
pred = replaceSortKeyPredicates(pred, last.change().getSortKey());
try {
source = index.getSource(pred, limit);
} catch (QueryParseException e) {

View File

@@ -71,7 +71,7 @@ public abstract class ChangeEmail extends NotificationEmail {
protected ChangeEmail(EmailArguments ea, Change c, String mc) {
super(ea, mc, c.getProject(), c.getDest());
change = c;
changeData = new ChangeData(change);
changeData = ea.changeDataFactory.create(ea.db.get(), change);
emailOnlyAuthors = false;
}

View File

@@ -31,6 +31,7 @@ import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
import com.google.inject.Inject;
@@ -61,6 +62,7 @@ class EmailArguments {
final ChangeQueryBuilder.Factory queryBuilder;
final Provider<ReviewDb> db;
final ChangeData.Factory changeDataFactory;
final RuntimeInstance velocityRuntime;
final EmailSettings settings;
@@ -80,6 +82,7 @@ class EmailArguments {
AllProjectsName allProjectsName,
ChangeQueryBuilder.Factory queryBuilder,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
RuntimeInstance velocityRuntime,
EmailSettings settings,
@SshAdvertisedAddresses List<String> sshAddresses) {
@@ -101,6 +104,7 @@ class EmailArguments {
this.allProjectsName = allProjectsName;
this.queryBuilder = queryBuilder;
this.db = db;
this.changeDataFactory = changeDataFactory;
this.velocityRuntime = velocityRuntime;
this.settings = settings;
this.sshAddresses = sshAddresses;

View File

@@ -35,7 +35,6 @@ import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.util.Providers;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.ListTerm;
@@ -329,7 +328,7 @@ public class ChangeControl {
throws OrmException {
if (getCurrentUser().isIdentifiedUser()) {
Collection<Account.Id> results = cd != null
? cd.reviewers(Providers.of(db)).values()
? cd.reviewers().values()
: approvalsUtil.getReviewers(db, change.getId()).values();
IdentifiedUser user = (IdentifiedUser) getCurrentUser();
return results.contains(user.getAccountId());

View File

@@ -18,23 +18,19 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.TimestampRangePredicate;
import com.google.gerrit.server.util.TimeUtil;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import java.sql.Timestamp;
public class AgePredicate extends TimestampRangePredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final long cut;
AgePredicate(Provider<ReviewDb> dbProvider, String value) {
AgePredicate(String value) {
super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_AGE, value);
this.dbProvider = dbProvider;
long s = ConfigUtil.getTimeUnit(getValue(), 0, SECONDS);
long ms = MILLISECONDS.convert(s, SECONDS);
@@ -55,7 +51,7 @@ public class AgePredicate extends TimestampRangePredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
return change != null && change.getLastUpdatedOn().getTime() <= cut;
}

View File

@@ -35,7 +35,7 @@ public class BasicChangeRewrites extends QueryRewriter<ChangeData> {
new InvalidProvider<ReviewDb>(), //
new InvalidProvider<ChangeQueryRewriter>(), //
null, null, null, null, null, null, null, //
null, null, null, null, null, null, null, null), null);
null, null, null, null, null, null, null, null, null), null);
private static final QueryRewriter.Definition<ChangeData, BasicChangeRewrites> mydef =
new QueryRewriter.Definition<ChangeData, BasicChangeRewrites>(
@@ -73,7 +73,7 @@ public class BasicChangeRewrites extends QueryRewriter<ChangeData> {
@Rewrite("-status:merged")
public Predicate<ChangeData> r00_notMerged() {
return or(ChangeStatusPredicate.open(dbProvider),
new ChangeStatusPredicate(dbProvider, Change.Status.ABANDONED));
new ChangeStatusPredicate(Change.Status.ABANDONED));
}
@SuppressWarnings("unchecked")
@@ -81,7 +81,7 @@ public class BasicChangeRewrites extends QueryRewriter<ChangeData> {
@Rewrite("-status:abandoned")
public Predicate<ChangeData> r00_notAbandoned() {
return or(ChangeStatusPredicate.open(dbProvider),
new ChangeStatusPredicate(dbProvider, Change.Status.MERGED));
new ChangeStatusPredicate(Change.Status.MERGED));
}
@SuppressWarnings("unchecked")

View File

@@ -16,6 +16,7 @@ package com.google.gerrit.server.query.change;
import static com.google.gerrit.server.ApprovalsUtil.sortApprovals;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Objects;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
@@ -45,6 +46,8 @@ import com.google.gerrit.server.project.ChangeControl;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
@@ -82,7 +85,7 @@ public class ChangeData {
public static void ensureAllPatchSetsLoaded(Provider<ReviewDb> db,
Iterable<ChangeData> changes) throws OrmException {
for (ChangeData cd : changes) {
cd.patches(db);
cd.patches();
}
}
@@ -91,7 +94,7 @@ public class ChangeData {
Map<PatchSet.Id, ChangeData> missing = Maps.newHashMap();
for (ChangeData cd : changes) {
if (cd.currentPatchSet == null && cd.patches == null) {
missing.put(cd.change(db).currentPatchSetId(), cd);
missing.put(cd.change().currentPatchSetId(), cd);
}
}
if (!missing.isEmpty()) {
@@ -111,7 +114,7 @@ public class ChangeData {
for (ChangeData cd : changes) {
if (cd.currentApprovals == null && cd.limitedApprovals == null) {
pending.add(db.get().patchSetApprovals()
.byPatchSet(cd.change(db).currentPatchSetId()));
.byPatchSet(cd.change().currentPatchSetId()));
}
}
if (!pending.isEmpty()) {
@@ -124,6 +127,15 @@ public class ChangeData {
}
}
public interface Factory {
ChangeData create(ReviewDb db, Change.Id id);
ChangeData create(ReviewDb db, Change c);
ChangeData create(ReviewDb db, ChangeControl c);
}
private final ReviewDb db;
private final GitRepositoryManager repoManager;
private final PatchListCache patchListCache;
private final Change.Id legacyId;
private ChangeDataSource returnedBySource;
private Change change;
@@ -144,16 +156,41 @@ public class ChangeData {
private ChangedLines changedLines;
private boolean patchesLoaded;
public ChangeData(final Change.Id id) {
@VisibleForTesting
@AssistedInject
public ChangeData(
GitRepositoryManager repoManager,
PatchListCache patchListCache,
@Assisted ReviewDb db,
@Assisted Change.Id id) {
this.db = db;
this.repoManager = repoManager;
this.patchListCache = patchListCache;
legacyId = id;
}
public ChangeData(final Change c) {
@AssistedInject
ChangeData(
GitRepositoryManager repoManager,
PatchListCache patchListCache,
@Assisted ReviewDb db,
@Assisted Change c) {
this.db = db;
this.repoManager = repoManager;
this.patchListCache = patchListCache;
legacyId = c.getId();
change = c;
}
public ChangeData(final ChangeControl c) {
@AssistedInject
ChangeData(
GitRepositoryManager repoManager,
PatchListCache patchListCache,
@Assisted ReviewDb db,
@Assisted ChangeControl c) {
this.db = db;
this.repoManager = repoManager;
this.patchListCache = patchListCache;
legacyId = c.getChange().getId();
change = c.getChange();
changeControl = c;
@@ -186,21 +223,20 @@ public class ChangeData {
currentFiles = ImmutableList.copyOf(filePaths);
}
public List<String> currentFilePaths(Provider<ReviewDb> db,
PatchListCache cache) throws OrmException {
public List<String> currentFilePaths() throws OrmException {
if (currentFiles == null) {
Change c = change(db);
Change c = change();
if (c == null) {
return null;
}
PatchSet ps = currentPatchSet(db);
PatchSet ps = currentPatchSet();
if (ps == null) {
return null;
}
PatchList p;
try {
p = cache.get(c, ps);
p = patchListCache.get(c, ps);
} catch (PatchListNotAvailableException e) {
currentFiles = Collections.emptyList();
return currentFiles;
@@ -232,22 +268,21 @@ public class ChangeData {
return currentFiles;
}
public ChangedLines changedLines(Provider<ReviewDb> db,
PatchListCache cache) throws OrmException {
public ChangedLines changedLines() throws OrmException {
if (changedLines == null) {
Change c = change(db);
Change c = change();
if (c == null) {
return null;
}
PatchSet ps = currentPatchSet(db);
PatchSet ps = currentPatchSet();
if (ps == null) {
return null;
}
PatchList p;
try {
p = cache.get(c, ps);
p = patchListCache.get(c, ps);
} catch (PatchListNotAvailableException e) {
return null;
}
@@ -282,9 +317,9 @@ public class ChangeData {
changeControl = ctl;
}
public Change change(Provider<ReviewDb> db) throws OrmException {
public Change change() throws OrmException {
if (change == null) {
change = db.get().changes().get(legacyId);
change = db.changes().get(legacyId);
}
return change;
}
@@ -293,13 +328,13 @@ public class ChangeData {
change = c;
}
public PatchSet currentPatchSet(Provider<ReviewDb> db) throws OrmException {
public PatchSet currentPatchSet() throws OrmException {
if (currentPatchSet == null) {
Change c = change(db);
Change c = change();
if (c == null) {
return null;
}
for (PatchSet p : patches(db)) {
for (PatchSet p : patches()) {
if (p.getId().equals(c.currentPatchSetId())) {
currentPatchSet = p;
return p;
@@ -309,10 +344,10 @@ public class ChangeData {
return currentPatchSet;
}
public List<PatchSetApproval> currentApprovals(Provider<ReviewDb> db)
public List<PatchSetApproval> currentApprovals()
throws OrmException {
if (currentApprovals == null) {
Change c = change(db);
Change c = change();
if (c == null) {
currentApprovals = Collections.emptyList();
} else if (allApprovals != null) {
@@ -321,7 +356,7 @@ public class ChangeData {
(limitedIds == null || limitedIds.contains(c.currentPatchSetId()))) {
return limitedApprovals.get(c.currentPatchSetId());
} else {
currentApprovals = sortApprovals(db.get().patchSetApprovals()
currentApprovals = sortApprovals(db.patchSetApprovals()
.byPatchSet(c.currentPatchSetId()));
}
}
@@ -332,27 +367,25 @@ public class ChangeData {
currentApprovals = approvals;
}
public String commitMessage(GitRepositoryManager repoManager,
Provider<ReviewDb> db) throws IOException, OrmException {
public String commitMessage() throws IOException, OrmException {
if (commitMessage == null) {
loadCommitData(repoManager, db);
loadCommitData();
}
return commitMessage;
}
public List<FooterLine> commitFooters(GitRepositoryManager repoManager,
Provider<ReviewDb> db) throws IOException, OrmException {
public List<FooterLine> commitFooters() throws IOException, OrmException {
if (commitFooters == null) {
loadCommitData(repoManager, db);
loadCommitData();
}
return commitFooters;
}
private void loadCommitData(GitRepositoryManager repoManager,
Provider<ReviewDb> db) throws OrmException, RepositoryNotFoundException,
IOException, MissingObjectException, IncorrectObjectTypeException {
PatchSet.Id psId = change(db).currentPatchSetId();
String sha1 = db.get().patchSets().get(psId).getRevision().get();
private void loadCommitData() throws OrmException,
RepositoryNotFoundException, IOException, MissingObjectException,
IncorrectObjectTypeException {
PatchSet.Id psId = change().currentPatchSetId();
String sha1 = db.patchSets().get(psId).getRevision().get();
Repository repo = repoManager.openRepository(change.getProject());
try {
RevWalk walk = new RevWalk(repo);
@@ -369,23 +402,22 @@ public class ChangeData {
}
/**
* @param db review database.
* @return patches for the change. If {@link #limitToPatchSets(Collection)}
* was previously called, only contains patches with the specified IDs.
* @throws OrmException an error occurred reading the database.
*/
public Collection<PatchSet> patches(Provider<ReviewDb> db)
public Collection<PatchSet> patches()
throws OrmException {
if (patches == null || !patchesLoaded) {
if (limitedIds != null) {
patches = Lists.newArrayList();
for (PatchSet ps : db.get().patchSets().byChange(legacyId)) {
for (PatchSet ps : db.patchSets().byChange(legacyId)) {
if (limitedIds.contains(ps.getId())) {
patches.add(ps);
}
}
} else {
patches = db.get().patchSets().byChange(legacyId).toList();
patches = db.patchSets().byChange(legacyId).toList();
}
patchesLoaded = true;
}
@@ -393,27 +425,25 @@ public class ChangeData {
}
/**
* @param db review database.
* @return patch set approvals for the change in timestamp order. If
* {@link #limitToPatchSets(Collection)} was previously called, only contains
* approvals for the patches with the specified IDs.
* @throws OrmException an error occurred reading the database.
*/
public List<PatchSetApproval> approvals(Provider<ReviewDb> db)
public List<PatchSetApproval> approvals()
throws OrmException {
return ImmutableList.copyOf(approvalsMap(db).values());
return ImmutableList.copyOf(approvalsMap().values());
}
/**
* @param db review database.
* @return patch set approvals for the change, keyed by ID, ordered by
* timestamp within each patch set. If
* {@link #limitToPatchSets(Collection)} was previously called, only
* contains approvals for the patches with the specified IDs.
* @throws OrmException an error occurred reading the database.
*/
public ListMultimap<PatchSet.Id, PatchSetApproval> approvalsMap(
Provider<ReviewDb> db) throws OrmException {
public ListMultimap<PatchSet.Id, PatchSetApproval> approvalsMap()
throws OrmException {
if (limitedApprovals == null) {
limitedApprovals = ArrayListMultimap.create();
if (allApprovals != null) {
@@ -422,7 +452,7 @@ public class ChangeData {
}
} else {
for (PatchSetApproval psa : sortApprovals(
db.get().patchSetApprovals().byChange(legacyId))) {
db.patchSetApprovals().byChange(legacyId))) {
if (limitedIds == null || limitedIds.contains(legacyId)) {
limitedApprovals.put(psa.getPatchSetId(), psa);
}
@@ -433,53 +463,51 @@ public class ChangeData {
}
/**
* @param db review database.
* @return all patch set approvals for the change in timestamp order
* (regardless of whether {@link #limitToPatchSets(Collection)} was
* previously called).
* @throws OrmException an error occurred reading the database.
*/
public List<PatchSetApproval> allApprovals(Provider<ReviewDb> db)
public List<PatchSetApproval> allApprovals()
throws OrmException {
return ImmutableList.copyOf(allApprovalsMap(db).values());
return ImmutableList.copyOf(allApprovalsMap().values());
}
/**
* @param db review database.
* @return all patch set approvals for the change (regardless of whether
* {@link #limitToPatchSets(Collection)} was previously called), keyed by
* ID, ordered by timestamp within each patch set.
* @throws OrmException an error occurred reading the database.
*/
public ListMultimap<PatchSet.Id, PatchSetApproval> allApprovalsMap(
Provider<ReviewDb> db) throws OrmException {
public ListMultimap<PatchSet.Id, PatchSetApproval> allApprovalsMap()
throws OrmException {
if (allApprovals == null) {
allApprovals = ArrayListMultimap.create();
for (PatchSetApproval psa : sortApprovals(
db.get().patchSetApprovals().byChange(legacyId))) {
db.patchSetApprovals().byChange(legacyId))) {
allApprovals.put(psa.getPatchSetId(), psa);
}
}
return allApprovals;
}
public SetMultimap<ReviewerState, Account.Id> reviewers(Provider<ReviewDb> db)
public SetMultimap<ReviewerState, Account.Id> reviewers()
throws OrmException {
return ApprovalsUtil.getReviewers(allApprovals(db));
return ApprovalsUtil.getReviewers(allApprovals());
}
public Collection<PatchLineComment> comments(Provider<ReviewDb> db)
public Collection<PatchLineComment> comments()
throws OrmException {
if (comments == null) {
comments = db.get().patchComments().byChange(legacyId).toList();
comments = db.patchComments().byChange(legacyId).toList();
}
return comments;
}
public List<ChangeMessage> messages(Provider<ReviewDb> db)
public List<ChangeMessage> messages()
throws OrmException {
if (messages == null) {
messages = db.get().changeMessages().byChange(legacyId).toList();
messages = db.changeMessages().byChange(legacyId).toList();
}
return messages;
}

View File

@@ -16,38 +16,31 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
abstract class ChangeDataResultSet<T> extends AbstractResultSet<ChangeData> {
static ResultSet<ChangeData> change(final ResultSet<Change> rs) {
static ResultSet<ChangeData> change(final ChangeData.Factory factory,
final Provider<ReviewDb> db, final ResultSet<Change> rs) {
return new ChangeDataResultSet<Change>(rs, true) {
@Override
ChangeData convert(Change t) {
return new ChangeData(t);
return factory.create(db.get(), t);
}
};
}
static ResultSet<ChangeData> patchSet(final ResultSet<PatchSet> rs) {
static ResultSet<ChangeData> patchSet(final ChangeData.Factory factory,
final Provider<ReviewDb> db, final ResultSet<PatchSet> rs) {
return new ChangeDataResultSet<PatchSet>(rs, false) {
@Override
ChangeData convert(PatchSet t) {
return new ChangeData(t.getId().getParentKey());
}
};
}
static ResultSet<ChangeData> patchSetApproval(
final ResultSet<PatchSetApproval> rs) {
return new ChangeDataResultSet<PatchSetApproval>(rs, false) {
@Override
ChangeData convert(PatchSetApproval t) {
return new ChangeData(t.getPatchSetId().getParentKey());
return factory.create(db.get(), t.getId().getParentKey());
}
};
}

View File

@@ -15,25 +15,24 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
class ChangeIdPredicate extends IndexPredicate<ChangeData> implements
ChangeDataSource {
private final Provider<ReviewDb> dbProvider;
private final Arguments args;
ChangeIdPredicate(Provider<ReviewDb> dbProvider, String id) {
ChangeIdPredicate(Arguments args, String id) {
super(ChangeField.ID, ChangeQueryBuilder.FIELD_CHANGE, id);
this.dbProvider = dbProvider;
this.args = args;
}
@Override
public boolean match(final ChangeData cd) throws OrmException {
Change change = cd.change(dbProvider);
Change change = cd.change();
if (change == null) {
return false;
}
@@ -49,8 +48,8 @@ class ChangeIdPredicate extends IndexPredicate<ChangeData> implements
public ResultSet<ChangeData> read() throws OrmException {
Change.Key a = new Change.Key(getValue());
Change.Key b = a.max();
return ChangeDataResultSet.change( //
dbProvider.get().changes().byKeyRange(a, b));
return ChangeDataResultSet.change(args.changeDataFactory, args.db,
args.db.get().changes().byKeyRange(a, b));
}
@Override

View File

@@ -142,12 +142,13 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@VisibleForTesting
public static class Arguments {
final Provider<ReviewDb> dbProvider;
final Provider<ReviewDb> db;
final Provider<ChangeQueryRewriter> rewriter;
final IdentifiedUser.GenericFactory userFactory;
final Provider<CurrentUser> self;
final CapabilityControl.Factory capabilityControlFactory;
final ChangeControl.GenericFactory changeControlGenericFactory;
final ChangeData.Factory changeDataFactory;
final AccountResolver accountResolver;
final GroupBackend groupBackend;
final AllProjectsName allProjectsName;
@@ -168,6 +169,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
Provider<CurrentUser> self,
CapabilityControl.Factory capabilityControlFactory,
ChangeControl.GenericFactory changeControlGenericFactory,
ChangeData.Factory changeDataFactory,
AccountResolver accountResolver,
GroupBackend groupBackend,
AllProjectsName allProjectsName,
@@ -179,12 +181,13 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
SubmitStrategyFactory submitStrategyFactory,
ConflictsCache conflictsCache,
TrackingFooters trackingFooters) {
this.dbProvider = dbProvider;
this.db = dbProvider;
this.rewriter = rewriter;
this.userFactory = userFactory;
this.self = self;
this.capabilityControlFactory = capabilityControlFactory;
this.changeControlGenericFactory = changeControlGenericFactory;
this.changeDataFactory = changeDataFactory;
this.accountResolver = accountResolver;
this.groupBackend = groupBackend;
this.allProjectsName = allProjectsName;
@@ -224,17 +227,16 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> age(String value) {
return new AgePredicate(args.dbProvider, value);
return new AgePredicate(value);
}
@Operator
public Predicate<ChangeData> change(String query) {
if (PAT_LEGACY_ID.matcher(query).matches()) {
return new LegacyChangeIdPredicate(args.dbProvider, Change.Id
.parse(query));
return new LegacyChangeIdPredicate(args, Change.Id.parse(query));
} else if (PAT_CHANGE_ID.matcher(query).matches()) {
return new ChangeIdPredicate(args.dbProvider, parseChangeId(query));
return new ChangeIdPredicate(args, parseChangeId(query));
}
throw new IllegalArgumentException();
@@ -243,7 +245,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> comment(String value) throws QueryParseException {
ChangeIndex index = args.indexes.getSearchIndex();
return new CommentPredicate(args.dbProvider, index, value);
return new CommentPredicate(args, index, value);
}
@Operator
@@ -252,28 +254,28 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
return status_open();
} else if ("closed".equals(statusName)) {
return ChangeStatusPredicate.closed(args.dbProvider);
return ChangeStatusPredicate.closed(args.db);
} else if ("reviewed".equalsIgnoreCase(statusName)) {
return new IsReviewedPredicate(args.dbProvider);
return new IsReviewedPredicate();
} else {
return new ChangeStatusPredicate(args.dbProvider, statusName);
return new ChangeStatusPredicate(statusName);
}
}
public Predicate<ChangeData> status_open() {
return ChangeStatusPredicate.open(args.dbProvider);
return ChangeStatusPredicate.open(args.db);
}
@Operator
public Predicate<ChangeData> has(String value) {
if ("star".equalsIgnoreCase(value)) {
return new IsStarredByPredicate(args.dbProvider, currentUser);
return new IsStarredByPredicate(args, currentUser);
}
if ("draft".equalsIgnoreCase(value)) {
return new HasDraftByPredicate(args.dbProvider, self());
return new HasDraftByPredicate(args, self());
}
throw new IllegalArgumentException();
@@ -282,7 +284,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> is(String value) throws QueryParseException {
if ("starred".equalsIgnoreCase(value)) {
return new IsStarredByPredicate(args.dbProvider, currentUser);
return new IsStarredByPredicate(args, currentUser);
}
if ("watched".equalsIgnoreCase(value)) {
@@ -294,19 +296,19 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
}
if ("reviewed".equalsIgnoreCase(value)) {
return new IsReviewedPredicate(args.dbProvider);
return new IsReviewedPredicate();
}
if ("owner".equalsIgnoreCase(value)) {
return new OwnerPredicate(args.dbProvider, self());
return new OwnerPredicate(self());
}
if ("reviewer".equalsIgnoreCase(value)) {
return new ReviewerPredicate(args.dbProvider, self());
return new ReviewerPredicate(self());
}
if ("mergeable".equalsIgnoreCase(value)) {
return new IsMergeablePredicate(args.dbProvider);
return new IsMergeablePredicate();
}
try {
@@ -320,17 +322,13 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> commit(String id) {
return new CommitPredicate(args.dbProvider, AbbreviatedObjectId
.fromString(id));
return new CommitPredicate(args, AbbreviatedObjectId.fromString(id));
}
@Operator
public Predicate<ChangeData> conflicts(String value) throws OrmException,
QueryParseException {
return new ConflictsPredicate(args.dbProvider, args.patchListCache,
args.submitStrategyFactory, args.changeControlGenericFactory,
args.userFactory, args.repoManager, args.projectCache,
args.conflictsCache, value, parseChange(value));
return new ConflictsPredicate(args, value, parseChange(value));
}
@Operator
@@ -341,13 +339,13 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> project(String name) {
if (name.startsWith("^"))
return new RegexProjectPredicate(args.dbProvider, name);
return new ProjectPredicate(args.dbProvider, name);
return new RegexProjectPredicate(name);
return new ProjectPredicate(name);
}
@Operator
public Predicate<ChangeData> parentproject(String name) {
return new ParentProjectPredicate(args.dbProvider, args.projectCache,
return new ParentProjectPredicate(args.db, args.projectCache,
args.listChildProjects, args.self, name);
}
@@ -367,15 +365,15 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> topic(String name) {
if (name.startsWith("^"))
return new RegexTopicPredicate(args.dbProvider, name);
return new TopicPredicate(args.dbProvider, name);
return new RegexTopicPredicate(name);
return new TopicPredicate(name);
}
@Operator
public Predicate<ChangeData> ref(String ref) {
if (ref.startsWith("^"))
return new RegexRefPredicate(args.dbProvider, ref);
return new RefPredicate(args.dbProvider, ref);
return new RegexRefPredicate(ref);
return new RefPredicate(ref);
}
@Operator
@@ -386,9 +384,9 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> file(String file) throws QueryParseException {
if (file.startsWith("^")) {
return new RegexFilePredicate(args.dbProvider, args.patchListCache, file);
return new RegexFilePredicate(file);
} else {
return new EqualsFilePredicate(args.dbProvider, args.patchListCache, file);
return new EqualsFilePredicate(file);
}
}
@@ -442,27 +440,27 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
}
return new LabelPredicate(args.projectCache,
args.changeControlGenericFactory, args.userFactory, args.dbProvider,
args.changeControlGenericFactory, args.userFactory, args.db,
name, accounts, group);
}
@Operator
public Predicate<ChangeData> message(String text) throws QueryParseException {
ChangeIndex index = args.indexes.getSearchIndex();
return new MessagePredicate(args.dbProvider, index, text);
return new MessagePredicate(args, index, text);
}
@Operator
public Predicate<ChangeData> starredby(String who)
throws QueryParseException, OrmException {
if ("self".equals(who)) {
return new IsStarredByPredicate(args.dbProvider, currentUser);
return new IsStarredByPredicate(args, currentUser);
}
Set<Account.Id> m = parseAccount(who);
List<IsStarredByPredicate> p = Lists.newArrayListWithCapacity(m.size());
for (Account.Id id : m) {
p.add(new IsStarredByPredicate(args.dbProvider,
args.userFactory.create(args.dbProvider, id)));
p.add(new IsStarredByPredicate(args,
args.userFactory.create(args.db, id)));
}
return Predicate.or(p);
}
@@ -478,7 +476,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
p.add(new IsWatchedByPredicate(args, currentUser, false));
} else {
p.add(new IsWatchedByPredicate(args,
args.userFactory.create(args.dbProvider, id), true));
args.userFactory.create(args.db, id), true));
}
}
return Predicate.or(p);
@@ -490,7 +488,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
Set<Account.Id> m = parseAccount(who);
List<HasDraftByPredicate> p = Lists.newArrayListWithCapacity(m.size());
for (Account.Id id : m) {
p.add(new HasDraftByPredicate(args.dbProvider, id));
p.add(new HasDraftByPredicate(args, id));
}
return Predicate.or(p);
}
@@ -505,7 +503,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
if (!m.isEmpty()) {
List<Predicate<ChangeData>> p = Lists.newArrayListWithCapacity(m.size());
for (Account.Id id : m) {
return visibleto(args.userFactory.create(args.dbProvider, id));
return visibleto(args.userFactory.create(args.db, id));
}
return Predicate.or(p);
}
@@ -525,7 +523,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
}
public Predicate<ChangeData> visibleto(CurrentUser user) {
return new IsVisibleToPredicate(args.dbProvider, //
return new IsVisibleToPredicate(args.db, //
args.changeControlGenericFactory, //
user);
}
@@ -546,7 +544,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
Set<Account.Id> m = parseAccount(who);
List<OwnerPredicate> p = Lists.newArrayListWithCapacity(m.size());
for (Account.Id id : m) {
p.add(new OwnerPredicate(args.dbProvider, id));
p.add(new OwnerPredicate(id));
}
return Predicate.or(p);
}
@@ -558,7 +556,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
if (g == null) {
throw error("Group " + group + " not found");
}
return new OwnerinPredicate(args.dbProvider, args.userFactory, g.getUUID());
return new OwnerinPredicate(args.db, args.userFactory, g.getUUID());
}
@Operator
@@ -573,7 +571,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
Set<Account.Id> m = parseAccount(who);
List<ReviewerPredicate> p = Lists.newArrayListWithCapacity(m.size());
for (Account.Id id : m) {
p.add(new ReviewerPredicate(args.dbProvider, id));
p.add(new ReviewerPredicate(id));
}
return Predicate.or(p);
}
@@ -585,13 +583,12 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
if (g == null) {
throw error("Group " + group + " not found");
}
return new ReviewerinPredicate(args.dbProvider, args.userFactory, g.getUUID());
return new ReviewerinPredicate(args.db, args.userFactory, g.getUUID());
}
@Operator
public Predicate<ChangeData> tr(String trackingId) {
return new TrackingIdPredicate(args.dbProvider, args.trackingFooters,
args.repoManager, trackingId);
return new TrackingIdPredicate(args.trackingFooters, trackingId);
}
@Operator
@@ -627,13 +624,13 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@Operator
public Predicate<ChangeData> sortkey_after(String sortKey) {
return new SortKeyPredicate.After(
BasicChangeRewrites.schema(args.indexes), args.dbProvider, sortKey);
BasicChangeRewrites.schema(args.indexes), args.db, sortKey);
}
@Operator
public Predicate<ChangeData> sortkey_before(String sortKey) {
return new SortKeyPredicate.Before(
BasicChangeRewrites.schema(args.indexes), args.dbProvider, sortKey);
BasicChangeRewrites.schema(args.indexes), args.db, sortKey);
}
@Operator
@@ -673,7 +670,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
new ArrayList<ProjectPredicate>();
for (Project.NameKey name : args.projectCache.all()) {
if (name.get().toLowerCase().contains(query.toLowerCase())) {
predicate.add(new ProjectPredicate(args.dbProvider, name.get()));
predicate.add(new ProjectPredicate(name.get()));
}
}
@@ -714,12 +711,12 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
private List<Change> parseChange(String value) throws OrmException,
QueryParseException {
if (PAT_LEGACY_ID.matcher(value).matches()) {
return Collections.singletonList(args.dbProvider.get().changes()
return Collections.singletonList(args.db.get().changes()
.get(Change.Id.parse(value)));
} else if (PAT_CHANGE_ID.matcher(value).matches()) {
Change.Key a = new Change.Key(parseChangeId(value));
List<Change> changes =
args.dbProvider.get().changes().byKeyRange(a, a.max()).toList();
args.db.get().changes().byKeyRange(a, a.max()).toList();
if (changes.isEmpty()) {
throw error("Change " + value + " not found");
}

View File

@@ -52,7 +52,7 @@ public final class ChangeStatusPredicate extends IndexPredicate<ChangeData> {
List<Predicate<ChangeData>> r = new ArrayList<Predicate<ChangeData>>(4);
for (final Change.Status e : Change.Status.values()) {
if (e.isOpen()) {
r.add(new ChangeStatusPredicate(dbProvider, e));
r.add(new ChangeStatusPredicate(e));
}
}
return r.size() == 1 ? r.get(0) : or(r);
@@ -62,25 +62,22 @@ public final class ChangeStatusPredicate extends IndexPredicate<ChangeData> {
List<Predicate<ChangeData>> r = new ArrayList<Predicate<ChangeData>>(4);
for (final Change.Status e : Change.Status.values()) {
if (e.isClosed()) {
r.add(new ChangeStatusPredicate(dbProvider, e));
r.add(new ChangeStatusPredicate(e));
}
}
return r.size() == 1 ? r.get(0) : or(r);
}
private final Provider<ReviewDb> dbProvider;
private final Change.Status status;
ChangeStatusPredicate(Provider<ReviewDb> dbProvider, String value) {
ChangeStatusPredicate(String value) {
super(ChangeField.STATUS, value);
this.dbProvider = dbProvider;
status = VALUES.inverse().get(value);
checkArgument(status != null, "invalid change status: %s", value);
}
ChangeStatusPredicate(Provider<ReviewDb> dbProvider, Change.Status status) {
ChangeStatusPredicate(Change.Status status) {
super(ChangeField.STATUS, VALUES.get(status));
this.dbProvider = dbProvider;
this.status = status;
}
@@ -90,7 +87,7 @@ public final class ChangeStatusPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
return change != null && status.equals(change.getStatus());
}

View File

@@ -14,22 +14,21 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class CommentPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> db;
private final Arguments args;
private final ChangeIndex index;
CommentPredicate(Provider<ReviewDb> db, ChangeIndex index, String value) {
CommentPredicate(Arguments args, ChangeIndex index, String value) {
super(ChangeField.COMMENT, value);
this.db = db;
this.args = args;
this.index = index;
}
@@ -37,7 +36,7 @@ class CommentPredicate extends IndexPredicate<ChangeData> {
public boolean match(ChangeData object) throws OrmException {
try {
for (ChangeData cData : index.getSource(
Predicate.and(new LegacyChangeIdPredicate(db, object.getId()), this), 1)
Predicate.and(new LegacyChangeIdPredicate(args, object.getId()), this), 1)
.read()) {
if (cData.getId().equals(object.getId())) {
return true;

View File

@@ -16,30 +16,29 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import org.eclipse.jgit.lib.AbbreviatedObjectId;
import org.eclipse.jgit.lib.ObjectId;
class CommitPredicate extends IndexPredicate<ChangeData> implements
ChangeDataSource {
private final Provider<ReviewDb> dbProvider;
private final Arguments args;
private final AbbreviatedObjectId abbrevId;
CommitPredicate(Provider<ReviewDb> dbProvider, AbbreviatedObjectId id) {
CommitPredicate(Arguments args, AbbreviatedObjectId id) {
super(ChangeField.COMMIT, id.name());
this.dbProvider = dbProvider;
this.args = args;
this.abbrevId = id;
}
@Override
public boolean match(final ChangeData object) throws OrmException {
for (PatchSet p : object.patches(dbProvider)) {
for (PatchSet p : object.patches()) {
if (p.getRevision() != null && p.getRevision().get() != null) {
final ObjectId id = ObjectId.fromString(p.getRevision().get());
if (abbrevId.prefixCompare(id) == 0) {
@@ -54,12 +53,12 @@ class CommitPredicate extends IndexPredicate<ChangeData> implements
public ResultSet<ChangeData> read() throws OrmException {
final RevId id = new RevId(abbrevId.name());
if (id.isComplete()) {
return ChangeDataResultSet.patchSet(//
dbProvider.get().patchSets().byRevision(id));
return ChangeDataResultSet.patchSet(args.changeDataFactory, args.db,
args.db.get().patchSets().byRevision(id));
} else {
return ChangeDataResultSet.patchSet(//
dbProvider.get().patchSets().byRevisionRange(id, id.max()));
return ChangeDataResultSet.patchSet(args.changeDataFactory, args.db,
args.db.get().patchSets().byRevisionRange(id, id.max()));
}
}

View File

@@ -20,14 +20,9 @@ import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MergeException;
import com.google.gerrit.server.git.SubmitStrategy;
import com.google.gerrit.server.git.SubmitStrategyFactory;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectCache;
@@ -35,6 +30,7 @@ import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.query.OperatorPredicate;
import com.google.gerrit.server.query.OrPredicate;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
@@ -55,53 +51,43 @@ import java.util.Set;
class ConflictsPredicate extends OrPredicate<ChangeData> {
private final String value;
ConflictsPredicate(Provider<ReviewDb> db, PatchListCache plc,
SubmitStrategyFactory submitStrategyFactory,
ChangeControl.GenericFactory changeControlFactory,
IdentifiedUser.GenericFactory identifiedUserFactory,
GitRepositoryManager repoManager, ProjectCache projectCache,
ConflictsCache conflictsCache, String value, List<Change> changes)
ConflictsPredicate(Arguments args, String value, List<Change> changes)
throws OrmException {
super(predicates(db, plc, submitStrategyFactory, changeControlFactory,
identifiedUserFactory, repoManager, projectCache, conflictsCache,
value, changes));
super(predicates(args, value, changes));
this.value = value;
}
private static List<Predicate<ChangeData>> predicates(
final Provider<ReviewDb> db, final PatchListCache plc,
final SubmitStrategyFactory submitStrategyFactory,
final ChangeControl.GenericFactory changeControlFactory,
final IdentifiedUser.GenericFactory identifiedUserFactory,
final GitRepositoryManager repoManager, final ProjectCache projectCache,
final ConflictsCache conflictsCache, final String value,
List<Change> changes) throws OrmException {
private static List<Predicate<ChangeData>> predicates(final Arguments args,
String value, List<Change> changes) throws OrmException {
List<Predicate<ChangeData>> changePredicates =
Lists.newArrayListWithCapacity(changes.size());
final Provider<ReviewDb> db = args.db;
for (final Change c : changes) {
final ChangeDataCache changeDataCache = new ChangeDataCache(c, db, projectCache);
List<String> files = new ChangeData(c).currentFilePaths(db, plc);
final ChangeDataCache changeDataCache = new ChangeDataCache(
c, db, args.changeDataFactory, args.projectCache);
List<String> files = args.changeDataFactory.create(db.get(), c)
.currentFilePaths();
List<Predicate<ChangeData>> filePredicates =
Lists.newArrayListWithCapacity(files.size());
for (String file : files) {
filePredicates.add(new EqualsFilePredicate(db, plc, file));
filePredicates.add(new EqualsFilePredicate(file));
}
List<Predicate<ChangeData>> predicatesForOneChange =
Lists.newArrayListWithCapacity(5);
predicatesForOneChange.add(
not(new LegacyChangeIdPredicate(db, c.getId())));
not(new LegacyChangeIdPredicate(args, c.getId())));
predicatesForOneChange.add(
new ProjectPredicate(db, c.getProject().get()));
new ProjectPredicate(c.getProject().get()));
predicatesForOneChange.add(
new RefPredicate(db, c.getDest().get()));
new RefPredicate(c.getDest().get()));
predicatesForOneChange.add(or(filePredicates));
predicatesForOneChange.add(new OperatorPredicate<ChangeData>(
ChangeQueryBuilder.FIELD_CONFLICTS, value) {
@Override
public boolean match(ChangeData object) throws OrmException {
Change otherChange = object.change(db);
Change otherChange = object.change();
if (otherChange == null) {
return false;
}
@@ -113,17 +99,17 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
return false;
}
ObjectId other = ObjectId.fromString(
object.currentPatchSet(db).getRevision().get());
object.currentPatchSet().getRevision().get());
ConflictKey conflictsKey =
new ConflictKey(changeDataCache.getTestAgainst(), other, submitType,
changeDataCache.getProjectState().isUseContentMerge());
Boolean conflicts = conflictsCache.getIfPresent(conflictsKey);
Boolean conflicts = args.conflictsCache.getIfPresent(conflictsKey);
if (conflicts != null) {
return conflicts;
}
try {
Repository repo =
repoManager.openRepository(otherChange.getProject());
args.repoManager.openRepository(otherChange.getProject());
try {
RevWalk rw = new RevWalk(repo) {
@Override
@@ -136,7 +122,7 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
CodeReviewCommit commit =
(CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst());
SubmitStrategy strategy =
submitStrategyFactory.create(submitType,
args.submitStrategyFactory.create(submitType,
db.get(), repo, rw, null, canMergeFlag,
getAlreadyAccepted(repo, rw, commit),
otherChange.getDest());
@@ -144,7 +130,7 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
(CodeReviewCommit) rw.parseCommit(other);
otherCommit.add(canMergeFlag);
conflicts = !strategy.dryRun(commit, otherCommit);
conflictsCache.put(conflictsKey, conflicts);
args.conflictsCache.put(conflictsKey, conflicts);
return conflicts;
} catch (MergeException e) {
throw new IllegalStateException(e);
@@ -169,9 +155,9 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
private SubmitType getSubmitType(Change change, ChangeData cd) throws OrmException {
try {
final SubmitTypeRecord r =
changeControlFactory.controlFor(change,
identifiedUserFactory.create(change.getOwner()))
.getSubmitTypeRecord(db.get(), cd.currentPatchSet(db), cd);
args.changeControlGenericFactory.controlFor(change,
args.userFactory.create(change.getOwner()))
.getSubmitTypeRecord(db.get(), cd.currentPatchSet(), cd);
if (r.status != SubmitTypeRecord.Status.OK) {
return null;
}
@@ -218,15 +204,18 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
private static class ChangeDataCache {
private final Change change;
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final ProjectCache projectCache;
private ObjectId testAgainst;
private ProjectState projectState;
private Set<ObjectId> alreadyAccepted;
ChangeDataCache(Change change, Provider<ReviewDb> db, ProjectCache projectCache) {
ChangeDataCache(Change change, Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory, ProjectCache projectCache) {
this.change = change;
this.db = db;
this.changeDataFactory = changeDataFactory;
this.projectCache = projectCache;
}
@@ -234,7 +223,8 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
throws OrmException {
if (testAgainst == null) {
testAgainst = ObjectId.fromString(
new ChangeData(change).currentPatchSet(db).getRevision().get());
changeDataFactory.create(db.get(), change)
.currentPatchSet().getRevision().get());
}
return testAgainst;
}

View File

@@ -14,31 +14,24 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import java.util.Collections;
import java.util.List;
class EqualsFilePredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> db;
private final PatchListCache cache;
private final String value;
EqualsFilePredicate(Provider<ReviewDb> db, PatchListCache plc, String value) {
EqualsFilePredicate(String value) {
super(ChangeField.FILE, value);
this.db = db;
this.cache = plc;
this.value = value;
}
@Override
public boolean match(ChangeData object) throws OrmException {
List<String> files = object.currentFilePaths(db, cache);
List<String> files = object.currentFilePaths();
if (files != null) {
return Collections.binarySearch(files, value) >= 0;
} else {

View File

@@ -57,7 +57,7 @@ class EqualsLabelPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(ChangeData object) throws OrmException {
Change c = object.change(dbProvider);
Change c = object.change();
if (c == null) {
// The change has disappeared.
//
@@ -71,7 +71,7 @@ class EqualsLabelPredicate extends IndexPredicate<ChangeData> {
}
LabelType labelType = type(project.getLabelTypes(), label);
boolean hasVote = false;
for (PatchSetApproval p : object.currentApprovals(dbProvider)) {
for (PatchSetApproval p : object.currentApprovals()) {
if (labelType.matches(p)) {
hasVote = true;
if (match(c, p.getValue(), p.getAccountId(), labelType)) {

View File

@@ -17,30 +17,29 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.query.OperatorPredicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.ListResultSet;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.ArrayList;
import java.util.HashSet;
class HasDraftByPredicate extends OperatorPredicate<ChangeData> implements
ChangeDataSource {
private final Provider<ReviewDb> db;
private final Arguments args;
private final Account.Id accountId;
HasDraftByPredicate(Provider<ReviewDb> db, Account.Id accountId) {
HasDraftByPredicate(Arguments args, Account.Id accountId) {
super(ChangeQueryBuilder.FIELD_DRAFTBY, accountId.toString());
this.db = db;
this.args = args;
this.accountId = accountId;
}
@Override
public boolean match(final ChangeData object) throws OrmException {
for (PatchLineComment c : object.comments(db)) {
for (PatchLineComment c : object.comments()) {
if (c.getStatus() == PatchLineComment.Status.DRAFT
&& c.getAuthor().equals(accountId)) {
return true;
@@ -52,14 +51,14 @@ class HasDraftByPredicate extends OperatorPredicate<ChangeData> implements
@Override
public ResultSet<ChangeData> read() throws OrmException {
HashSet<Change.Id> ids = new HashSet<Change.Id>();
for (PatchLineComment sc : db.get().patchComments()
for (PatchLineComment sc : args.db.get().patchComments()
.draftByAuthor(accountId)) {
ids.add(sc.getKey().getParentKey().getParentKey().getParentKey());
}
ArrayList<ChangeData> r = new ArrayList<ChangeData>(ids.size());
for (Change.Id id : ids) {
r.add(new ChangeData(id));
r.add(args.changeDataFactory.create(args.db.get(), id));
}
return new ListResultSet<ChangeData>(r);
}

View File

@@ -15,23 +15,18 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class IsMergeablePredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
IsMergeablePredicate(Provider<ReviewDb> dbProvider) {
IsMergeablePredicate() {
super(ChangeField.MERGEABLE, "1");
this.dbProvider = dbProvider;
}
@Override
public boolean match(ChangeData object) throws OrmException {
Change c = object.change(dbProvider);
Change c = object.change();
return c != null && c.isMergeable();
}

View File

@@ -17,29 +17,24 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class IsReviewedPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
IsReviewedPredicate(Provider<ReviewDb> dbProvider) {
IsReviewedPredicate() {
super(ChangeField.REVIEWED, "1");
this.dbProvider = dbProvider;
}
@Override
public boolean match(final ChangeData object) throws OrmException {
Change c = object.change(dbProvider);
Change c = object.change();
if (c == null) {
return false;
}
PatchSet.Id current = c.currentPatchSetId();
for (PatchSetApproval p : object.approvals(dbProvider)) {
for (PatchSetApproval p : object.approvals()) {
if (p.getPatchSetId().equals(current) && p.getValue() != 0) {
return true;
}

View File

@@ -16,14 +16,13 @@ package com.google.gerrit.server.query.change;
import com.google.common.collect.Lists;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.query.OrPredicate;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.List;
import java.util.Set;
@@ -38,21 +37,21 @@ class IsStarredByPredicate extends OrPredicate<ChangeData> implements
}
private static List<Predicate<ChangeData>> predicates(
Provider<ReviewDb> db,
Arguments args,
Set<Change.Id> ids) {
List<Predicate<ChangeData>> r = Lists.newArrayListWithCapacity(ids.size());
for (Change.Id id : ids) {
r.add(new LegacyChangeIdPredicate(db, id));
r.add(new LegacyChangeIdPredicate(args, id));
}
return r;
}
private final Provider<ReviewDb> db;
private final Arguments args;
private final CurrentUser user;
IsStarredByPredicate(Provider<ReviewDb> db, CurrentUser user) {
super(predicates(db, user.getStarredChanges()));
this.db = db;
IsStarredByPredicate(Arguments args, CurrentUser user) {
super(predicates(args, user.getStarredChanges()));
this.args = args;
this.user = user;
}
@@ -63,8 +62,8 @@ class IsStarredByPredicate extends OrPredicate<ChangeData> implements
@Override
public ResultSet<ChangeData> read() throws OrmException {
return ChangeDataResultSet.change( //
db.get().changes().get(user.getStarredChanges()));
return ChangeDataResultSet.change(args.changeDataFactory, args.db,
args.db.get().changes().get(user.getStarredChanges()));
}
@Override

View File

@@ -54,7 +54,7 @@ class IsVisibleToPredicate extends OperatorPredicate<ChangeData> {
return true;
}
try {
Change c = cd.change(db);
Change c = cd.change();
if (c == null) {
return false;
}

View File

@@ -15,24 +15,23 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.ListResultSet;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.Collections;
class LegacyChangeIdPredicate extends IndexPredicate<ChangeData> implements
ChangeDataSource {
private final Provider<ReviewDb> db;
private final Arguments args;
private final Change.Id id;
LegacyChangeIdPredicate(Provider<ReviewDb> db, Change.Id id) {
LegacyChangeIdPredicate(Arguments args, Change.Id id) {
super(ChangeField.LEGACY_ID, ChangeQueryBuilder.FIELD_CHANGE, id.toString());
this.db = db;
this.args = args;
this.id = id;
}
@@ -43,10 +42,10 @@ class LegacyChangeIdPredicate extends IndexPredicate<ChangeData> implements
@Override
public ResultSet<ChangeData> read() throws OrmException {
Change c = db.get().changes().get(id);
Change c = args.db.get().changes().get(id);
if (c != null) {
return new ListResultSet<ChangeData>( //
Collections.singletonList(new ChangeData(c)));
return new ListResultSet<ChangeData>(Collections.singletonList(
args.changeDataFactory.create(args.db.get(), c)));
} else {
return new ListResultSet<ChangeData>(Collections.<ChangeData> emptyList());
}

View File

@@ -14,26 +14,25 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
/**
* Predicate to match changes that contains specified text in commit messages
* body.
*/
class MessagePredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> db;
private final Arguments args;
private final ChangeIndex index;
MessagePredicate(Provider<ReviewDb> db, ChangeIndex index, String value) {
MessagePredicate(Arguments args, ChangeIndex index, String value) {
super(ChangeField.COMMIT_MESSAGE, value);
this.db = db;
this.args = args;
this.index = index;
}
@@ -41,7 +40,7 @@ class MessagePredicate extends IndexPredicate<ChangeData> {
public boolean match(ChangeData object) throws OrmException {
try {
for (ChangeData cData : index.getSource(
Predicate.and(new LegacyChangeIdPredicate(db, object.getId()), this), 1)
Predicate.and(new LegacyChangeIdPredicate(args, object.getId()), this), 1)
.read()) {
if (cData.getId().equals(object.getId())) {
return true;

View File

@@ -16,19 +16,15 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class OwnerPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final Account.Id id;
OwnerPredicate(Provider<ReviewDb> dbProvider, Account.Id id) {
OwnerPredicate(Account.Id id) {
super(ChangeField.OWNER, id.toString());
this.dbProvider = dbProvider;
this.id = id;
}
@@ -38,7 +34,7 @@ class OwnerPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
return change != null && id.equals(change.getOwner());
}

View File

@@ -41,7 +41,7 @@ class OwnerinPredicate extends OperatorPredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
final Change change = object.change(dbProvider);
final Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -50,12 +50,12 @@ class ParentProjectPredicate extends OrPredicate<ChangeData> {
}
List<Predicate<ChangeData>> r = Lists.newArrayList();
r.add(new ProjectPredicate(dbProvider, projectState.getProject().getName()));
r.add(new ProjectPredicate(projectState.getProject().getName()));
ListChildProjects children = listChildProjects.get();
children.setRecursive(true);
for (ProjectInfo p : children.apply(new ProjectResource(
projectState.controlFor(self.get())))) {
r.add(new ProjectPredicate(dbProvider, p.name));
r.add(new ProjectPredicate(p.name));
}
return r;
}

View File

@@ -16,18 +16,13 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class ProjectPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
ProjectPredicate(Provider<ReviewDb> dbProvider, String id) {
ProjectPredicate(String id) {
super(ChangeField.PROJECT, id);
this.dbProvider = dbProvider;
}
Project.NameKey getValueKey() {
@@ -36,7 +31,7 @@ class ProjectPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -27,7 +27,6 @@ import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.data.PatchSetAttribute;
import com.google.gerrit.server.data.QueryStatsAttribute;
import com.google.gerrit.server.events.EventFactory;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.query.Predicate;
@@ -67,7 +66,7 @@ public class QueryProcessor {
@Override
public int compare(ChangeData a, ChangeData b) {
try {
return a.change(db).getSortKey().compareTo(b.change(db).getSortKey());
return a.change().getSortKey().compareTo(b.change().getSortKey());
} catch (OrmException e) {
return 0;
}
@@ -79,7 +78,7 @@ public class QueryProcessor {
@Override
public int compare(ChangeData a, ChangeData b) {
try {
return b.change(db).getSortKey().compareTo(a.change(db).getSortKey());
return b.change().getSortKey().compareTo(a.change().getSortKey());
} catch (OrmException e) {
return 0;
}
@@ -98,7 +97,6 @@ public class QueryProcessor {
private final ChangeQueryBuilder queryBuilder;
private final ChangeQueryRewriter queryRewriter;
private final Provider<ReviewDb> db;
private final GitRepositoryManager repoManager;
private final ChangeControl.GenericFactory changeControlFactory;
private final TrackingFooters trackingFooters;
private final CurrentUser user;
@@ -126,14 +124,12 @@ public class QueryProcessor {
QueryProcessor(EventFactory eventFactory,
ChangeQueryBuilder.Factory queryBuilder, CurrentUser currentUser,
ChangeQueryRewriter queryRewriter, Provider<ReviewDb> db,
GitRepositoryManager repoManager,
TrackingFooters trackingFooters,
ChangeControl.GenericFactory changeControlFactory) {
this.eventFactory = eventFactory;
this.queryBuilder = queryBuilder.create(currentUser);
this.queryRewriter = queryRewriter;
this.db = db;
this.repoManager = repoManager;
this.trackingFooters = trackingFooters;
this.changeControlFactory = changeControlFactory;
this.user = currentUser;
@@ -308,7 +304,7 @@ public class QueryProcessor {
for (ChangeData d : results) {
ChangeControl cc = d.changeControl();
if (cc == null || cc.getCurrentUser() != user) {
cc = changeControlFactory.controlFor(d.change(db), user);
cc = changeControlFactory.controlFor(d.change(), user);
}
LabelTypes labelTypes = cc.getLabelTypes();
@@ -317,7 +313,7 @@ public class QueryProcessor {
if (!trackingFooters.isEmpty()) {
eventFactory.addTrackingIds(c,
trackingFooters.extract(d.commitFooters(repoManager, db)));
trackingFooters.extract(d.commitFooters()));
}
if (includeAllReviewers) {
@@ -333,40 +329,40 @@ public class QueryProcessor {
}
if (includeCommitMessage) {
eventFactory.addCommitMessage(c, d.commitMessage(repoManager, db));
eventFactory.addCommitMessage(c, d.commitMessage());
}
if (includePatchSets) {
if (includeFiles) {
eventFactory.addPatchSets(c, d.patches(db),
includeApprovals ? d.approvalsMap(db).asMap() : null,
includeFiles, d.change(db), labelTypes);
eventFactory.addPatchSets(c, d.patches(),
includeApprovals ? d.approvalsMap().asMap() : null,
includeFiles, d.change(), labelTypes);
} else {
eventFactory.addPatchSets(c, d.patches(db),
includeApprovals ? d.approvalsMap(db).asMap() : null,
eventFactory.addPatchSets(c, d.patches(),
includeApprovals ? d.approvalsMap().asMap() : null,
labelTypes);
}
}
if (includeCurrentPatchSet) {
PatchSet current = d.currentPatchSet(db);
PatchSet current = d.currentPatchSet();
if (current != null) {
c.currentPatchSet = eventFactory.asPatchSetAttribute(current);
eventFactory.addApprovals(c.currentPatchSet,
d.currentApprovals(db), labelTypes);
d.currentApprovals(), labelTypes);
if (includeFiles) {
eventFactory.addPatchSetFileNames(c.currentPatchSet,
d.change(db), d.currentPatchSet(db));
d.change(), d.currentPatchSet());
}
}
}
if (includeComments) {
eventFactory.addComments(c, d.messages(db));
eventFactory.addComments(c, d.messages());
if (includePatchSets) {
for (PatchSetAttribute attribute : c.patchSets) {
eventFactory.addPatchSetComments(attribute, d.comments(db));
eventFactory.addPatchSetComments(attribute, d.comments());
}
}
}

View File

@@ -15,23 +15,18 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class RefPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
RefPredicate(Provider<ReviewDb> dbProvider, String ref) {
RefPredicate(String ref) {
super(ChangeField.REF, ref);
this.dbProvider = dbProvider;
}
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -14,12 +14,9 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import dk.brics.automaton.Automaton;
import dk.brics.automaton.RegExp;
@@ -29,8 +26,6 @@ import java.util.Collections;
import java.util.List;
class RegexFilePredicate extends RegexPredicate<ChangeData> {
private final Provider<ReviewDb> db;
private final PatchListCache cache;
private final RunAutomaton pattern;
private final String prefixBegin;
@@ -38,10 +33,8 @@ class RegexFilePredicate extends RegexPredicate<ChangeData> {
private final int prefixLen;
private final boolean prefixOnly;
RegexFilePredicate(Provider<ReviewDb> db, PatchListCache plc, String re) {
RegexFilePredicate(String re) {
super(ChangeField.FILE, re);
this.db = db;
this.cache = plc;
if (re.startsWith("^")) {
re = re.substring(1);
@@ -69,7 +62,7 @@ class RegexFilePredicate extends RegexPredicate<ChangeData> {
@Override
public boolean match(ChangeData object) throws OrmException {
List<String> files = object.currentFilePaths(db, cache);
List<String> files = object.currentFilePaths();
if (files != null) {
int begin, end;

View File

@@ -16,20 +16,17 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import dk.brics.automaton.RegExp;
import dk.brics.automaton.RunAutomaton;
class RegexProjectPredicate extends RegexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final RunAutomaton pattern;
RegexProjectPredicate(Provider<ReviewDb> dbProvider, String re) {
RegexProjectPredicate(String re) {
super(ChangeField.PROJECT, re);
if (re.startsWith("^")) {
@@ -40,13 +37,12 @@ class RegexProjectPredicate extends RegexPredicate<ChangeData> {
re = re.substring(0, re.length() - 1);
}
this.dbProvider = dbProvider;
this.pattern = new RunAutomaton(new RegExp(re).toAutomaton());
}
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -15,20 +15,17 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import dk.brics.automaton.RegExp;
import dk.brics.automaton.RunAutomaton;
class RegexRefPredicate extends RegexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final RunAutomaton pattern;
RegexRefPredicate(Provider<ReviewDb> dbProvider, String re) {
RegexRefPredicate(String re) {
super(ChangeField.REF, re);
if (re.startsWith("^")) {
@@ -39,13 +36,12 @@ class RegexRefPredicate extends RegexPredicate<ChangeData> {
re = re.substring(0, re.length() - 1);
}
this.dbProvider = dbProvider;
this.pattern = new RunAutomaton(new RegExp(re).toAutomaton());
}
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -15,20 +15,17 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import dk.brics.automaton.RegExp;
import dk.brics.automaton.RunAutomaton;
class RegexTopicPredicate extends RegexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final RunAutomaton pattern;
RegexTopicPredicate(Provider<ReviewDb> dbProvider, String re) {
RegexTopicPredicate(String re) {
super(ChangeField.TOPIC, re);
if (re.startsWith("^")) {
@@ -39,13 +36,12 @@ class RegexTopicPredicate extends RegexPredicate<ChangeData> {
re = re.substring(0, re.length() - 1);
}
this.dbProvider = dbProvider;
this.pattern = new RunAutomaton(new RegExp(re).toAutomaton());
}
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
if (change == null || change.getTopic() == null) {
return false;
}

View File

@@ -75,7 +75,7 @@ public abstract class RevWalkPredicate extends OperatorPredicate<ChangeData> {
@Override
public boolean match(ChangeData object) throws OrmException {
final PatchSet patchSet = object.currentPatchSet(db);
final PatchSet patchSet = object.currentPatchSet();
if (patchSet == null) {
return false;
}
@@ -90,7 +90,7 @@ public abstract class RevWalkPredicate extends OperatorPredicate<ChangeData> {
return false;
}
Change change = object.change(db);
Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -16,19 +16,15 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class ReviewerPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final Account.Id id;
ReviewerPredicate(Provider<ReviewDb> dbProvider, Account.Id id) {
ReviewerPredicate(Account.Id id) {
super(ChangeField.REVIEWER, id.toString());
this.dbProvider = dbProvider;
this.id = id;
}
@@ -38,7 +34,7 @@ class ReviewerPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
for (PatchSetApproval p : object.approvals(dbProvider)) {
for (PatchSetApproval p : object.approvals()) {
if (id.equals(p.getAccountId())) {
return true;
}

View File

@@ -41,7 +41,7 @@ class ReviewerinPredicate extends OperatorPredicate<ChangeData> {
@Override
public boolean match(final ChangeData object) throws OrmException {
for (PatchSetApproval p : object.approvals(dbProvider)) {
for (PatchSetApproval p : object.approvals()) {
final IdentifiedUser reviewer = userFactory.create(dbProvider,
p.getAccountId());
if (reviewer.getEffectiveGroups().contains(uuid)) {

View File

@@ -90,7 +90,7 @@ public abstract class SortKeyPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(ChangeData cd) throws OrmException {
Change change = cd.change(dbProvider);
Change change = cd.change();
return change != null && change.getSortKey().compareTo(getValue()) < 0;
}
@@ -118,7 +118,7 @@ public abstract class SortKeyPredicate extends IndexPredicate<ChangeData> {
@Override
public boolean match(ChangeData cd) throws OrmException {
Change change = cd.change(dbProvider);
Change change = cd.change();
return change != null && change.getSortKey().compareTo(getValue()) > 0;
}

View File

@@ -15,23 +15,18 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class TopicPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
TopicPredicate(Provider<ReviewDb> dbProvider, String topic) {
TopicPredicate(String topic) {
super(ChangeField.TOPIC, topic);
this.dbProvider = dbProvider;
}
@Override
public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider);
Change change = object.change();
if (change == null) {
return false;
}

View File

@@ -15,13 +15,10 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,26 +28,19 @@ import java.io.IOException;
class TrackingIdPredicate extends IndexPredicate<ChangeData> {
private static final Logger log = LoggerFactory.getLogger(TrackingIdPredicate.class);
private final Provider<ReviewDb> db;
private final TrackingFooters trackingFooters;
private final GitRepositoryManager repositoryManager;
TrackingIdPredicate(Provider<ReviewDb> db,
TrackingFooters trackingFooters,
GitRepositoryManager repositoryManager,
String trackingId) {
TrackingIdPredicate(TrackingFooters trackingFooters, String trackingId) {
super(ChangeField.TR, trackingId);
this.db = db;
this.trackingFooters = trackingFooters;
this.repositoryManager = repositoryManager;
}
@Override
public boolean match(ChangeData object) throws OrmException {
Change c = object.change(db);
Change c = object.change();
if (c != null) {
try {
return trackingFooters.extract(object.commitFooters(repositoryManager, db))
return trackingFooters.extract(object.commitFooters())
.values().contains(getValue());
} catch (IOException e) {
log.warn("Cannot extract footers from " + c.getChangeId(), e);

View File

@@ -10,7 +10,6 @@ import com.google.gerrit.reviewdb.server.ReviewDb;
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;
@@ -49,7 +48,7 @@ class PRED__load_commit_labels_1 extends Predicate.P1 {
Iterable<PatchSetApproval> approvals;
if (cd != null) {
approvals = cd.currentApprovals(Providers.of(db));
approvals = cd.currentApprovals();
} else {
approvals = db.patchSetApprovals().byPatchSet(patchSet.getId());
}