diff options
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.java | 190 |
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; + } } |