Merge changes I52e1eb2a,Ic292cdd6

* changes:
  Stop passing ReviewDb, etc. to ChangeData methods
  ChangeIndexer: Set request contexts more correctly
This commit is contained in:
Shawn Pearce
2013-12-21 03:48:08 +00:00
committed by Gerrit Code Review
67 changed files with 488 additions and 549 deletions

View File

@@ -28,6 +28,7 @@ import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.ChangeField;
@@ -49,6 +50,7 @@ import com.google.gerrit.server.query.change.ChangeDataSource;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
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;
@@ -147,6 +149,8 @@ public class LuceneChangeIndex implements ChangeIndex {
private final SitePaths sitePaths;
private final FillArgs fillArgs;
private final ListeningExecutorService executor;
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final File dir;
private final Schema<ChangeData> schema;
private final SubIndex openIndex;
@@ -157,12 +161,16 @@ public class LuceneChangeIndex implements ChangeIndex {
@GerritServerConfig Config cfg,
SitePaths sitePaths,
@IndexExecutor ListeningExecutorService executor,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
FillArgs fillArgs,
@Assisted Schema<ChangeData> schema,
@Assisted @Nullable String base) throws IOException {
this.sitePaths = sitePaths;
this.fillArgs = fillArgs;
this.executor = executor;
this.db = db;
this.changeDataFactory = changeDataFactory;
this.schema = schema;
if (base == null) {
@@ -301,10 +309,10 @@ public class LuceneChangeIndex implements ChangeIndex {
}
}
private static class QuerySource implements ChangeDataSource {
private static final ImmutableSet<String> FIELDS =
ImmutableSet.of(ID_FIELD, CHANGE_FIELD, APPROVAL_FIELD);
private static final ImmutableSet<String> FIELDS =
ImmutableSet.of(ID_FIELD, CHANGE_FIELD, APPROVAL_FIELD);
private class QuerySource implements ChangeDataSource {
private final List<SubIndex> indexes;
private final Query query;
private final int limit;
@@ -391,16 +399,16 @@ public class LuceneChangeIndex implements ChangeIndex {
}
}
private static ChangeData toChangeData(Document doc) {
private ChangeData toChangeData(Document doc) {
BytesRef cb = doc.getBinaryValue(CHANGE_FIELD);
if (cb == null) {
int id = doc.getField(ID_FIELD).numericValue().intValue();
return new ChangeData(new Change.Id(id));
return changeDataFactory.create(db.get(), new Change.Id(id));
}
Change change = ChangeProtoField.CODEC.decode(
cb.bytes, cb.offset, cb.length);
ChangeData cd = new ChangeData(change);
ChangeData cd = changeDataFactory.create(db.get(), change);
BytesRef[] approvalsBytes = doc.getBinaryValues(APPROVAL_FIELD);
if (approvalsBytes != null) {

View File

@@ -29,6 +29,7 @@ import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.cache.CacheRemovalListener;
import com.google.gerrit.server.cache.h2.DefaultCacheFactory;
import com.google.gerrit.server.config.FactoryModule;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.index.ChangeBatchIndexer;
import com.google.gerrit.server.index.ChangeIndex;
@@ -36,6 +37,7 @@ import com.google.gerrit.server.index.ChangeSchemas;
import com.google.gerrit.server.index.IndexCollection;
import com.google.gerrit.server.index.IndexModule;
import com.google.gerrit.server.patch.PatchListCacheImpl;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.schema.DataSourceProvider;
import com.google.gerrit.server.schema.DataSourceType;
import com.google.gerrit.solr.SolrIndexModule;
@@ -143,7 +145,7 @@ public class Reindex extends SiteProgram {
}
modules.add(changeIndexModule);
modules.add(new ReviewDbModule());
modules.add(new AbstractModule() {
modules.add(new FactoryModule() {
@SuppressWarnings("rawtypes")
@Override
protected void configure() {
@@ -152,6 +154,7 @@ public class Reindex extends SiteProgram {
bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
.toInstance(DynamicSet.<CacheRemovalListener> emptySet());
install(new DefaultCacheFactory.Module());
factory(ChangeData.Factory.class);
}
});
return dbInjector.createChildInjector(modules);

View File

@@ -23,6 +23,7 @@ import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.FactoryModule;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.config.TrackingFooter;
@@ -37,9 +38,9 @@ import com.google.gerrit.server.patch.PatchList;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.patch.PatchListKey;
import com.google.gerrit.server.patch.PatchListNotAvailableException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
@@ -97,10 +98,11 @@ class InitIndex implements InitStep {
index.close();
}
private class MockIndexSupportModule extends AbstractModule {
private class MockIndexSupportModule extends FactoryModule {
@Override
protected void configure() {
bind(SitePaths.class).toInstance(site);
factory(ChangeData.Factory.class);
}
@Provides @GerritServerConfig Config getConfig() {

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

@@ -38,6 +38,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicReference;
@@ -75,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;
@@ -93,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;
@@ -109,45 +116,32 @@ public class ChangeIndexer {
* @return future for the indexing task.
*/
public CheckedFuture<?, IOException> indexAsync(Change change) {
return indexAsync(new ChangeData(change));
}
/**
* Start indexing a change.
*
* @param cd change to index.
* @return future for the indexing task.
*/
public CheckedFuture<?, IOException> indexAsync(ChangeData cd) {
return executor != null
? submit(new Task(cd, 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.
*
* @param cd change to index.
*/
public void index(ChangeData cd) throws IOException {
try {
new Task(cd, false).call();
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw MAPPER.apply(e);
for (ChangeIndex i : getWriteIndexes()) {
i.replace(cd);
}
}
/**
* 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.
*
@@ -155,55 +149,48 @@ public class ChangeIndexer {
* @return future for the deleting task.
*/
public CheckedFuture<?, IOException> deleteAsync(Change change) {
return deleteAsync(new ChangeData(change));
}
/**
* Start deleting a change.
*
* @param cd change to delete.
* @return future for the deleting task.
*/
public CheckedFuture<?, IOException> deleteAsync(ChangeData cd) {
return executor != null
? submit(new Task(cd, 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.
*
* @param cd change to delete.
*/
public void delete(ChangeData cd) throws IOException {
try {
new Task(cd, true).call();
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw MAPPER.apply(e);
for (ChangeIndex i : getWriteIndexes()) {
i.delete(cd);
}
}
/**
* 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()
: Collections.singleton(index);
}
private CheckedFuture<?, IOException> submit(Callable<?> task) {
return Futures.makeChecked(executor.submit(task), MAPPER);
}
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;
}
@@ -212,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();
@@ -234,14 +221,19 @@ public class ChangeIndexer {
public CurrentUser getCurrentUser() {
throw new OutOfScopeException("No user during ChangeIndexer");
}
});
};
RequestContext oldCtx = context.setContext(newCtx);
try {
if (indexes != null) {
for (ChangeIndex i : indexes.getWriteIndexes()) {
apply(i, cd);
ChangeData cd = changeDataFactory.create(
newCtx.getReviewDbProvider().get(), change);
if (delete) {
for (ChangeIndex i : getWriteIndexes()) {
i.delete(cd);
}
} else {
apply(index, cd);
for (ChangeIndex i : getWriteIndexes()) {
i.replace(cd);
}
}
return null;
} finally {
@@ -254,22 +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;
}
}
private void apply(ChangeIndex i, ChangeData cd) throws IOException {
if (delete) {
i.delete(cd);
} else {
i.replace(cd);
}
}
@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());
}

View File

@@ -26,7 +26,8 @@ public class FakeQueryBuilder extends ChangeQueryBuilder {
new FakeQueryBuilder.Definition<ChangeData, FakeQueryBuilder>(
FakeQueryBuilder.class),
new ChangeQueryBuilder.Arguments(null, null, null, null, null, null,
null, null, null, null, null, null, null, indexes, null, null, null),
null, null, null, null, null, null, null, null, indexes, null, null,
null),
null);
}

View File

@@ -216,7 +216,7 @@ public class IndexRewriteTest {
private IndexedChangeQuery query(Predicate<ChangeData> p, int limit)
throws QueryParseException {
return new IndexedChangeQuery(null, index, p, limit);
return new IndexedChangeQuery(index, p, limit);
}
private Set<Change.Status> status(String query) throws QueryParseException {

View File

@@ -78,12 +78,12 @@ public class RegexFilePredicateTest {
}
private static RegexFilePredicate predicate(String pattern) {
return new RegexFilePredicate(null, null, pattern);
return new RegexFilePredicate(pattern);
}
private static ChangeData change(String... files) {
Arrays.sort(files);
ChangeData cd = new ChangeData(new Change.Id(1));
ChangeData cd = new ChangeData(null, null, null, new Change.Id(1));
cd.setCurrentFilePaths(Arrays.asList(files));
return cd;
}

View File

@@ -25,6 +25,7 @@ import com.google.common.collect.Sets;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lucene.QueryBuilder;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.ChangeField;
@@ -42,6 +43,7 @@ import com.google.gerrit.server.query.change.ChangeDataSource;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import org.apache.lucene.search.Query;
import org.apache.solr.client.solrj.SolrQuery;
@@ -69,6 +71,8 @@ class SolrChangeIndex implements ChangeIndex, LifecycleListener {
public static final String CHANGES_CLOSED = "changes_closed";
private static final String ID_FIELD = ChangeField.LEGACY_ID.getName();
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final FillArgs fillArgs;
private final SitePaths sitePaths;
private final IndexCollection indexes;
@@ -78,11 +82,15 @@ class SolrChangeIndex implements ChangeIndex, LifecycleListener {
SolrChangeIndex(
@GerritServerConfig Config cfg,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
FillArgs fillArgs,
SitePaths sitePaths,
IndexCollection indexes,
Schema<ChangeData> schema,
String base) throws IOException {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.fillArgs = fillArgs;
this.sitePaths = sitePaths;
this.indexes = indexes;
@@ -256,7 +264,8 @@ class SolrChangeIndex implements ChangeIndex, LifecycleListener {
List<ChangeData> result = Lists.newArrayListWithCapacity(docs.size());
for (SolrDocument doc : docs) {
Integer v = (Integer) doc.getFieldValue(ID_FIELD);
result.add(new ChangeData(new Change.Id(v.intValue())));
result.add(
changeDataFactory.create(db.get(), new Change.Id(v.intValue())));
}
final List<ChangeData> r = Collections.unmodifiableList(result);

View File

@@ -15,6 +15,7 @@
package com.google.gerrit.solr;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.ChangeIndex;
@@ -22,6 +23,8 @@ import com.google.gerrit.server.index.ChangeSchemas;
import com.google.gerrit.server.index.FieldDef.FillArgs;
import com.google.gerrit.server.index.IndexCollection;
import com.google.gerrit.server.index.IndexModule;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Singleton;
@@ -57,10 +60,12 @@ public class SolrIndexModule extends LifecycleModule {
@Provides
@Singleton
public SolrChangeIndex getChangeIndex(@GerritServerConfig Config cfg,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
SitePaths sitePaths,
IndexCollection indexes,
FillArgs fillArgs) throws IOException {
return new SolrChangeIndex(cfg, fillArgs, sitePaths, indexes,
ChangeSchemas.getLatest(), base);
return new SolrChangeIndex(cfg, db, changeDataFactory, fillArgs, sitePaths,
indexes, ChangeSchemas.getLatest(), base);
}
}