Stop passing ReviewDb, etc. to ChangeData methods

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

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

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

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

View File

@@ -28,6 +28,7 @@ import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.gerrit.common.Nullable; import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSetApproval; 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.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.ChangeField; 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.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject; import com.google.inject.assistedinject.AssistedInject;
@@ -147,6 +149,8 @@ public class LuceneChangeIndex implements ChangeIndex {
private final SitePaths sitePaths; private final SitePaths sitePaths;
private final FillArgs fillArgs; private final FillArgs fillArgs;
private final ListeningExecutorService executor; private final ListeningExecutorService executor;
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final File dir; private final File dir;
private final Schema<ChangeData> schema; private final Schema<ChangeData> schema;
private final SubIndex openIndex; private final SubIndex openIndex;
@@ -157,12 +161,16 @@ public class LuceneChangeIndex implements ChangeIndex {
@GerritServerConfig Config cfg, @GerritServerConfig Config cfg,
SitePaths sitePaths, SitePaths sitePaths,
@IndexExecutor ListeningExecutorService executor, @IndexExecutor ListeningExecutorService executor,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
FillArgs fillArgs, FillArgs fillArgs,
@Assisted Schema<ChangeData> schema, @Assisted Schema<ChangeData> schema,
@Assisted @Nullable String base) throws IOException { @Assisted @Nullable String base) throws IOException {
this.sitePaths = sitePaths; this.sitePaths = sitePaths;
this.fillArgs = fillArgs; this.fillArgs = fillArgs;
this.executor = executor; this.executor = executor;
this.db = db;
this.changeDataFactory = changeDataFactory;
this.schema = schema; this.schema = schema;
if (base == null) { if (base == null) {
@@ -301,10 +309,10 @@ public class LuceneChangeIndex implements ChangeIndex {
} }
} }
private static class QuerySource implements ChangeDataSource { private static final ImmutableSet<String> FIELDS =
private static final ImmutableSet<String> FIELDS = ImmutableSet.of(ID_FIELD, CHANGE_FIELD, APPROVAL_FIELD);
ImmutableSet.of(ID_FIELD, CHANGE_FIELD, APPROVAL_FIELD);
private class QuerySource implements ChangeDataSource {
private final List<SubIndex> indexes; private final List<SubIndex> indexes;
private final Query query; private final Query query;
private final int limit; 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); BytesRef cb = doc.getBinaryValue(CHANGE_FIELD);
if (cb == null) { if (cb == null) {
int id = doc.getField(ID_FIELD).numericValue().intValue(); 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( Change change = ChangeProtoField.CODEC.decode(
cb.bytes, cb.offset, cb.length); cb.bytes, cb.offset, cb.length);
ChangeData cd = new ChangeData(change); ChangeData cd = changeDataFactory.create(db.get(), change);
BytesRef[] approvalsBytes = doc.getBinaryValues(APPROVAL_FIELD); BytesRef[] approvalsBytes = doc.getBinaryValues(APPROVAL_FIELD);
if (approvalsBytes != null) { 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.reviewdb.server.ReviewDb;
import com.google.gerrit.server.cache.CacheRemovalListener; import com.google.gerrit.server.cache.CacheRemovalListener;
import com.google.gerrit.server.cache.h2.DefaultCacheFactory; 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.config.GerritServerConfig;
import com.google.gerrit.server.index.ChangeBatchIndexer; import com.google.gerrit.server.index.ChangeBatchIndexer;
import com.google.gerrit.server.index.ChangeIndex; 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.IndexCollection;
import com.google.gerrit.server.index.IndexModule; import com.google.gerrit.server.index.IndexModule;
import com.google.gerrit.server.patch.PatchListCacheImpl; 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.DataSourceProvider;
import com.google.gerrit.server.schema.DataSourceType; import com.google.gerrit.server.schema.DataSourceType;
import com.google.gerrit.solr.SolrIndexModule; import com.google.gerrit.solr.SolrIndexModule;
@@ -143,7 +145,7 @@ public class Reindex extends SiteProgram {
} }
modules.add(changeIndexModule); modules.add(changeIndexModule);
modules.add(new ReviewDbModule()); modules.add(new ReviewDbModule());
modules.add(new AbstractModule() { modules.add(new FactoryModule() {
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@Override @Override
protected void configure() { protected void configure() {
@@ -152,6 +154,7 @@ public class Reindex extends SiteProgram {
bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {}) bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
.toInstance(DynamicSet.<CacheRemovalListener> emptySet()); .toInstance(DynamicSet.<CacheRemovalListener> emptySet());
install(new DefaultCacheFactory.Module()); install(new DefaultCacheFactory.Module());
factory(ChangeData.Factory.class);
} }
}); });
return dbInjector.createChildInjector(modules); 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;
import com.google.gerrit.reviewdb.client.Project.NameKey; import com.google.gerrit.reviewdb.client.Project.NameKey;
import com.google.gerrit.reviewdb.server.ReviewDb; 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.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.config.TrackingFooter; 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.PatchListCache;
import com.google.gerrit.server.patch.PatchListKey; import com.google.gerrit.server.patch.PatchListKey;
import com.google.gerrit.server.patch.PatchListNotAvailableException; 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.OrmException;
import com.google.gwtorm.server.SchemaFactory; import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Guice; import com.google.inject.Guice;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Injector; import com.google.inject.Injector;
@@ -97,10 +98,11 @@ class InitIndex implements InitStep {
index.close(); index.close();
} }
private class MockIndexSupportModule extends AbstractModule { private class MockIndexSupportModule extends FactoryModule {
@Override @Override
protected void configure() { protected void configure() {
bind(SitePaths.class).toInstance(site); bind(SitePaths.class).toInstance(site);
factory(ChangeData.Factory.class);
} }
@Provides @GerritServerConfig Config getConfig() { @Provides @GerritServerConfig Config getConfig() {

View File

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

View File

@@ -103,7 +103,7 @@ public class DeleteReviewer implements RestModifyView<ReviewerResource, Input> {
} finally { } finally {
db.rollback(); db.rollback();
} }
indexer.index(rsrc.getChange()); indexer.index(db, rsrc.getChange());
return Response.none(); 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.annotations.RequiresCapability;
import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView; 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.change.Index.Input;
import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.index.ChangeIndexer;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider;
import java.io.IOException; import java.io.IOException;
@@ -29,16 +31,19 @@ public class Index implements RestModifyView<ChangeResource, Input> {
public static class Input { public static class Input {
} }
private final Provider<ReviewDb> db;
private final ChangeIndexer indexer; private final ChangeIndexer indexer;
@Inject @Inject
Index(ChangeIndexer indexer) { Index(Provider<ReviewDb> db,
ChangeIndexer indexer) {
this.db = db;
this.indexer = indexer; this.indexer = indexer;
} }
@Override @Override
public Response<?> apply(ChangeResource rsrc, Input input) throws IOException { public Response<?> apply(ChangeResource rsrc, Input input) throws IOException {
indexer.index(rsrc.getChange()); indexer.index(db.get(), rsrc.getChange());
return Response.none(); return Response.none();
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -40,14 +40,18 @@ import java.util.List;
public class TestSubmitType implements RestModifyView<RevisionResource, Input> { public class TestSubmitType implements RestModifyView<RevisionResource, Input> {
private final ReviewDb db; private final ReviewDb db;
private final ChangeData.Factory changeDataFactory;
private final RulesCache rules; private final RulesCache rules;
@Option(name = "--filters", usage = "impact of filters in parent projects") @Option(name = "--filters", usage = "impact of filters in parent projects")
private Filters filters = Filters.RUN; private Filters filters = Filters.RUN;
@Inject @Inject
TestSubmitType(ReviewDb db, RulesCache rules) { TestSubmitType(ReviewDb db,
ChangeData.Factory changeDataFactory,
RulesCache rules) {
this.db = db; this.db = db;
this.changeDataFactory = changeDataFactory;
this.rules = rules; this.rules = rules;
} }
@@ -68,7 +72,7 @@ public class TestSubmitType implements RestModifyView<RevisionResource, Input> {
rsrc.getControl().getProjectControl(), rsrc.getControl().getProjectControl(),
rsrc.getControl(), rsrc.getControl(),
rsrc.getChange(), rsrc.getChange(),
new ChangeData(rsrc.getChange()), changeDataFactory.create(db, rsrc.getChange()),
false, false,
"locate_submit_type", "get_submit_type", "locate_submit_type", "get_submit_type",
"locate_submit_type_filter", "filter_submit_type_results", "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.ProjectNode;
import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.project.SectionSortCache; 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.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.ConflictsCacheImpl; import com.google.gerrit.server.query.change.ConflictsCacheImpl;
import com.google.gerrit.server.ssh.SshAddressesModule; import com.google.gerrit.server.ssh.SshAddressesModule;
@@ -173,6 +174,7 @@ public class GerritGlobalModule extends FactoryModule {
factory(AccountInfoCacheFactory.Factory.class); factory(AccountInfoCacheFactory.Factory.class);
factory(AddReviewerSender.Factory.class); factory(AddReviewerSender.Factory.class);
factory(CapabilityControl.Factory.class); factory(CapabilityControl.Factory.class);
factory(ChangeData.Factory.class);
factory(ChangeQueryBuilder.Factory.class); factory(ChangeQueryBuilder.Factory.class);
factory(CommitMessageEditedSender.Factory.class); factory(CommitMessageEditedSender.Factory.class);
factory(CreateChangeSender.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.SubmitLabelAttribute;
import com.google.gerrit.server.data.SubmitRecordAttribute; import com.google.gerrit.server.data.SubmitRecordAttribute;
import com.google.gerrit.server.data.TrackingIdAttribute; 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.PatchList;
import com.google.gerrit.server.patch.PatchListCache; import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.patch.PatchListEntry; import com.google.gerrit.server.patch.PatchListEntry;
@@ -82,7 +81,7 @@ public class EventFactory {
private final PatchSetInfoFactory psInfoFactory; private final PatchSetInfoFactory psInfoFactory;
private final PersonIdent myIdent; private final PersonIdent myIdent;
private final Provider<ReviewDb> db; private final Provider<ReviewDb> db;
private final GitRepositoryManager repoManager; private final ChangeData.Factory changeDataFactory;
private final ApprovalsUtil approvalsUtil; private final ApprovalsUtil approvalsUtil;
@Inject @Inject
@@ -91,7 +90,8 @@ public class EventFactory {
PatchSetInfoFactory psif, PatchSetInfoFactory psif,
PatchListCache patchListCache, SchemaFactory<ReviewDb> schema, PatchListCache patchListCache, SchemaFactory<ReviewDb> schema,
@GerritPersonIdent PersonIdent myIdent, @GerritPersonIdent PersonIdent myIdent,
Provider<ReviewDb> db, GitRepositoryManager repoManager, Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
ApprovalsUtil approvalsUtil) { ApprovalsUtil approvalsUtil) {
this.accountCache = accountCache; this.accountCache = accountCache;
this.urlProvider = urlProvider; this.urlProvider = urlProvider;
@@ -100,7 +100,7 @@ public class EventFactory {
this.psInfoFactory = psif; this.psInfoFactory = psif;
this.myIdent = myIdent; this.myIdent = myIdent;
this.db = db; this.db = db;
this.repoManager = repoManager; this.changeDataFactory = changeDataFactory;
this.approvalsUtil = approvalsUtil; this.approvalsUtil = approvalsUtil;
} }
@@ -120,7 +120,8 @@ public class EventFactory {
a.number = change.getId().toString(); a.number = change.getId().toString();
a.subject = change.getSubject(); a.subject = change.getSubject();
try { try {
a.commitMessage = new ChangeData(change).commitMessage(repoManager, db); a.commitMessage =
changeDataFactory.create(db.get(), change).commitMessage();
} catch (Exception e) { } catch (Exception e) {
log.error("Error while getting full commit message for" log.error("Error while getting full commit message for"
+ " change " + a.number); + " change " + a.number);

View File

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

View File

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

View File

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

View File

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

View File

@@ -77,16 +77,19 @@ public class ChangeIndexer {
private final IndexCollection indexes; private final IndexCollection indexes;
private final ChangeIndex index; private final ChangeIndex index;
private final SchemaFactory<ReviewDb> schemaFactory; private final SchemaFactory<ReviewDb> schemaFactory;
private final ChangeData.Factory changeDataFactory;
private final ThreadLocalRequestContext context; private final ThreadLocalRequestContext context;
private final ListeningExecutorService executor; private final ListeningExecutorService executor;
@AssistedInject @AssistedInject
ChangeIndexer(@IndexExecutor ListeningExecutorService executor, ChangeIndexer(@IndexExecutor ListeningExecutorService executor,
SchemaFactory<ReviewDb> schemaFactory, SchemaFactory<ReviewDb> schemaFactory,
ChangeData.Factory changeDataFactory,
ThreadLocalRequestContext context, ThreadLocalRequestContext context,
@Assisted ChangeIndex index) { @Assisted ChangeIndex index) {
this.executor = executor; this.executor = executor;
this.schemaFactory = schemaFactory; this.schemaFactory = schemaFactory;
this.changeDataFactory = changeDataFactory;
this.context = context; this.context = context;
this.index = index; this.index = index;
this.indexes = null; this.indexes = null;
@@ -95,10 +98,12 @@ public class ChangeIndexer {
@AssistedInject @AssistedInject
ChangeIndexer(@IndexExecutor ListeningExecutorService executor, ChangeIndexer(@IndexExecutor ListeningExecutorService executor,
SchemaFactory<ReviewDb> schemaFactory, SchemaFactory<ReviewDb> schemaFactory,
ChangeData.Factory changeDataFactory,
ThreadLocalRequestContext context, ThreadLocalRequestContext context,
@Assisted IndexCollection indexes) { @Assisted IndexCollection indexes) {
this.executor = executor; this.executor = executor;
this.schemaFactory = schemaFactory; this.schemaFactory = schemaFactory;
this.changeDataFactory = changeDataFactory;
this.context = context; this.context = context;
this.index = null; this.index = null;
this.indexes = indexes; this.indexes = indexes;
@@ -112,19 +117,10 @@ public class ChangeIndexer {
*/ */
public CheckedFuture<?, IOException> indexAsync(Change change) { public CheckedFuture<?, IOException> indexAsync(Change change) {
return executor != null return executor != null
? submit(new Task(new ChangeData(change), false)) ? submit(new Task(change, false))
: Futures.<Object, IOException> immediateCheckedFuture(null); : 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. * Synchronously index a change.
* *
@@ -136,6 +132,16 @@ public class ChangeIndexer {
} }
} }
/**
* Synchronously index a change.
*
* @param change change to index.
* @param db review database.
*/
public void index(ReviewDb db, Change change) throws IOException {
index(changeDataFactory.create(db, change));
}
/** /**
* Start deleting a change. * Start deleting a change.
* *
@@ -144,19 +150,10 @@ public class ChangeIndexer {
*/ */
public CheckedFuture<?, IOException> deleteAsync(Change change) { public CheckedFuture<?, IOException> deleteAsync(Change change) {
return executor != null return executor != null
? submit(new Task(new ChangeData(change), true)) ? submit(new Task(change, true))
: Futures.<Object, IOException> immediateCheckedFuture(null); : 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. * Synchronously delete a change.
* *
@@ -168,6 +165,16 @@ public class ChangeIndexer {
} }
} }
/**
* Synchronously delete a change.
*
* @param change change to delete.
* @param db review database.
*/
public void delete(ReviewDb db, Change change) throws IOException {
delete(changeDataFactory.create(db, change));
}
private Collection<ChangeIndex> getWriteIndexes() { private Collection<ChangeIndex> getWriteIndexes() {
return indexes != null return indexes != null
? indexes.getWriteIndexes() ? indexes.getWriteIndexes()
@@ -179,11 +186,11 @@ public class ChangeIndexer {
} }
private class Task implements Callable<Void> { private class Task implements Callable<Void> {
private final ChangeData cd; private final Change change;
private final boolean delete; private final boolean delete;
private Task(ChangeData cd, boolean delete) { private Task(Change change, boolean delete) {
this.cd = cd; this.change = change;
this.delete = delete; this.delete = delete;
} }
@@ -192,7 +199,7 @@ public class ChangeIndexer {
try { try {
final AtomicReference<Provider<ReviewDb>> dbRef = final AtomicReference<Provider<ReviewDb>> dbRef =
Atomics.newReference(); Atomics.newReference();
RequestContext oldCtx = context.setContext(new RequestContext() { RequestContext newCtx = new RequestContext() {
@Override @Override
public Provider<ReviewDb> getReviewDbProvider() { public Provider<ReviewDb> getReviewDbProvider() {
Provider<ReviewDb> db = dbRef.get(); Provider<ReviewDb> db = dbRef.get();
@@ -214,8 +221,11 @@ public class ChangeIndexer {
public CurrentUser getCurrentUser() { public CurrentUser getCurrentUser() {
throw new OutOfScopeException("No user during ChangeIndexer"); throw new OutOfScopeException("No user during ChangeIndexer");
} }
}); };
RequestContext oldCtx = context.setContext(newCtx);
try { try {
ChangeData cd = changeDataFactory.create(
newCtx.getReviewDbProvider().get(), change);
if (delete) { if (delete) {
for (ChangeIndex i : getWriteIndexes()) { for (ChangeIndex i : getWriteIndexes()) {
i.delete(cd); i.delete(cd);
@@ -236,14 +246,14 @@ public class ChangeIndexer {
} catch (Exception e) { } catch (Exception e) {
log.error(String.format( log.error(String.format(
"Failed to index change %d in %s", "Failed to index change %d in %s",
cd.getId().get(), cd.getChange().getProject().get()), e); change.getId().get(), change.getProject().get()), e);
throw e; throw e;
} }
} }
@Override @Override
public String toString() { 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; 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.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.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider;
/** /**
* Definition of a field stored in the secondary index. * 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. */ /** Arguments needed to fill in missing data in the input object. */
public static class FillArgs { public static class FillArgs {
final Provider<ReviewDb> db;
final GitRepositoryManager repoManager;
final TrackingFooters trackingFooters; final TrackingFooters trackingFooters;
final PatchListCache patchListCache;
@Inject @Inject
FillArgs(Provider<ReviewDb> db, FillArgs(TrackingFooters trackingFooters) {
GitRepositoryManager repoManager,
TrackingFooters trackingFooters,
PatchListCache patchListCache) {
this.db = db;
this.repoManager = repoManager;
this.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); Predicate<ChangeData> out = rewriteImpl(in, index, limit);
if (in == out || out instanceof IndexPredicate) { 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 */) { } else if (out == null /* cannot rewrite */) {
return in; return in;
} else { } else {
@@ -222,7 +222,7 @@ public class IndexRewriteImpl implements ChangeQueryRewriter {
if (isIndexed.cardinality() == 1) { if (isIndexed.cardinality() == 1) {
int i = isIndexed.nextSetBit(0); int i = isIndexed.nextSetBit(0);
newChildren.add( newChildren.add(
0, new IndexedChangeQuery(db, index, newChildren.remove(i), limit)); 0, new IndexedChangeQuery(index, newChildren.remove(i), limit));
return copy(in, newChildren); return copy(in, newChildren);
} }
@@ -242,7 +242,7 @@ public class IndexRewriteImpl implements ChangeQueryRewriter {
all.add(c); 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); 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.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; 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.Predicate;
import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData; 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.gerrit.server.query.change.SortKeyPredicate;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; 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 ChangeIndex index;
private final int limit; private final int limit;
private Predicate<ChangeData> pred; private Predicate<ChangeData> pred;
private ChangeDataSource source; private ChangeDataSource source;
public IndexedChangeQuery(Provider<ReviewDb> db, ChangeIndex index, public IndexedChangeQuery(ChangeIndex index, Predicate<ChangeData> pred,
Predicate<ChangeData> pred, int limit) throws QueryParseException { int limit) throws QueryParseException {
this.db = db;
this.index = index; this.index = index;
this.limit = limit; this.limit = limit;
this.pred = pred; this.pred = pred;
@@ -168,7 +164,7 @@ public class IndexedChangeQuery extends Predicate<ChangeData>
@Override @Override
public ResultSet<ChangeData> restart(ChangeData last) throws OrmException { public ResultSet<ChangeData> restart(ChangeData last) throws OrmException {
pred = replaceSortKeyPredicates(pred, last.change(db).getSortKey()); pred = replaceSortKeyPredicates(pred, last.change().getSortKey());
try { try {
source = index.getSource(pred, limit); source = index.getSource(pred, limit);
} catch (QueryParseException e) { } catch (QueryParseException e) {

View File

@@ -71,7 +71,7 @@ public abstract class ChangeEmail extends NotificationEmail {
protected ChangeEmail(EmailArguments ea, Change c, String mc) { protected ChangeEmail(EmailArguments ea, Change c, String mc) {
super(ea, mc, c.getProject(), c.getDest()); super(ea, mc, c.getProject(), c.getDest());
change = c; change = c;
changeData = new ChangeData(change); changeData = ea.changeDataFactory.create(ea.db.get(), change);
emailOnlyAuthors = false; 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.PatchListCache;
import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.project.ProjectCache; 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.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.ssh.SshAdvertisedAddresses; import com.google.gerrit.server.ssh.SshAdvertisedAddresses;
import com.google.inject.Inject; import com.google.inject.Inject;
@@ -61,6 +62,7 @@ class EmailArguments {
final ChangeQueryBuilder.Factory queryBuilder; final ChangeQueryBuilder.Factory queryBuilder;
final Provider<ReviewDb> db; final Provider<ReviewDb> db;
final ChangeData.Factory changeDataFactory;
final RuntimeInstance velocityRuntime; final RuntimeInstance velocityRuntime;
final EmailSettings settings; final EmailSettings settings;
@@ -80,6 +82,7 @@ class EmailArguments {
AllProjectsName allProjectsName, AllProjectsName allProjectsName,
ChangeQueryBuilder.Factory queryBuilder, ChangeQueryBuilder.Factory queryBuilder,
Provider<ReviewDb> db, Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
RuntimeInstance velocityRuntime, RuntimeInstance velocityRuntime,
EmailSettings settings, EmailSettings settings,
@SshAdvertisedAddresses List<String> sshAddresses) { @SshAdvertisedAddresses List<String> sshAddresses) {
@@ -101,6 +104,7 @@ class EmailArguments {
this.allProjectsName = allProjectsName; this.allProjectsName = allProjectsName;
this.queryBuilder = queryBuilder; this.queryBuilder = queryBuilder;
this.db = db; this.db = db;
this.changeDataFactory = changeDataFactory;
this.velocityRuntime = velocityRuntime; this.velocityRuntime = velocityRuntime;
this.settings = settings; this.settings = settings;
this.sshAddresses = sshAddresses; 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.gwtorm.server.OrmException;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.util.Providers;
import com.googlecode.prolog_cafe.lang.IntegerTerm; import com.googlecode.prolog_cafe.lang.IntegerTerm;
import com.googlecode.prolog_cafe.lang.ListTerm; import com.googlecode.prolog_cafe.lang.ListTerm;
@@ -329,7 +328,7 @@ public class ChangeControl {
throws OrmException { throws OrmException {
if (getCurrentUser().isIdentifiedUser()) { if (getCurrentUser().isIdentifiedUser()) {
Collection<Account.Id> results = cd != null Collection<Account.Id> results = cd != null
? cd.reviewers(Providers.of(db)).values() ? cd.reviewers().values()
: approvalsUtil.getReviewers(db, change.getId()).values(); : approvalsUtil.getReviewers(db, change.getId()).values();
IdentifiedUser user = (IdentifiedUser) getCurrentUser(); IdentifiedUser user = (IdentifiedUser) getCurrentUser();
return results.contains(user.getAccountId()); 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 static java.util.concurrent.TimeUnit.SECONDS;
import com.google.gerrit.reviewdb.client.Change; 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.config.ConfigUtil;
import com.google.gerrit.server.index.ChangeField; import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.TimestampRangePredicate; import com.google.gerrit.server.index.TimestampRangePredicate;
import com.google.gerrit.server.util.TimeUtil; import com.google.gerrit.server.util.TimeUtil;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import java.sql.Timestamp; import java.sql.Timestamp;
public class AgePredicate extends TimestampRangePredicate<ChangeData> { public class AgePredicate extends TimestampRangePredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final long cut; private final long cut;
AgePredicate(Provider<ReviewDb> dbProvider, String value) { AgePredicate(String value) {
super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_AGE, value); super(ChangeField.UPDATED, ChangeQueryBuilder.FIELD_AGE, value);
this.dbProvider = dbProvider;
long s = ConfigUtil.getTimeUnit(getValue(), 0, SECONDS); long s = ConfigUtil.getTimeUnit(getValue(), 0, SECONDS);
long ms = MILLISECONDS.convert(s, SECONDS); long ms = MILLISECONDS.convert(s, SECONDS);
@@ -55,7 +51,7 @@ public class AgePredicate extends TimestampRangePredicate<ChangeData> {
@Override @Override
public boolean match(final ChangeData object) throws OrmException { public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider); Change change = object.change();
return change != null && change.getLastUpdatedOn().getTime() <= cut; return change != null && change.getLastUpdatedOn().getTime() <= cut;
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,22 +14,21 @@
package com.google.gerrit.server.query.change; 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.ChangeField;
import com.google.gerrit.server.index.ChangeIndex; import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException; 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.gwtorm.server.OrmException;
import com.google.inject.Provider;
class CommentPredicate extends IndexPredicate<ChangeData> { class CommentPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> db; private final Arguments args;
private final ChangeIndex index; private final ChangeIndex index;
CommentPredicate(Provider<ReviewDb> db, ChangeIndex index, String value) { CommentPredicate(Arguments args, ChangeIndex index, String value) {
super(ChangeField.COMMENT, value); super(ChangeField.COMMENT, value);
this.db = db; this.args = args;
this.index = index; this.index = index;
} }
@@ -37,7 +36,7 @@ class CommentPredicate extends IndexPredicate<ChangeData> {
public boolean match(ChangeData object) throws OrmException { public boolean match(ChangeData object) throws OrmException {
try { try {
for (ChangeData cData : index.getSource( for (ChangeData cData : index.getSource(
Predicate.and(new LegacyChangeIdPredicate(db, object.getId()), this), 1) Predicate.and(new LegacyChangeIdPredicate(args, object.getId()), this), 1)
.read()) { .read()) {
if (cData.getId().equals(object.getId())) { if (cData.getId().equals(object.getId())) {
return true; 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.PatchSet;
import com.google.gerrit.reviewdb.client.RevId; 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.ChangeField;
import com.google.gerrit.server.index.IndexPredicate; 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.OrmException;
import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.AbbreviatedObjectId;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
class CommitPredicate extends IndexPredicate<ChangeData> implements class CommitPredicate extends IndexPredicate<ChangeData> implements
ChangeDataSource { ChangeDataSource {
private final Provider<ReviewDb> dbProvider; private final Arguments args;
private final AbbreviatedObjectId abbrevId; private final AbbreviatedObjectId abbrevId;
CommitPredicate(Provider<ReviewDb> dbProvider, AbbreviatedObjectId id) { CommitPredicate(Arguments args, AbbreviatedObjectId id) {
super(ChangeField.COMMIT, id.name()); super(ChangeField.COMMIT, id.name());
this.dbProvider = dbProvider; this.args = args;
this.abbrevId = id; this.abbrevId = id;
} }
@Override @Override
public boolean match(final ChangeData object) throws OrmException { 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) { if (p.getRevision() != null && p.getRevision().get() != null) {
final ObjectId id = ObjectId.fromString(p.getRevision().get()); final ObjectId id = ObjectId.fromString(p.getRevision().get());
if (abbrevId.prefixCompare(id) == 0) { if (abbrevId.prefixCompare(id) == 0) {
@@ -54,12 +53,12 @@ class CommitPredicate extends IndexPredicate<ChangeData> implements
public ResultSet<ChangeData> read() throws OrmException { public ResultSet<ChangeData> read() throws OrmException {
final RevId id = new RevId(abbrevId.name()); final RevId id = new RevId(abbrevId.name());
if (id.isComplete()) { if (id.isComplete()) {
return ChangeDataResultSet.patchSet(// return ChangeDataResultSet.patchSet(args.changeDataFactory, args.db,
dbProvider.get().patchSets().byRevision(id)); args.db.get().patchSets().byRevision(id));
} else { } else {
return ChangeDataResultSet.patchSet(// return ChangeDataResultSet.patchSet(args.changeDataFactory, args.db,
dbProvider.get().patchSets().byRevisionRange(id, id.max())); 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.Change;
import com.google.gerrit.reviewdb.client.Project.SubmitType; import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.server.ReviewDb; 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.CodeReviewCommit;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MergeException; import com.google.gerrit.server.git.MergeException;
import com.google.gerrit.server.git.SubmitStrategy; 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.NoSuchChangeException;
import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectCache; 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.OperatorPredicate;
import com.google.gerrit.server.query.OrPredicate; import com.google.gerrit.server.query.OrPredicate;
import com.google.gerrit.server.query.Predicate; 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.OrmException;
import com.google.inject.Provider; import com.google.inject.Provider;
@@ -55,53 +51,43 @@ import java.util.Set;
class ConflictsPredicate extends OrPredicate<ChangeData> { class ConflictsPredicate extends OrPredicate<ChangeData> {
private final String value; private final String value;
ConflictsPredicate(Provider<ReviewDb> db, PatchListCache plc, ConflictsPredicate(Arguments args, String value, List<Change> changes)
SubmitStrategyFactory submitStrategyFactory,
ChangeControl.GenericFactory changeControlFactory,
IdentifiedUser.GenericFactory identifiedUserFactory,
GitRepositoryManager repoManager, ProjectCache projectCache,
ConflictsCache conflictsCache, String value, List<Change> changes)
throws OrmException { throws OrmException {
super(predicates(db, plc, submitStrategyFactory, changeControlFactory, super(predicates(args, value, changes));
identifiedUserFactory, repoManager, projectCache, conflictsCache,
value, changes));
this.value = value; this.value = value;
} }
private static List<Predicate<ChangeData>> predicates( private static List<Predicate<ChangeData>> predicates(final Arguments args,
final Provider<ReviewDb> db, final PatchListCache plc, String value, List<Change> changes) throws OrmException {
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 {
List<Predicate<ChangeData>> changePredicates = List<Predicate<ChangeData>> changePredicates =
Lists.newArrayListWithCapacity(changes.size()); Lists.newArrayListWithCapacity(changes.size());
final Provider<ReviewDb> db = args.db;
for (final Change c : changes) { for (final Change c : changes) {
final ChangeDataCache changeDataCache = new ChangeDataCache(c, db, projectCache); final ChangeDataCache changeDataCache = new ChangeDataCache(
List<String> files = new ChangeData(c).currentFilePaths(db, plc); c, db, args.changeDataFactory, args.projectCache);
List<String> files = args.changeDataFactory.create(db.get(), c)
.currentFilePaths();
List<Predicate<ChangeData>> filePredicates = List<Predicate<ChangeData>> filePredicates =
Lists.newArrayListWithCapacity(files.size()); Lists.newArrayListWithCapacity(files.size());
for (String file : files) { for (String file : files) {
filePredicates.add(new EqualsFilePredicate(db, plc, file)); filePredicates.add(new EqualsFilePredicate(file));
} }
List<Predicate<ChangeData>> predicatesForOneChange = List<Predicate<ChangeData>> predicatesForOneChange =
Lists.newArrayListWithCapacity(5); Lists.newArrayListWithCapacity(5);
predicatesForOneChange.add( predicatesForOneChange.add(
not(new LegacyChangeIdPredicate(db, c.getId()))); not(new LegacyChangeIdPredicate(args, c.getId())));
predicatesForOneChange.add( predicatesForOneChange.add(
new ProjectPredicate(db, c.getProject().get())); new ProjectPredicate(c.getProject().get()));
predicatesForOneChange.add( predicatesForOneChange.add(
new RefPredicate(db, c.getDest().get())); new RefPredicate(c.getDest().get()));
predicatesForOneChange.add(or(filePredicates)); predicatesForOneChange.add(or(filePredicates));
predicatesForOneChange.add(new OperatorPredicate<ChangeData>( predicatesForOneChange.add(new OperatorPredicate<ChangeData>(
ChangeQueryBuilder.FIELD_CONFLICTS, value) { ChangeQueryBuilder.FIELD_CONFLICTS, value) {
@Override @Override
public boolean match(ChangeData object) throws OrmException { public boolean match(ChangeData object) throws OrmException {
Change otherChange = object.change(db); Change otherChange = object.change();
if (otherChange == null) { if (otherChange == null) {
return false; return false;
} }
@@ -113,17 +99,17 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
return false; return false;
} }
ObjectId other = ObjectId.fromString( ObjectId other = ObjectId.fromString(
object.currentPatchSet(db).getRevision().get()); object.currentPatchSet().getRevision().get());
ConflictKey conflictsKey = ConflictKey conflictsKey =
new ConflictKey(changeDataCache.getTestAgainst(), other, submitType, new ConflictKey(changeDataCache.getTestAgainst(), other, submitType,
changeDataCache.getProjectState().isUseContentMerge()); changeDataCache.getProjectState().isUseContentMerge());
Boolean conflicts = conflictsCache.getIfPresent(conflictsKey); Boolean conflicts = args.conflictsCache.getIfPresent(conflictsKey);
if (conflicts != null) { if (conflicts != null) {
return conflicts; return conflicts;
} }
try { try {
Repository repo = Repository repo =
repoManager.openRepository(otherChange.getProject()); args.repoManager.openRepository(otherChange.getProject());
try { try {
RevWalk rw = new RevWalk(repo) { RevWalk rw = new RevWalk(repo) {
@Override @Override
@@ -136,7 +122,7 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
CodeReviewCommit commit = CodeReviewCommit commit =
(CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst()); (CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst());
SubmitStrategy strategy = SubmitStrategy strategy =
submitStrategyFactory.create(submitType, args.submitStrategyFactory.create(submitType,
db.get(), repo, rw, null, canMergeFlag, db.get(), repo, rw, null, canMergeFlag,
getAlreadyAccepted(repo, rw, commit), getAlreadyAccepted(repo, rw, commit),
otherChange.getDest()); otherChange.getDest());
@@ -144,7 +130,7 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
(CodeReviewCommit) rw.parseCommit(other); (CodeReviewCommit) rw.parseCommit(other);
otherCommit.add(canMergeFlag); otherCommit.add(canMergeFlag);
conflicts = !strategy.dryRun(commit, otherCommit); conflicts = !strategy.dryRun(commit, otherCommit);
conflictsCache.put(conflictsKey, conflicts); args.conflictsCache.put(conflictsKey, conflicts);
return conflicts; return conflicts;
} catch (MergeException e) { } catch (MergeException e) {
throw new IllegalStateException(e); throw new IllegalStateException(e);
@@ -169,9 +155,9 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
private SubmitType getSubmitType(Change change, ChangeData cd) throws OrmException { private SubmitType getSubmitType(Change change, ChangeData cd) throws OrmException {
try { try {
final SubmitTypeRecord r = final SubmitTypeRecord r =
changeControlFactory.controlFor(change, args.changeControlGenericFactory.controlFor(change,
identifiedUserFactory.create(change.getOwner())) args.userFactory.create(change.getOwner()))
.getSubmitTypeRecord(db.get(), cd.currentPatchSet(db), cd); .getSubmitTypeRecord(db.get(), cd.currentPatchSet(), cd);
if (r.status != SubmitTypeRecord.Status.OK) { if (r.status != SubmitTypeRecord.Status.OK) {
return null; return null;
} }
@@ -218,15 +204,18 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
private static class ChangeDataCache { private static class ChangeDataCache {
private final Change change; private final Change change;
private final Provider<ReviewDb> db; private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final ProjectCache projectCache; private final ProjectCache projectCache;
private ObjectId testAgainst; private ObjectId testAgainst;
private ProjectState projectState; private ProjectState projectState;
private Set<ObjectId> alreadyAccepted; 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.change = change;
this.db = db; this.db = db;
this.changeDataFactory = changeDataFactory;
this.projectCache = projectCache; this.projectCache = projectCache;
} }
@@ -234,7 +223,8 @@ class ConflictsPredicate extends OrPredicate<ChangeData> {
throws OrmException { throws OrmException {
if (testAgainst == null) { if (testAgainst == null) {
testAgainst = ObjectId.fromString( testAgainst = ObjectId.fromString(
new ChangeData(change).currentPatchSet(db).getRevision().get()); changeDataFactory.create(db.get(), change)
.currentPatchSet().getRevision().get());
} }
return testAgainst; return testAgainst;
} }

View File

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

View File

@@ -57,7 +57,7 @@ class EqualsLabelPredicate extends IndexPredicate<ChangeData> {
@Override @Override
public boolean match(ChangeData object) throws OrmException { public boolean match(ChangeData object) throws OrmException {
Change c = object.change(dbProvider); Change c = object.change();
if (c == null) { if (c == null) {
// The change has disappeared. // The change has disappeared.
// //
@@ -71,7 +71,7 @@ class EqualsLabelPredicate extends IndexPredicate<ChangeData> {
} }
LabelType labelType = type(project.getLabelTypes(), label); LabelType labelType = type(project.getLabelTypes(), label);
boolean hasVote = false; boolean hasVote = false;
for (PatchSetApproval p : object.currentApprovals(dbProvider)) { for (PatchSetApproval p : object.currentApprovals()) {
if (labelType.matches(p)) { if (labelType.matches(p)) {
hasVote = true; hasVote = true;
if (match(c, p.getValue(), p.getAccountId(), labelType)) { 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.Account;
import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchLineComment; 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.OperatorPredicate;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.ListResultSet; import com.google.gwtorm.server.ListResultSet;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
class HasDraftByPredicate extends OperatorPredicate<ChangeData> implements class HasDraftByPredicate extends OperatorPredicate<ChangeData> implements
ChangeDataSource { ChangeDataSource {
private final Provider<ReviewDb> db; private final Arguments args;
private final Account.Id accountId; private final Account.Id accountId;
HasDraftByPredicate(Provider<ReviewDb> db, Account.Id accountId) { HasDraftByPredicate(Arguments args, Account.Id accountId) {
super(ChangeQueryBuilder.FIELD_DRAFTBY, accountId.toString()); super(ChangeQueryBuilder.FIELD_DRAFTBY, accountId.toString());
this.db = db; this.args = args;
this.accountId = accountId; this.accountId = accountId;
} }
@Override @Override
public boolean match(final ChangeData object) throws OrmException { 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 if (c.getStatus() == PatchLineComment.Status.DRAFT
&& c.getAuthor().equals(accountId)) { && c.getAuthor().equals(accountId)) {
return true; return true;
@@ -52,14 +51,14 @@ class HasDraftByPredicate extends OperatorPredicate<ChangeData> implements
@Override @Override
public ResultSet<ChangeData> read() throws OrmException { public ResultSet<ChangeData> read() throws OrmException {
HashSet<Change.Id> ids = new HashSet<Change.Id>(); HashSet<Change.Id> ids = new HashSet<Change.Id>();
for (PatchLineComment sc : db.get().patchComments() for (PatchLineComment sc : args.db.get().patchComments()
.draftByAuthor(accountId)) { .draftByAuthor(accountId)) {
ids.add(sc.getKey().getParentKey().getParentKey().getParentKey()); ids.add(sc.getKey().getParentKey().getParentKey().getParentKey());
} }
ArrayList<ChangeData> r = new ArrayList<ChangeData>(ids.size()); ArrayList<ChangeData> r = new ArrayList<ChangeData>(ids.size());
for (Change.Id id : ids) { for (Change.Id id : ids) {
r.add(new ChangeData(id)); r.add(args.changeDataFactory.create(args.db.get(), id));
} }
return new ListResultSet<ChangeData>(r); return new ListResultSet<ChangeData>(r);
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -50,12 +50,12 @@ class ParentProjectPredicate extends OrPredicate<ChangeData> {
} }
List<Predicate<ChangeData>> r = Lists.newArrayList(); 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(); ListChildProjects children = listChildProjects.get();
children.setRecursive(true); children.setRecursive(true);
for (ProjectInfo p : children.apply(new ProjectResource( for (ProjectInfo p : children.apply(new ProjectResource(
projectState.controlFor(self.get())))) { projectState.controlFor(self.get())))) {
r.add(new ProjectPredicate(dbProvider, p.name)); r.add(new ProjectPredicate(p.name));
} }
return r; 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.Change;
import com.google.gerrit.reviewdb.client.Project; 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.ChangeField;
import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class ProjectPredicate extends IndexPredicate<ChangeData> { class ProjectPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider; ProjectPredicate(String id) {
ProjectPredicate(Provider<ReviewDb> dbProvider, String id) {
super(ChangeField.PROJECT, id); super(ChangeField.PROJECT, id);
this.dbProvider = dbProvider;
} }
Project.NameKey getValueKey() { Project.NameKey getValueKey() {
@@ -36,7 +31,7 @@ class ProjectPredicate extends IndexPredicate<ChangeData> {
@Override @Override
public boolean match(final ChangeData object) throws OrmException { public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider); Change change = object.change();
if (change == null) { if (change == null) {
return false; 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.PatchSetAttribute;
import com.google.gerrit.server.data.QueryStatsAttribute; import com.google.gerrit.server.data.QueryStatsAttribute;
import com.google.gerrit.server.events.EventFactory; 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.ChangeControl;
import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.Predicate;
@@ -67,7 +66,7 @@ public class QueryProcessor {
@Override @Override
public int compare(ChangeData a, ChangeData b) { public int compare(ChangeData a, ChangeData b) {
try { try {
return a.change(db).getSortKey().compareTo(b.change(db).getSortKey()); return a.change().getSortKey().compareTo(b.change().getSortKey());
} catch (OrmException e) { } catch (OrmException e) {
return 0; return 0;
} }
@@ -79,7 +78,7 @@ public class QueryProcessor {
@Override @Override
public int compare(ChangeData a, ChangeData b) { public int compare(ChangeData a, ChangeData b) {
try { try {
return b.change(db).getSortKey().compareTo(a.change(db).getSortKey()); return b.change().getSortKey().compareTo(a.change().getSortKey());
} catch (OrmException e) { } catch (OrmException e) {
return 0; return 0;
} }
@@ -98,7 +97,6 @@ public class QueryProcessor {
private final ChangeQueryBuilder queryBuilder; private final ChangeQueryBuilder queryBuilder;
private final ChangeQueryRewriter queryRewriter; private final ChangeQueryRewriter queryRewriter;
private final Provider<ReviewDb> db; private final Provider<ReviewDb> db;
private final GitRepositoryManager repoManager;
private final ChangeControl.GenericFactory changeControlFactory; private final ChangeControl.GenericFactory changeControlFactory;
private final TrackingFooters trackingFooters; private final TrackingFooters trackingFooters;
private final CurrentUser user; private final CurrentUser user;
@@ -126,14 +124,12 @@ public class QueryProcessor {
QueryProcessor(EventFactory eventFactory, QueryProcessor(EventFactory eventFactory,
ChangeQueryBuilder.Factory queryBuilder, CurrentUser currentUser, ChangeQueryBuilder.Factory queryBuilder, CurrentUser currentUser,
ChangeQueryRewriter queryRewriter, Provider<ReviewDb> db, ChangeQueryRewriter queryRewriter, Provider<ReviewDb> db,
GitRepositoryManager repoManager,
TrackingFooters trackingFooters, TrackingFooters trackingFooters,
ChangeControl.GenericFactory changeControlFactory) { ChangeControl.GenericFactory changeControlFactory) {
this.eventFactory = eventFactory; this.eventFactory = eventFactory;
this.queryBuilder = queryBuilder.create(currentUser); this.queryBuilder = queryBuilder.create(currentUser);
this.queryRewriter = queryRewriter; this.queryRewriter = queryRewriter;
this.db = db; this.db = db;
this.repoManager = repoManager;
this.trackingFooters = trackingFooters; this.trackingFooters = trackingFooters;
this.changeControlFactory = changeControlFactory; this.changeControlFactory = changeControlFactory;
this.user = currentUser; this.user = currentUser;
@@ -308,7 +304,7 @@ public class QueryProcessor {
for (ChangeData d : results) { for (ChangeData d : results) {
ChangeControl cc = d.changeControl(); ChangeControl cc = d.changeControl();
if (cc == null || cc.getCurrentUser() != user) { if (cc == null || cc.getCurrentUser() != user) {
cc = changeControlFactory.controlFor(d.change(db), user); cc = changeControlFactory.controlFor(d.change(), user);
} }
LabelTypes labelTypes = cc.getLabelTypes(); LabelTypes labelTypes = cc.getLabelTypes();
@@ -317,7 +313,7 @@ public class QueryProcessor {
if (!trackingFooters.isEmpty()) { if (!trackingFooters.isEmpty()) {
eventFactory.addTrackingIds(c, eventFactory.addTrackingIds(c,
trackingFooters.extract(d.commitFooters(repoManager, db))); trackingFooters.extract(d.commitFooters()));
} }
if (includeAllReviewers) { if (includeAllReviewers) {
@@ -333,40 +329,40 @@ public class QueryProcessor {
} }
if (includeCommitMessage) { if (includeCommitMessage) {
eventFactory.addCommitMessage(c, d.commitMessage(repoManager, db)); eventFactory.addCommitMessage(c, d.commitMessage());
} }
if (includePatchSets) { if (includePatchSets) {
if (includeFiles) { if (includeFiles) {
eventFactory.addPatchSets(c, d.patches(db), eventFactory.addPatchSets(c, d.patches(),
includeApprovals ? d.approvalsMap(db).asMap() : null, includeApprovals ? d.approvalsMap().asMap() : null,
includeFiles, d.change(db), labelTypes); includeFiles, d.change(), labelTypes);
} else { } else {
eventFactory.addPatchSets(c, d.patches(db), eventFactory.addPatchSets(c, d.patches(),
includeApprovals ? d.approvalsMap(db).asMap() : null, includeApprovals ? d.approvalsMap().asMap() : null,
labelTypes); labelTypes);
} }
} }
if (includeCurrentPatchSet) { if (includeCurrentPatchSet) {
PatchSet current = d.currentPatchSet(db); PatchSet current = d.currentPatchSet();
if (current != null) { if (current != null) {
c.currentPatchSet = eventFactory.asPatchSetAttribute(current); c.currentPatchSet = eventFactory.asPatchSetAttribute(current);
eventFactory.addApprovals(c.currentPatchSet, eventFactory.addApprovals(c.currentPatchSet,
d.currentApprovals(db), labelTypes); d.currentApprovals(), labelTypes);
if (includeFiles) { if (includeFiles) {
eventFactory.addPatchSetFileNames(c.currentPatchSet, eventFactory.addPatchSetFileNames(c.currentPatchSet,
d.change(db), d.currentPatchSet(db)); d.change(), d.currentPatchSet());
} }
} }
} }
if (includeComments) { if (includeComments) {
eventFactory.addComments(c, d.messages(db)); eventFactory.addComments(c, d.messages());
if (includePatchSets) { if (includePatchSets) {
for (PatchSetAttribute attribute : c.patchSets) { 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; package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.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.ChangeField;
import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class RefPredicate extends IndexPredicate<ChangeData> { class RefPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider; RefPredicate(String ref) {
RefPredicate(Provider<ReviewDb> dbProvider, String ref) {
super(ChangeField.REF, ref); super(ChangeField.REF, ref);
this.dbProvider = dbProvider;
} }
@Override @Override
public boolean match(final ChangeData object) throws OrmException { public boolean match(final ChangeData object) throws OrmException {
Change change = object.change(dbProvider); Change change = object.change();
if (change == null) { if (change == null) {
return false; return false;
} }

View File

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

View File

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

View File

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

View File

@@ -75,7 +75,7 @@ public abstract class RevWalkPredicate extends OperatorPredicate<ChangeData> {
@Override @Override
public boolean match(ChangeData object) throws OrmException { public boolean match(ChangeData object) throws OrmException {
final PatchSet patchSet = object.currentPatchSet(db); final PatchSet patchSet = object.currentPatchSet();
if (patchSet == null) { if (patchSet == null) {
return false; return false;
} }
@@ -90,7 +90,7 @@ public abstract class RevWalkPredicate extends OperatorPredicate<ChangeData> {
return false; return false;
} }
Change change = object.change(db); Change change = object.change();
if (change == null) { if (change == null) {
return false; 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.Account;
import com.google.gerrit.reviewdb.client.PatchSetApproval; 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.ChangeField;
import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
class ReviewerPredicate extends IndexPredicate<ChangeData> { class ReviewerPredicate extends IndexPredicate<ChangeData> {
private final Provider<ReviewDb> dbProvider;
private final Account.Id id; private final Account.Id id;
ReviewerPredicate(Provider<ReviewDb> dbProvider, Account.Id id) { ReviewerPredicate(Account.Id id) {
super(ChangeField.REVIEWER, id.toString()); super(ChangeField.REVIEWER, id.toString());
this.dbProvider = dbProvider;
this.id = id; this.id = id;
} }
@@ -38,7 +34,7 @@ class ReviewerPredicate extends IndexPredicate<ChangeData> {
@Override @Override
public boolean match(final ChangeData object) throws OrmException { public boolean match(final ChangeData object) throws OrmException {
for (PatchSetApproval p : object.approvals(dbProvider)) { for (PatchSetApproval p : object.approvals()) {
if (id.equals(p.getAccountId())) { if (id.equals(p.getAccountId())) {
return true; return true;
} }

View File

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

View File

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

View File

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

View File

@@ -15,13 +15,10 @@
package com.google.gerrit.server.query.change; package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.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.config.TrackingFooters;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.index.ChangeField; import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.index.IndexPredicate;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.inject.Provider;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -31,26 +28,19 @@ import java.io.IOException;
class TrackingIdPredicate extends IndexPredicate<ChangeData> { class TrackingIdPredicate extends IndexPredicate<ChangeData> {
private static final Logger log = LoggerFactory.getLogger(TrackingIdPredicate.class); private static final Logger log = LoggerFactory.getLogger(TrackingIdPredicate.class);
private final Provider<ReviewDb> db;
private final TrackingFooters trackingFooters; private final TrackingFooters trackingFooters;
private final GitRepositoryManager repositoryManager;
TrackingIdPredicate(Provider<ReviewDb> db, TrackingIdPredicate(TrackingFooters trackingFooters, String trackingId) {
TrackingFooters trackingFooters,
GitRepositoryManager repositoryManager,
String trackingId) {
super(ChangeField.TR, trackingId); super(ChangeField.TR, trackingId);
this.db = db;
this.trackingFooters = trackingFooters; this.trackingFooters = trackingFooters;
this.repositoryManager = repositoryManager;
} }
@Override @Override
public boolean match(ChangeData object) throws OrmException { public boolean match(ChangeData object) throws OrmException {
Change c = object.change(db); Change c = object.change();
if (c != null) { if (c != null) {
try { try {
return trackingFooters.extract(object.commitFooters(repositoryManager, db)) return trackingFooters.extract(object.commitFooters())
.values().contains(getValue()); .values().contains(getValue());
} catch (IOException e) { } catch (IOException e) {
log.warn("Cannot extract footers from " + c.getChangeId(), 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.rules.StoredValues;
import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException; 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.IntegerTerm;
import com.googlecode.prolog_cafe.lang.JavaException; import com.googlecode.prolog_cafe.lang.JavaException;
@@ -49,7 +48,7 @@ class PRED__load_commit_labels_1 extends Predicate.P1 {
Iterable<PatchSetApproval> approvals; Iterable<PatchSetApproval> approvals;
if (cd != null) { if (cd != null) {
approvals = cd.currentApprovals(Providers.of(db)); approvals = cd.currentApprovals();
} else { } else {
approvals = db.patchSetApprovals().byPatchSet(patchSet.getId()); approvals = db.patchSetApprovals().byPatchSet(patchSet.getId());
} }

View File

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

View File

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

View File

@@ -78,12 +78,12 @@ public class RegexFilePredicateTest {
} }
private static RegexFilePredicate predicate(String pattern) { private static RegexFilePredicate predicate(String pattern) {
return new RegexFilePredicate(null, null, pattern); return new RegexFilePredicate(pattern);
} }
private static ChangeData change(String... files) { private static ChangeData change(String... files) {
Arrays.sort(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)); cd.setCurrentFilePaths(Arrays.asList(files));
return cd; 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.extensions.events.LifecycleListener;
import com.google.gerrit.lucene.QueryBuilder; import com.google.gerrit.lucene.QueryBuilder;
import com.google.gerrit.reviewdb.client.Change; 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.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.ChangeField; 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.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.ResultSet;
import com.google.inject.Provider;
import org.apache.lucene.search.Query; import org.apache.lucene.search.Query;
import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery;
@@ -69,6 +71,8 @@ class SolrChangeIndex implements ChangeIndex, LifecycleListener {
public static final String CHANGES_CLOSED = "changes_closed"; public static final String CHANGES_CLOSED = "changes_closed";
private static final String ID_FIELD = ChangeField.LEGACY_ID.getName(); 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 FillArgs fillArgs;
private final SitePaths sitePaths; private final SitePaths sitePaths;
private final IndexCollection indexes; private final IndexCollection indexes;
@@ -78,11 +82,15 @@ class SolrChangeIndex implements ChangeIndex, LifecycleListener {
SolrChangeIndex( SolrChangeIndex(
@GerritServerConfig Config cfg, @GerritServerConfig Config cfg,
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
FillArgs fillArgs, FillArgs fillArgs,
SitePaths sitePaths, SitePaths sitePaths,
IndexCollection indexes, IndexCollection indexes,
Schema<ChangeData> schema, Schema<ChangeData> schema,
String base) throws IOException { String base) throws IOException {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.fillArgs = fillArgs; this.fillArgs = fillArgs;
this.sitePaths = sitePaths; this.sitePaths = sitePaths;
this.indexes = indexes; this.indexes = indexes;
@@ -256,7 +264,8 @@ class SolrChangeIndex implements ChangeIndex, LifecycleListener {
List<ChangeData> result = Lists.newArrayListWithCapacity(docs.size()); List<ChangeData> result = Lists.newArrayListWithCapacity(docs.size());
for (SolrDocument doc : docs) { for (SolrDocument doc : docs) {
Integer v = (Integer) doc.getFieldValue(ID_FIELD); 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); final List<ChangeData> r = Collections.unmodifiableList(result);

View File

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