diff options
author | spingel | 2009-06-13 07:06:24 +0000 |
---|---|---|
committer | spingel | 2009-06-13 07:06:24 +0000 |
commit | 1fbda3496447ed471f5e929fab036be0168a403e (patch) | |
tree | 32cf26f87ee2023727bd2d43614dedc8e5a56b9f /org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java | |
parent | 4baf499d7c56f0b535f5a251bbf702000d25257f (diff) | |
download | org.eclipse.mylyn.tasks-1fbda3496447ed471f5e929fab036be0168a403e.tar.gz org.eclipse.mylyn.tasks-1fbda3496447ed471f5e929fab036be0168a403e.tar.xz org.eclipse.mylyn.tasks-1fbda3496447ed471f5e929fab036be0168a403e.zip |
NEW - bug 264930: [performance] Avoid duplicate task updates for non-disjunct queries in scheduled synchronizations
https://bugs.eclipse.org/bugs/show_bug.cgi?id=264930
Diffstat (limited to 'org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java')
-rw-r--r-- | org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java | 50 |
1 files changed, 38 insertions, 12 deletions
diff --git a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java index 65b6e7ca1..fa2e33997 100644 --- a/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java +++ b/org.eclipse.mylyn.trac.core/src/org/eclipse/mylyn/internal/trac/core/TracRepositoryConnector.java @@ -448,28 +448,54 @@ public class TracRepositoryConnector extends AbstractRepositoryConnector { ITracClient client; try { - client = getClientManager().getTracClient(repository); - List<TracTicket> tickets = new ArrayList<TracTicket>(); - client.search(search, tickets, monitor); - Map<String, ITask> taskById = null; + + client = getClientManager().getTracClient(repository); client.updateAttributes(monitor, false); - for (TracTicket ticket : tickets) { - TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, monitor); - taskData.setPartial(true); - if (session != null && !session.isFullSynchronization() && hasRichEditor(repository)) { + + if (session != null && session.isFullSynchronization() && hasRichEditor(repository) + && !session.getTasks().isEmpty()) { + // performance optimization: only fetch task ids, all changed tasks have already been marked stale by preSynchronization() + List<Integer> ticketIds = new ArrayList<Integer>(); + client.searchForTicketIds(search, ticketIds, monitor); + + for (Integer id : ticketIds) { if (taskById == null) { taskById = new HashMap<String, ITask>(); for (ITask task : session.getTasks()) { taskById.put(task.getTaskId(), task); } } - ITask task = taskById.get(ticket.getId() + ""); //$NON-NLS-1$ - if (task != null && hasTaskChanged(repository, task, taskData)) { - session.markStale(task); + TaskData taskData = new TaskData(taskDataHandler.getAttributeMapper(repository), + TracCorePlugin.CONNECTOR_KIND, repository.getRepositoryUrl(), id + ""); //$NON-NLS-1$ + taskData.setPartial(true); + TaskAttribute attribute = TracTaskDataHandler.createAttribute(taskData, TracAttribute.ID); + attribute.setValue(id + ""); //$NON-NLS-1$ + resultCollector.accept(taskData); + } + } else { + List<TracTicket> tickets = new ArrayList<TracTicket>(); + client.search(search, tickets, monitor); + + for (TracTicket ticket : tickets) { + TaskData taskData = taskDataHandler.createTaskDataFromTicket(client, repository, ticket, + monitor); + taskData.setPartial(true); + if (session != null && !session.isFullSynchronization() && hasRichEditor(repository)) { + if (taskById == null) { + taskById = new HashMap<String, ITask>(); + for (ITask task : session.getTasks()) { + taskById.put(task.getTaskId(), task); + } + } + // preSyncronization() only handles full synchronizations + ITask task = taskById.get(ticket.getId() + ""); //$NON-NLS-1$ + if (task != null && hasTaskChanged(repository, task, taskData)) { + session.markStale(task); + } } + resultCollector.accept(taskData); } - resultCollector.accept(taskData); } } catch (OperationCanceledException e) { throw e; |