summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java190
1 files changed, 153 insertions, 37 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
index d6762db368..506fabc205 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -14,14 +14,20 @@
package com.google.gerrit.server.query.change;
+import com.google.common.base.Function;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
+import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.PatchSet.Id;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.TrackingId;
@@ -43,15 +49,29 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import java.io.IOException;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
public class ChangeData {
+ private static Ordering<PatchSetApproval> SORT_APPROVALS = Ordering.natural()
+ .onResultOf(new Function<PatchSetApproval, Timestamp>() {
+ @Override
+ public Timestamp apply(PatchSetApproval a) {
+ return a.getGranted();
+ }
+ });
+
+ public static List<PatchSetApproval> sortApprovals(
+ Iterable<PatchSetApproval> approvals) {
+ return SORT_APPROVALS.sortedCopy(approvals);
+ }
+
public static void ensureChangeLoaded(
Provider<ReviewDb> db, List<ChangeData> changes) throws OrmException {
Map<Change.Id, ChangeData> missing = Maps.newHashMap();
@@ -79,7 +99,9 @@ public class ChangeData {
for (PatchSet ps : db.get().patchSets().get(missing.keySet())) {
ChangeData cd = missing.get(ps.getId());
cd.currentPatchSet = ps;
- cd.patches = Lists.newArrayList(ps);
+ if (cd.limitedIds == null) {
+ cd.patches = Lists.newArrayList(ps);
+ }
}
}
}
@@ -88,7 +110,7 @@ public class ChangeData {
Provider<ReviewDb> db, List<ChangeData> changes) throws OrmException {
List<ResultSet<PatchSetApproval>> pending = Lists.newArrayList();
for (ChangeData cd : changes) {
- if (cd.currentApprovals == null && cd.approvals == null) {
+ if (cd.currentApprovals == null && cd.limitedApprovals == null) {
pending.add(db.get().patchSetApprovals()
.byPatchSet(cd.change(db).currentPatchSetId()));
}
@@ -96,8 +118,8 @@ public class ChangeData {
if (!pending.isEmpty()) {
int idx = 0;
for (ChangeData cd : changes) {
- if (cd.currentApprovals == null && cd.approvals == null) {
- cd.currentApprovals = pending.get(idx++).toList();
+ if (cd.currentApprovals == null && cd.limitedApprovals == null) {
+ cd.currentApprovals = sortApprovals(pending.get(idx++));
}
}
}
@@ -107,16 +129,18 @@ public class ChangeData {
private Change change;
private String commitMessage;
private PatchSet currentPatchSet;
+ private Set<PatchSet.Id> limitedIds;
private Collection<PatchSet> patches;
- private Collection<PatchSetApproval> approvals;
- private Map<PatchSet.Id,Collection<PatchSetApproval>> approvalsMap;
- private Collection<PatchSetApproval> currentApprovals;
+ private ListMultimap<PatchSet.Id, PatchSetApproval> limitedApprovals;
+ private ListMultimap<PatchSet.Id, PatchSetApproval> allApprovals;
+ private List<PatchSetApproval> currentApprovals;
private String[] currentFiles;
private Collection<PatchLineComment> comments;
private Collection<TrackingId> trackingIds;
private CurrentUser visibleTo;
private ChangeControl changeControl;
private List<ChangeMessage> messages;
+ private List<SubmitRecord> submitRecords;
public ChangeData(final Change.Id id) {
legacyId = id;
@@ -127,6 +151,27 @@ public class ChangeData {
change = c;
}
+ public ChangeData(final ChangeControl c) {
+ legacyId = c.getChange().getId();
+ change = c.getChange();
+ changeControl = c;
+ }
+
+ public void limitToPatchSets(Collection<PatchSet.Id> ids) {
+ limitedIds = Sets.newLinkedHashSetWithExpectedSize(ids.size());
+ for (PatchSet.Id id : ids) {
+ if (!id.getParentKey().equals(legacyId)) {
+ throw new IllegalArgumentException(String.format(
+ "invalid patch set %s for change %s", id, legacyId));
+ }
+ limitedIds.add(id);
+ }
+ }
+
+ public Collection<PatchSet.Id> getLimitedPatchSets() {
+ return limitedIds;
+ }
+
public void setCurrentFilePaths(String[] filePaths) {
currentFiles = filePaths;
}
@@ -163,10 +208,14 @@ public class ChangeData {
case COPIED:
r.add(e.getNewName());
break;
+
case RENAMED:
r.add(e.getOldName());
r.add(e.getNewName());
break;
+
+ case REWRITE:
+ break;
}
}
currentFiles = r.toArray(new String[r.size()]);
@@ -191,7 +240,7 @@ public class ChangeData {
return visibleTo == user;
}
- ChangeControl changeControl() {
+ public ChangeControl changeControl() {
return changeControl;
}
@@ -223,22 +272,20 @@ public class ChangeData {
return currentPatchSet;
}
- public Collection<PatchSetApproval> currentApprovals(Provider<ReviewDb> db)
+ public List<PatchSetApproval> currentApprovals(Provider<ReviewDb> db)
throws OrmException {
if (currentApprovals == null) {
Change c = change(db);
if (c == null) {
currentApprovals = Collections.emptyList();
- } else if (approvals != null) {
- Map<Id, Collection<PatchSetApproval>> map = approvalsMap(db);
- currentApprovals = map.get(c.currentPatchSetId());
- if (currentApprovals == null) {
- currentApprovals = Collections.emptyList();
- map.put(c.currentPatchSetId(), currentApprovals);
- }
+ } else if (allApprovals != null) {
+ return allApprovals.get(c.currentPatchSetId());
+ } else if (limitedApprovals != null &&
+ (limitedIds == null || limitedIds.contains(c.currentPatchSetId()))) {
+ return limitedApprovals.get(c.currentPatchSetId());
} else {
- currentApprovals = db.get().patchSetApprovals()
- .byPatchSet(c.currentPatchSetId()).toList();
+ currentApprovals = sortApprovals(db.get().patchSetApprovals()
+ .byPatchSet(c.currentPatchSetId()));
}
}
return currentApprovals;
@@ -266,37 +313,98 @@ public class ChangeData {
return commitMessage;
}
+ /**
+ * @param db review database.
+ * @return patches for the change. If {@link #limitToPatchSets(Collection)}
+ * was previously called, only contains patches with the specified IDs.
+ * @throws OrmException an error occurred reading the database.
+ */
public Collection<PatchSet> patches(Provider<ReviewDb> db)
throws OrmException {
if (patches == null) {
- patches = db.get().patchSets().byChange(legacyId).toList();
+ if (limitedIds != null) {
+ patches = Lists.newArrayList();
+ for (PatchSet ps : db.get().patchSets().byChange(legacyId)) {
+ if (limitedIds.contains(ps.getId())) {
+ patches.add(ps);
+ }
+ }
+ } else {
+ patches = db.get().patchSets().byChange(legacyId).toList();
+ }
}
return patches;
}
- public Collection<PatchSetApproval> approvals(Provider<ReviewDb> db)
+ /**
+ * @param db review database.
+ * @return patch set approvals for the change in timestamp order. If
+ * {@link #limitToPatchSets(Collection)} was previously called, only contains
+ * approvals for the patches with the specified IDs.
+ * @throws OrmException an error occurred reading the database.
+ */
+ public List<PatchSetApproval> approvals(Provider<ReviewDb> db)
throws OrmException {
- if (approvals == null) {
- approvals = db.get().patchSetApprovals().byChange(legacyId).toList();
+ return ImmutableList.copyOf(approvalsMap(db).values());
+ }
+
+ /**
+ * @param db review database.
+ * @return patch set approvals for the change, keyed by ID, ordered by
+ * timestamp within each patch set. If
+ * {@link #limitToPatchSets(Collection)} was previously called, only
+ * contains approvals for the patches with the specified IDs.
+ * @throws OrmException an error occurred reading the database.
+ */
+ public ListMultimap<PatchSet.Id, PatchSetApproval> approvalsMap(
+ Provider<ReviewDb> db) throws OrmException {
+ if (limitedApprovals == null) {
+ limitedApprovals = ArrayListMultimap.create();
+ if (allApprovals != null) {
+ for (PatchSet.Id id : limitedIds) {
+ limitedApprovals.putAll(id, allApprovals.get(id));
+ }
+ } else {
+ for (PatchSetApproval psa : sortApprovals(
+ db.get().patchSetApprovals().byChange(legacyId))) {
+ if (limitedIds == null || limitedIds.contains(legacyId)) {
+ limitedApprovals.put(psa.getPatchSetId(), psa);
+ }
+ }
+ }
}
- return approvals;
+ return limitedApprovals;
}
- public Map<PatchSet.Id,Collection<PatchSetApproval>> approvalsMap(Provider<ReviewDb> db)
+ /**
+ * @param db review database.
+ * @return all patch set approvals for the change in timestamp order
+ * (regardless of whether {@link #limitToPatchSets(Collection)} was
+ * previously called).
+ * @throws OrmException an error occurred reading the database.
+ */
+ public List<PatchSetApproval> allApprovals(Provider<ReviewDb> db)
throws OrmException {
- if (approvalsMap == null) {
- Collection<PatchSetApproval> all = approvals(db);
- approvalsMap = new HashMap<PatchSet.Id,Collection<PatchSetApproval>>(all.size());
- for (PatchSetApproval psa : all) {
- Collection<PatchSetApproval> c = approvalsMap.get(psa.getPatchSetId());
- if (c == null) {
- c = new ArrayList<PatchSetApproval>();
- approvalsMap.put(psa.getPatchSetId(), c);
- }
- c.add(psa);
+ return ImmutableList.copyOf(allApprovalsMap(db).values());
+ }
+
+ /**
+ * @param db review database.
+ * @return all patch set approvals for the change (regardless of whether
+ * {@link #limitToPatchSets(Collection)} was previously called), keyed by
+ * ID, ordered by timestamp within each patch set.
+ * @throws OrmException an error occurred reading the database.
+ */
+ public ListMultimap<PatchSet.Id, PatchSetApproval> allApprovalsMap(
+ Provider<ReviewDb> db) throws OrmException {
+ if (allApprovals == null) {
+ allApprovals = ArrayListMultimap.create();
+ for (PatchSetApproval psa : sortApprovals(
+ db.get().patchSetApprovals().byChange(legacyId))) {
+ allApprovals.put(psa.getPatchSetId(), psa);
}
}
- return approvalsMap;
+ return allApprovals;
}
public Collection<PatchLineComment> comments(Provider<ReviewDb> db)
@@ -322,4 +430,12 @@ public class ChangeData {
}
return messages;
}
+
+ public void setSubmitRecords(List<SubmitRecord> records) {
+ submitRecords = records;
+ }
+
+ public List<SubmitRecord> getSubmitRecords() {
+ return submitRecords;
+ }
}