SubmittedTogether: Reuse ChangeData instances
Teach ChangeJson to format a list of ChangeDatas so we don't have to go ChangeData -> Change.Id -> ChangeData and can reuse some stored fields in the index. Change-Id: I34eb564fe730baa71eeec64c36a593fb493186d8
This commit is contained in:
		| @@ -279,23 +279,13 @@ public class ChangeJson { | ||||
|   public List<List<ChangeInfo>> formatQueryResults(List<QueryResult> in) | ||||
|       throws OrmException { | ||||
|     accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS)); | ||||
|     Iterable<ChangeData> all = FluentIterable.from(in) | ||||
|     ensureLoaded(FluentIterable.from(in) | ||||
|         .transformAndConcat(new Function<QueryResult, List<ChangeData>>() { | ||||
|           @Override | ||||
|           public List<ChangeData> apply(QueryResult in) { | ||||
|             return in.changes(); | ||||
|           } | ||||
|         }); | ||||
|     ChangeData.ensureChangeLoaded(all); | ||||
|     if (has(ALL_REVISIONS)) { | ||||
|       ChangeData.ensureAllPatchSetsLoaded(all); | ||||
|     } else if (has(CURRENT_REVISION) || has(MESSAGES)) { | ||||
|       ChangeData.ensureCurrentPatchSetLoaded(all); | ||||
|     } | ||||
|     if (has(REVIEWED) && userProvider.get().isIdentifiedUser()) { | ||||
|       ChangeData.ensureReviewedByLoadedForOpenChanges(all); | ||||
|     } | ||||
|     ChangeData.ensureCurrentApprovalsLoaded(all); | ||||
|         })); | ||||
|  | ||||
|     List<List<ChangeInfo>> res = Lists.newArrayListWithCapacity(in.size()); | ||||
|     Map<Change.Id, ChangeInfo> out = Maps.newHashMap(); | ||||
| @@ -310,6 +300,31 @@ public class ChangeJson { | ||||
|     return res; | ||||
|   } | ||||
|  | ||||
|   public List<ChangeInfo> formatChangeDatas(Collection<ChangeData> in) | ||||
|       throws OrmException { | ||||
|     accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS)); | ||||
|     ensureLoaded(in); | ||||
|     List<ChangeInfo> out = new ArrayList<>(in.size()); | ||||
|     for (ChangeData cd : in) { | ||||
|       out.add(format(cd)); | ||||
|     } | ||||
|     accountLoader.fill(); | ||||
|     return out; | ||||
|   } | ||||
|  | ||||
|   private void ensureLoaded(Iterable<ChangeData> all) throws OrmException { | ||||
|     ChangeData.ensureChangeLoaded(all); | ||||
|     if (has(ALL_REVISIONS)) { | ||||
|       ChangeData.ensureAllPatchSetsLoaded(all); | ||||
|     } else if (has(CURRENT_REVISION) || has(MESSAGES)) { | ||||
|       ChangeData.ensureCurrentPatchSetLoaded(all); | ||||
|     } | ||||
|     if (has(REVIEWED) && userProvider.get().isIdentifiedUser()) { | ||||
|       ChangeData.ensureReviewedByLoadedForOpenChanges(all); | ||||
|     } | ||||
|     ChangeData.ensureCurrentApprovalsLoaded(all); | ||||
|   } | ||||
|  | ||||
|   private boolean has(ListChangesOption option) { | ||||
|     return options.contains(option); | ||||
|   } | ||||
|   | ||||
| @@ -72,34 +72,34 @@ public class SubmittedTogether implements RestReadView<ChangeResource> { | ||||
|       ResourceConflictException, Exception { | ||||
|     try { | ||||
|       Change c = resource.getChange(); | ||||
|       List<Change.Id> ids; | ||||
|       List<ChangeData> cds; | ||||
|       if (c.getStatus().isOpen()) { | ||||
|         ids = getForOpenChange(c); | ||||
|         cds = getForOpenChange(c); | ||||
|       } else if (c.getStatus().asChangeStatus() == ChangeStatus.MERGED) { | ||||
|         ids = getForMergedChange(c); | ||||
|         cds = getForMergedChange(c); | ||||
|       } else { | ||||
|         ids = getForAbandonedChange(); | ||||
|         cds = getForAbandonedChange(); | ||||
|       } | ||||
|       if (ids.size() <= 1) { | ||||
|         ids = Collections.emptyList(); | ||||
|       if (cds.size() <= 1) { | ||||
|         cds = Collections.emptyList(); | ||||
|       } | ||||
|       return json.create(EnumSet.of( | ||||
|           ListChangesOption.CURRENT_REVISION, | ||||
|           ListChangesOption.CURRENT_COMMIT)) | ||||
|         .format(ids); | ||||
|         .formatChangeDatas(cds); | ||||
|     } catch (OrmException | IOException e) { | ||||
|       log.error("Error on getting a ChangeSet", e); | ||||
|       throw e; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private List<Change.Id> getForOpenChange(Change c) | ||||
|   private List<ChangeData> getForOpenChange(Change c) | ||||
|       throws OrmException, IOException { | ||||
|     ChangeSet cs = mergeSuperSet.completeChangeSet(dbProvider.get(), c); | ||||
|     return cs.ids().asList(); | ||||
|     return cs.changes().asList(); | ||||
|   } | ||||
|  | ||||
|   private List<Change.Id> getForMergedChange(Change c) | ||||
|   private List<ChangeData> getForMergedChange(Change c) | ||||
|       throws OrmException, IOException  { | ||||
|     String subId = c.getSubmissionId(); | ||||
|     List<ChangeData> cds = queryProvider.get().bySubmissionId(subId); | ||||
| @@ -109,14 +109,14 @@ public class SubmittedTogether implements RestReadView<ChangeResource> { | ||||
|       return Collections.emptyList(); | ||||
|     } | ||||
|  | ||||
|     List<Change.Id> ids = new ArrayList<>(cds.size()); | ||||
|     List<ChangeData> sorted = new ArrayList<>(cds.size()); | ||||
|     for (PatchSetData psd : sorter.get().sort(cds)) { | ||||
|       ids.add(psd.data().getId()); | ||||
|       sorted.add(psd.data()); | ||||
|     } | ||||
|     return ids; | ||||
|     return sorted; | ||||
|   } | ||||
|  | ||||
|   private List<Change.Id> getForAbandonedChange() { | ||||
|   private List<ChangeData> getForAbandonedChange() { | ||||
|     return Collections.emptyList(); | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Dave Borowitz
					Dave Borowitz