diff options
author | Shawn O. Pearce <sop@google.com> | 2009-01-30 18:43:49 -0800 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-01-30 18:43:49 -0800 |
commit | 1343b7dee0e4fab2f2f74bf0ab26c2869e5080ad (patch) | |
tree | 5426fd5c26d1950e27cba8dcf0747acedba4e7b9 | |
parent | cdc5faebd4c94484d84237dec11344d0caa09e37 (diff) |
Display all open changes for a single project
Change tables now display a hyperlink to view all open changes for
that project, browsing them in the same order that the all open
changes for the entire site would navigate them in.
Bug: GERRIT-32
Signed-off-by: Shawn O. Pearce <sop@google.com>
15 files changed, 177 insertions, 3 deletions
diff --git a/appdist/src/main/sql/query_index.sql b/appdist/src/main/sql/query_index.sql index 1bf5be7366..97cd21d95f 100644 --- a/appdist/src/main/sql/query_index.sql +++ b/appdist/src/main/sql/query_index.sql @@ -116,6 +116,11 @@ CREATE INDEX changes_allOpen ON changes (sort_key) WHERE open = 'Y'; +-- covers: byProjectOpenPrev, byProjectOpenNext +CREATE INDEX changes_byProjectOpen +ON changes (dest_project_name, sort_key) +WHERE open = 'Y'; + -- covers: allClosedPrev, allClosedNext CREATE INDEX changes_allClosed ON changes (status, sort_key) diff --git a/appdist/src/main/sql/upgrade003_004.sql b/appdist/src/main/sql/upgrade003_004.sql index a4ddf07b1a..3c2634fd39 100644 --- a/appdist/src/main/sql/upgrade003_004.sql +++ b/appdist/src/main/sql/upgrade003_004.sql @@ -13,3 +13,7 @@ ALTER TABLE accounts ALTER COLUMN show_site_header SET DEFAULT 'N'; ALTER TABLE accounts ALTER COLUMN show_site_header SET NOT NULL; UPDATE schema_version SET version_nbr = 4; + +CREATE INDEX changes_byProjectOpen +ON changes (dest_project_name, sort_key) +WHERE open = 'Y'; 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 8d9b04b8fa..62031d5602 100644 --- a/appjar/src/main/java/com/google/gerrit/client/Link.java +++ b/appjar/src/main/java/com/google/gerrit/client/Link.java @@ -25,6 +25,7 @@ import com.google.gerrit.client.changes.AccountDashboardScreen; import com.google.gerrit.client.changes.AllAbandonedChangesScreen; import com.google.gerrit.client.changes.AllMergedChangesScreen; import com.google.gerrit.client.changes.AllOpenChangesScreen; +import com.google.gerrit.client.changes.ByProjectOpenChangesScreen; import com.google.gerrit.client.changes.ChangeScreen; import com.google.gerrit.client.changes.MineDraftsScreen; import com.google.gerrit.client.changes.MineStarredScreen; @@ -101,6 +102,10 @@ public class Link implements HistoryListener { return "admin,project," + id.toString(); } + public static String toProjectOpen(final Project.NameKey proj) { + return "project,open," + proj.toString() + ",n,z"; + } + public void onHistoryChanged(final String token) { Screen s; try { @@ -160,6 +165,16 @@ public class Link implements HistoryListener { } } + if (token.startsWith("project,")) { + p = "project,open,"; + if (token.startsWith(p)) { + final String s = skip(p, token); + final int c = s.indexOf(','); + return new ByProjectOpenChangesScreen(Project.NameKey.parse(s + .substring(0, c)), s.substring(c + 1)); + } + } + if (token.startsWith("patch,")) { p = "patch,sidebyside,"; if (token.startsWith(p)) diff --git a/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java b/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java index 8d7af61c53..3c33507ae3 100644 --- a/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java +++ b/appjar/src/main/java/com/google/gerrit/client/account/ProjectWatchPanel.java @@ -18,6 +18,7 @@ import com.google.gerrit.client.reviewdb.AccountProjectWatch; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.ui.FancyFlexTable; import com.google.gerrit.client.ui.ProjectNameSuggestOracle; +import com.google.gerrit.client.ui.ProjectOpenLink; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; @@ -278,7 +279,7 @@ class ProjectWatchPanel extends Composite { void populate(final int row, final AccountProjectWatchInfo k) { table.setWidget(row, 1, new CheckBox()); - table.setText(row, 2, k.getProject().getName()); + table.setWidget(row, 2, new ProjectOpenLink(k.getProject().getNameKey())); { final CheckBox notifyNewChanges = new CheckBox(); notifyNewChanges.addClickListener(new ClickListener() { diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java b/appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java new file mode 100644 index 0000000000..8d67f2da08 --- /dev/null +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java @@ -0,0 +1,51 @@ +// 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.reviewdb.Project; +import com.google.gerrit.client.rpc.GerritCallback; + + +public class ByProjectOpenChangesScreen extends AllSingleListScreen { + private final Project.NameKey projectKey; + + public ByProjectOpenChangesScreen(final Project.NameKey proj, + final String positionToken) { + super(Util.M.changesOpenInProject(proj.get()), "project,open," + + proj.toString(), positionToken); + projectKey = proj; + } + + @Override + protected void loadPrev() { + Util.LIST_SVC.byProjectOpenPrev(projectKey, pos, pageSize, + new GerritCallback<SingleListChangeInfo>() { + public void onSuccess(final SingleListChangeInfo result) { + display(result); + } + }); + } + + @Override + protected void loadNext() { + Util.LIST_SVC.byProjectOpenNext(projectKey, pos, pageSize, + new GerritCallback<SingleListChangeInfo>() { + public void onSuccess(final SingleListChangeInfo result) { + display(result); + } + }); + } +} diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java index b631a23248..f96fbc57aa 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java @@ -21,6 +21,7 @@ import com.google.gerrit.client.reviewdb.Branch; import com.google.gerrit.client.reviewdb.Change; import com.google.gerrit.client.ui.AccountDashboardLink; import com.google.gerrit.client.ui.ChangeLink; +import com.google.gerrit.client.ui.ProjectOpenLink; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; @@ -67,7 +68,7 @@ public class ChangeInfoBlock extends Composite { public void display(final Change chg, final AccountInfoCache acc) { final Branch.NameKey dst = chg.getDest(); table.setWidget(R_OWNER, 1, AccountDashboardLink.link(acc, chg.getOwner())); - table.setText(R_PROJECT, 1, dst.getParentKey().get()); + table.setWidget(R_PROJECT, 1, new ProjectOpenLink(dst.getParentKey())); table.setText(R_BRANCH, 1, dst.getShortName()); table.setText(R_UPLOADED, 1, mediumFormat(chg.getCreatedOn())); table.setText(R_UPDATED, 1, mediumFormat(chg.getLastUpdatedOn())); 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 ba441ffc83..58460976ba 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 @@ -18,6 +18,7 @@ import com.google.gerrit.client.data.AccountDashboardInfo; 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.Project; import com.google.gerrit.client.rpc.SignInRequired; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.RemoteJsonService; @@ -34,6 +35,14 @@ public interface ChangeListService extends RemoteJsonService { void allOpenNext(String pos, int limit, AsyncCallback<SingleListChangeInfo> callback); + /** Get all open changes more recent than pos, fetching at most limit rows. */ + void byProjectOpenPrev(Project.NameKey project, String pos, int limit, + AsyncCallback<SingleListChangeInfo> callback); + + /** Get all open changes older than pos, fetching at most limit rows. */ + void byProjectOpenNext(Project.NameKey project, String pos, int limit, + AsyncCallback<SingleListChangeInfo> callback); + /** Get all closed changes more recent than pos, fetching at most limit rows. */ void allClosedPrev(Change.Status status, String pos, int limit, AsyncCallback<SingleListChangeInfo> callback); 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 096f824ce5..3fccd450d1 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 @@ -23,6 +23,7 @@ import com.google.gerrit.client.reviewdb.Change; import com.google.gerrit.client.reviewdb.ChangeAccess; import com.google.gerrit.client.reviewdb.ChangeApproval; import com.google.gerrit.client.reviewdb.PatchLineComment; +import com.google.gerrit.client.reviewdb.Project; import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.reviewdb.StarredChange; import com.google.gerrit.client.reviewdb.Change.Id; @@ -85,6 +86,30 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements }); } + public void byProjectOpenPrev(final Project.NameKey project, + final String pos, final int pageSize, + final AsyncCallback<SingleListChangeInfo> callback) { + run(callback, new QueryPrev(pageSize, pos) { + @Override + ResultSet<Change> query(ReviewDb db, int slim, String sortKey) + throws OrmException { + return db.changes().byProjectOpenPrev(project, sortKey, slim); + } + }); + } + + public void byProjectOpenNext(final Project.NameKey project, + final String pos, final int pageSize, + final AsyncCallback<SingleListChangeInfo> callback) { + run(callback, new QueryNext(pageSize, pos) { + @Override + ResultSet<Change> query(ReviewDb db, int slim, String sortKey) + throws OrmException { + return db.changes().byProjectOpenNext(project, sortKey, slim); + } + }); + } + public void allClosedPrev(final Change.Status s, final String pos, final int pageSize, final AsyncCallback<SingleListChangeInfo> callback) { run(callback, new QueryPrev(pageSize, pos) { diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java index 1b78738273..5fc0a46812 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.java @@ -20,6 +20,7 @@ public interface ChangeMessages extends Messages { String accountDashboardTitle(String fullName); String changesStartedBy(String fullName); String changesReviewableBy(String fullName); + String changesOpenInProject(String string); String changeScreenTitleId(int id); String patchSetHeader(int id); diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties index 395d81729d..17c4dbb9f5 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeMessages.properties @@ -1,6 +1,7 @@ accountDashboardTitle = Code Review Dashboard for {0} changesStartedBy = Started by {0} changesReviewableBy = Reviewable by {0} +changesOpenInProject = Open Changes In {0} changeScreenTitleId = Change {0} patchSetHeader = Patch Set {0} diff --git a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java index 8c41c221fe..1fd46d20f7 100644 --- a/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java +++ b/appjar/src/main/java/com/google/gerrit/client/changes/ChangeTable.java @@ -27,6 +27,7 @@ import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.ui.AccountDashboardLink; import com.google.gerrit.client.ui.ChangeLink; import com.google.gerrit.client.ui.FancyFlexTable; +import com.google.gerrit.client.ui.ProjectOpenLink; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.Image; @@ -224,7 +225,8 @@ public class ChangeTable extends FancyFlexTable<ChangeInfo> { } table.setWidget(row, C_SUBJECT, new TableChangeLink(s, c)); table.setWidget(row, C_OWNER, link(c.getOwner())); - table.setText(row, C_PROJECT, c.getProject().getName()); + table.setWidget(row, C_PROJECT, + new ProjectOpenLink(c.getProject().getKey())); table.setText(row, C_LAST_UPDATE, mediumFormat(c.getLastUpdatedOn())); setRowItem(row, c); } diff --git a/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java b/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java index 86f68faf08..714fcb45e2 100644 --- a/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java +++ b/appjar/src/main/java/com/google/gerrit/client/data/ProjectInfo.java @@ -26,6 +26,10 @@ public class ProjectInfo { this.key = key; } + public Project.NameKey getKey() { + return key; + } + public String getName() { return key.get(); } diff --git a/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java b/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java index e0e423ae08..41bccd475e 100644 --- a/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java +++ b/appjar/src/main/java/com/google/gerrit/client/reviewdb/ChangeAccess.java @@ -40,6 +40,16 @@ public interface ChangeAccess extends Access<Change, Change.Id> { @Query("WHERE open = true AND sortKey < ? ORDER BY sortKey DESC LIMIT ?") ResultSet<Change> allOpenNext(String sortKey, int limit) throws OrmException; + @Query("WHERE open = true AND dest.projectName = ? AND sortKey > ?" + + " ORDER BY sortKey LIMIT ?") + ResultSet<Change> byProjectOpenPrev(Project.NameKey p, String sortKey, + int limit) throws OrmException; + + @Query("WHERE open = true AND dest.projectName = ? AND sortKey < ?" + + " ORDER BY sortKey DESC LIMIT ?") + ResultSet<Change> byProjectOpenNext(Project.NameKey p, String sortKey, + int limit) throws OrmException; + @Query("WHERE open = false AND status = ? AND sortKey > ? ORDER BY sortKey LIMIT ?") ResultSet<Change> allClosedPrev(char status, String sortKey, int limit) throws OrmException; diff --git a/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java b/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java index ffbf394a90..5dc5e06470 100644 --- a/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java +++ b/appjar/src/main/java/com/google/gerrit/client/reviewdb/Project.java @@ -42,6 +42,13 @@ public final class Project { protected void set(String newValue) { name = newValue; } + + /** Parse a Project.NameKey out of a string representation. */ + public static NameKey parse(final String str) { + final NameKey r = new NameKey(); + r.fromString(str); + return r; + } } /** Synthetic key to link to within the database */ diff --git a/appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java b/appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java new file mode 100644 index 0000000000..446ff18dca --- /dev/null +++ b/appjar/src/main/java/com/google/gerrit/client/ui/ProjectOpenLink.java @@ -0,0 +1,38 @@ +// Copyright 2009 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.ui; + +import com.google.gerrit.client.Link; +import com.google.gerrit.client.changes.ByProjectOpenChangesScreen; +import com.google.gerrit.client.reviewdb.Project; + +/** Link to the open changes of a project. */ +public class ProjectOpenLink extends DirectScreenLink { + private Project.NameKey project; + + public ProjectOpenLink(final Project.NameKey proj) { + this(proj.get(), proj); + } + + public ProjectOpenLink(final String text, final Project.NameKey proj) { + super(text, Link.toProjectOpen(proj)); + project = proj; + } + + @Override + protected Screen createScreen() { + return new ByProjectOpenChangesScreen(project, "n,z"); + } +} |