diff --git a/appdist/src/main/sql/query_index.sql b/appdist/src/main/sql/query_index.sql index 693ee67ea2..0ee1ae113e 100644 --- a/appdist/src/main/sql/query_index.sql +++ b/appdist/src/main/sql/query_index.sql @@ -115,6 +115,9 @@ ON contributor_agreements (active, short_name); -- ********************************************************************* -- PatchLineCommentAccess -- @PrimaryKey covers: published, draft +CREATE INDEX patch_comment_drafts +ON patch_comments (author) +WHERE status = 'd'; -- ********************************************************************* diff --git a/appjar/src/main/java/com/google/gerrit/client/Gerrit.java b/appjar/src/main/java/com/google/gerrit/client/Gerrit.java index 8b958eca54..699e517769 100644 --- a/appjar/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/appjar/src/main/java/com/google/gerrit/client/Gerrit.java @@ -305,6 +305,7 @@ public class Gerrit implements EntryPoint { if (signedIn) { m = new MenuBar(true); addLink(m, C.menuMyChanges(), Link.MINE); + addLink(m, C.menyMyDrafts(), Link.MINE_DRAFTS); addLink(m, C.menuMyUnclaimedChanges(), Link.MINE_UNCLAIMED); addLink(m, C.menuMyStarredChanges(), Link.MINE_STARRED); menuBar.addItem(C.menuMine(), m); diff --git a/appjar/src/main/java/com/google/gerrit/client/GerritConstants.java b/appjar/src/main/java/com/google/gerrit/client/GerritConstants.java index 96bb9ebb44..a02a087b1b 100644 --- a/appjar/src/main/java/com/google/gerrit/client/GerritConstants.java +++ b/appjar/src/main/java/com/google/gerrit/client/GerritConstants.java @@ -37,6 +37,7 @@ public interface GerritConstants extends Constants { String menuMine(); String menuMyChanges(); + String menyMyDrafts(); String menuMyUnclaimedChanges(); String menuMyStarredChanges(); diff --git a/appjar/src/main/java/com/google/gerrit/client/GerritConstants.properties b/appjar/src/main/java/com/google/gerrit/client/GerritConstants.properties index ef6b57c06e..a1cf472a0a 100644 --- a/appjar/src/main/java/com/google/gerrit/client/GerritConstants.properties +++ b/appjar/src/main/java/com/google/gerrit/client/GerritConstants.properties @@ -16,8 +16,9 @@ menuAll = All menuAllUnclaimedChanges = Unclaimed Changes menuAllRecentChanges = Recent Changes -menuMine = Mine -menuMyChanges = My Changes +menuMine = My +menuMyChanges = Changes +menyMyDrafts = Drafts menuMyUnclaimedChanges = Unclaimed Changes menuMyStarredChanges = Starred Changes diff --git a/appjar/src/main/java/com/google/gerrit/client/Link.java b/appjar/src/main/java/com/google/gerrit/client/Link.java index 44533deb22..56f9ce03fc 100644 --- a/appjar/src/main/java/com/google/gerrit/client/Link.java +++ b/appjar/src/main/java/com/google/gerrit/client/Link.java @@ -23,6 +23,7 @@ import com.google.gerrit.client.admin.ProjectAdminScreen; import com.google.gerrit.client.admin.ProjectListScreen; import com.google.gerrit.client.changes.AccountDashboardScreen; import com.google.gerrit.client.changes.ChangeScreen; +import com.google.gerrit.client.changes.MineDraftsScreen; import com.google.gerrit.client.changes.MineStarredScreen; import com.google.gerrit.client.changes.PublishCommentScreen; import com.google.gerrit.client.data.AccountInfo; @@ -51,6 +52,7 @@ public class Link implements HistoryListener { public static final String MINE = "mine"; public static final String MINE_UNCLAIMED = "mine,unclaimed"; public static final String MINE_STARRED = "mine,starred"; + public static final String MINE_DRAFTS = "mine,drafts"; public static final String ALL = "all"; public static final String ALL_OPEN = "all,open"; @@ -129,9 +131,13 @@ public class Link implements HistoryListener { if (MINE.equals(token)) { return new AccountDashboardScreen(Common.getAccountId()); } - - if (MINE_STARRED.equals(token)) { - return new MineStarredScreen(); + if (token.startsWith("mine,")) { + if (MINE_STARRED.equals(token)) { + return new MineStarredScreen(); + } + if (MINE_DRAFTS.equals(token)) { + return new MineDraftsScreen(); + } } if (token.startsWith("patch,")) { diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java index 906be8fad3..4c897cfbb8 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java @@ -25,6 +25,7 @@ public interface ChangeConstants extends Constants { String changesRecentlyClosed(); String starredHeading(); + String draftsHeading(); String changeTableColumnID(); String changeTableColumnSubject(); diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties index 662f01ca37..4056d5ab83 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties @@ -4,6 +4,7 @@ statusLongMerged = Merged statusLongAbandoned = Abandoned starredHeading = Starred Changes +draftsHeading = Changes with unpublished drafts changesRecentlyClosed = Recently closed changes changeTableColumnID = ID diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java index 7addfb3ea1..d43a115cde 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListService.java @@ -15,7 +15,7 @@ package com.google.gerrit.client.changes; import com.google.gerrit.client.data.AccountDashboardInfo; -import com.google.gerrit.client.data.MineStarredInfo; +import com.google.gerrit.client.data.SingleListChangeInfo; import com.google.gerrit.client.reviewdb.Account; import com.google.gerrit.client.reviewdb.Change; import com.google.gerrit.client.rpc.SignInRequired; @@ -31,7 +31,11 @@ public interface ChangeListService extends RemoteJsonService { /** Get the changes starred by the caller. */ @SignInRequired - void myStarredChanges(AsyncCallback callback); + void myStarredChanges(AsyncCallback callback); + + /** Get the changes with unpublished drafts by the caller. */ + @SignInRequired + void myDraftChanges(AsyncCallback callback); /** Get the ids of all changes starred by the caller. */ @SignInRequired diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java index 3ed510d957..558f979663 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeListServiceImpl.java @@ -17,10 +17,11 @@ package com.google.gerrit.client.changes; import com.google.gerrit.client.data.AccountDashboardInfo; import com.google.gerrit.client.data.AccountInfoCacheFactory; import com.google.gerrit.client.data.ChangeInfo; -import com.google.gerrit.client.data.MineStarredInfo; +import com.google.gerrit.client.data.SingleListChangeInfo; import com.google.gerrit.client.reviewdb.Account; import com.google.gerrit.client.reviewdb.Change; import com.google.gerrit.client.reviewdb.ChangeAccess; +import com.google.gerrit.client.reviewdb.PatchLineComment; import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.reviewdb.StarredChange; import com.google.gerrit.client.reviewdb.Change.Id; @@ -73,10 +74,11 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements }); } - public void myStarredChanges(final AsyncCallback callback) { - run(callback, new Action() { - public MineStarredInfo run(final ReviewDb db) throws OrmException, - Failure { + public void myStarredChanges( + final AsyncCallback callback) { + run(callback, new Action() { + public SingleListChangeInfo run(final ReviewDb db) + throws OrmException, Failure { final Account.Id me = Common.getAccountId(); final AccountInfoCacheFactory ac = new AccountInfoCacheFactory(db); final Account user = ac.get(me); @@ -84,10 +86,37 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements throw new Failure(new NoSuchEntityException()); } - final MineStarredInfo d = new MineStarredInfo(me); + final SingleListChangeInfo d = new SingleListChangeInfo(); final Set starred = starredBy(db, me); - d.setStarred(filter(db.changes().get(starred), starred, ac)); - Collections.sort(d.getStarred(), new Comparator() { + d.setChanges(filter(db.changes().get(starred), starred, ac)); + Collections.sort(d.getChanges(), new Comparator() { + public int compare(final ChangeInfo o1, final ChangeInfo o2) { + return o1.getLastUpdatedOn().compareTo(o2.getLastUpdatedOn()); + } + }); + d.setAccounts(ac.create()); + return d; + } + }); + } + + public void myDraftChanges( + final AsyncCallback callback) { + run(callback, new Action() { + public SingleListChangeInfo run(final ReviewDb db) + throws OrmException, Failure { + final Account.Id me = Common.getAccountId(); + final AccountInfoCacheFactory ac = new AccountInfoCacheFactory(db); + final Account user = ac.get(me); + if (user == null) { + throw new Failure(new NoSuchEntityException()); + } + + final SingleListChangeInfo d = new SingleListChangeInfo(); + final Set starred = starredBy(db, me); + final Set drafted = draftedBy(db, me); + d.setChanges(filter(db.changes().get(drafted), starred, ac)); + Collections.sort(d.getChanges(), new Comparator() { public int compare(final ChangeInfo o1, final ChangeInfo o2) { return o1.getLastUpdatedOn().compareTo(o2.getLastUpdatedOn()); } @@ -165,4 +194,17 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements } return existing; } + + private static Set draftedBy(final ReviewDb db, final Account.Id me) + throws OrmException { + final Set existing = new HashSet(); + if (me != null) { + for (final PatchLineComment sc : db.patchComments().draftByAuthor(me)) { + final Change.Id c = + sc.getKey().getParentKey().getParentKey().getParentKey(); + existing.add(c); + } + } + return existing; + } } diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java b/appjar/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java new file mode 100644 index 0000000000..98652f4bd8 --- /dev/null +++ b/appjar/src/main/java/com/google/gerrit/client/changes/MineDraftsScreen.java @@ -0,0 +1,37 @@ +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.client.changes; + +import com.google.gerrit.client.Link; +import com.google.gerrit.client.data.SingleListChangeInfo; +import com.google.gerrit.client.rpc.GerritCallback; + + +public class MineDraftsScreen extends MineSingleListScreen { + public MineDraftsScreen() { + super(Util.C.draftsHeading(), Link.MINE_DRAFTS); + } + + @Override + public void onLoad() { + super.onLoad(); + Util.LIST_SVC + .myDraftChanges(new GerritCallback() { + public void onSuccess(final SingleListChangeInfo result) { + display(result); + } + }); + } +} diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java b/appjar/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java new file mode 100644 index 0000000000..8ec8501b86 --- /dev/null +++ b/appjar/src/main/java/com/google/gerrit/client/changes/MineSingleListScreen.java @@ -0,0 +1,49 @@ +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.client.changes; + +import com.google.gerrit.client.data.SingleListChangeInfo; +import com.google.gerrit.client.ui.AccountScreen; + + +public class MineSingleListScreen extends AccountScreen { + private final String anchor; + private ChangeTable table; + private ChangeTable.Section drafts; + + public MineSingleListScreen(final String title, final String historyToken) { + super(title); + anchor = historyToken; + + table = new ChangeTable(); + drafts = new ChangeTable.Section(); + + table.addSection(drafts); + table.setSavePointerId(anchor); + + add(table); + } + + @Override + public Object getScreenCacheToken() { + return anchor; + } + + protected void display(final SingleListChangeInfo result) { + table.setAccountInfoCache(result.getAccounts()); + drafts.display(result.getChanges()); + table.finishDisplay(true); + } +} diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java b/appjar/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java index 0157542f50..f5ffea3bcd 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/MineStarredScreen.java @@ -15,41 +15,23 @@ package com.google.gerrit.client.changes; import com.google.gerrit.client.Link; -import com.google.gerrit.client.data.MineStarredInfo; +import com.google.gerrit.client.data.SingleListChangeInfo; import com.google.gerrit.client.rpc.GerritCallback; -import com.google.gerrit.client.ui.AccountScreen; -public class MineStarredScreen extends AccountScreen { - private ChangeTable table; - private ChangeTable.Section starred; - +public class MineStarredScreen extends MineSingleListScreen { public MineStarredScreen() { - super(Util.C.starredHeading()); - - table = new ChangeTable(); - starred = new ChangeTable.Section(); - - table.addSection(starred); - table.setSavePointerId(Link.MINE_STARRED); - - add(table); - } - - @Override - public Object getScreenCacheToken() { - return Link.MINE_STARRED; + super(Util.C.starredHeading(), Link.MINE_STARRED); } @Override public void onLoad() { super.onLoad(); - Util.LIST_SVC.myStarredChanges(new GerritCallback() { - public void onSuccess(final MineStarredInfo result) { - table.setAccountInfoCache(result.getAccounts()); - starred.display(result.getStarred()); - table.finishDisplay(true); - } - }); + Util.LIST_SVC + .myStarredChanges(new GerritCallback() { + public void onSuccess(final SingleListChangeInfo result) { + display(result); + } + }); } } diff --git a/appjar/src/main/java/com/google/gerrit/client/data/MineStarredInfo.java b/appjar/src/main/java/com/google/gerrit/client/data/SingleListChangeInfo.java similarity index 60% rename from appjar/src/main/java/com/google/gerrit/client/data/MineStarredInfo.java rename to appjar/src/main/java/com/google/gerrit/client/data/SingleListChangeInfo.java index 82e0999010..6789aefb5b 100644 --- a/appjar/src/main/java/com/google/gerrit/client/data/MineStarredInfo.java +++ b/appjar/src/main/java/com/google/gerrit/client/data/SingleListChangeInfo.java @@ -14,22 +14,14 @@ package com.google.gerrit.client.data; -import com.google.gerrit.client.changes.MineStarredScreen; -import com.google.gerrit.client.reviewdb.Account; - import java.util.List; -/** Summary information needed for {@link MineStarredScreen}. */ -public class MineStarredInfo { +/** Summary information needed for screens showing a single list of changes}. */ +public class SingleListChangeInfo { protected AccountInfoCache accounts; - protected Account.Id owner; - protected List starred; + protected List changes; - protected MineStarredInfo() { - } - - public MineStarredInfo(final Account.Id forUser) { - owner = forUser; + public SingleListChangeInfo() { } public AccountInfoCache getAccounts() { @@ -40,15 +32,11 @@ public class MineStarredInfo { accounts = ac; } - public Account.Id getOwner() { - return owner; + public List getChanges() { + return changes; } - public List getStarred() { - return starred; - } - - public void setStarred(List c) { - starred = c; + public void setChanges(List c) { + changes = c; } } diff --git a/appjar/src/main/java/com/google/gerrit/client/reviewdb/PatchLineCommentAccess.java b/appjar/src/main/java/com/google/gerrit/client/reviewdb/PatchLineCommentAccess.java index b992ed80ba..5b1adeae98 100644 --- a/appjar/src/main/java/com/google/gerrit/client/reviewdb/PatchLineCommentAccess.java +++ b/appjar/src/main/java/com/google/gerrit/client/reviewdb/PatchLineCommentAccess.java @@ -40,4 +40,9 @@ public interface PatchLineCommentAccess extends + "' AND author = ? ORDER BY lineNbr,writtenOn") ResultSet draft(Patch.Key patch, Account.Id author) throws OrmException; + + @Query("WHERE status = '" + PatchLineComment.STATUS_DRAFT + + "' AND author = ?") + ResultSet draftByAuthor(Account.Id author) + throws OrmException; }