Glaisher has uploaded a new change for review.
https://gerrit.wikimedia.org/r/235437
Change subject: Update Newsletter DB schema
......................................................................
Update Newsletter DB schema
* Add table prefixes to fields to avoid ambiguity when doing joins
and also per MediaWiki conventions
* Remove foreign key constraints because it's not supported by MyISAM
* Add nls_subscriber_id index to allow for doing queries to specific users
* Add unique nl_name index for order/where queries
* Add nlp_nl_id index to query all publishers for a newsletter
Change-Id: I4b6512285f30759c2ede9c26314071303e4499c6
---
M includes/NewsletterDb.php
M includes/specials/pagers/NewsletterManageTablePager.php
M includes/specials/pagers/NewsletterTablePager.php
M sql/nl_issues.sql
M sql/nl_newsletters.sql
M sql/nl_publishers.sql
M sql/nl_subscriptions.sql
7 files changed, 61 insertions(+), 54 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Newsletter
refs/changes/37/235437/1
diff --git a/includes/NewsletterDb.php b/includes/NewsletterDb.php
index d71e44b..d2116b7 100644
--- a/includes/NewsletterDb.php
+++ b/includes/NewsletterDb.php
@@ -26,8 +26,8 @@
*/
public function addSubscription( $userId, $newsletterId ) {
$rowData = array(
- 'newsletter_id' => $newsletterId,
- 'subscriber_id' =>$userId,
+ 'nls_newsletter_id' => $newsletterId,
+ 'nls_subscriber_id' =>$userId,
);
try{
return $this->writeDb->insert( 'nl_subscriptions',
$rowData, __METHOD__ );
@@ -44,8 +44,8 @@
*/
public function removeSubscription( $userId, $newsletterId ) {
$rowData = array(
- 'newsletter_id' => $newsletterId,
- 'subscriber_id' => $userId,
+ 'nls_newsletter_id' => $newsletterId,
+ 'nls_subscriber_id' => $userId,
);
return $this->writeDb->delete( 'nl_subscriptions', $rowData,
__METHOD__ );
}
@@ -56,17 +56,18 @@
* @return int[]
*/
public function getUserIdsSubscribedToNewsletter( $newsletterId ) {
+ // @todo use selectFieldValues() here
$res = $this->readDb->select(
'nl_subscriptions',
- array( 'subscriber_id' ),
- array( 'newsletter_id' => $newsletterId ),
+ array( 'nls_subscriber_id' ),
+ array( 'nls_newsletter_id' => $newsletterId ),
__METHOD__,
array()
);
$subscriberIds = array();
foreach ( $res as $row ) {
- $subscriberIds[] = $row->subscriber_id;
+ $subscriberIds[] = $row->nls_subscriber_id;
}
return $subscriberIds;
}
@@ -79,8 +80,8 @@
*/
public function addPublisher( $userId, $newsletterId ) {
$rowData = array(
- 'newsletter_id' => $newsletterId,
- 'publisher_id' =>$userId,
+ 'nlp_newsletter_id' => $newsletterId,
+ 'nlp_publisher_id' =>$userId,
);
try{
return $this->writeDb->insert( 'nl_publishers',
$rowData, __METHOD__ );
@@ -97,8 +98,8 @@
*/
public function removePublisher( $userId, $newsletterId ) {
$rowData = array(
- 'newsletter_id' => $newsletterId,
- 'publisher_id' => $userId,
+ 'nlp_newsletter_id' => $newsletterId,
+ 'nlp_publisher_id' => $userId,
);
return $this->writeDb->delete( 'nl_publishers', $rowData,
__METHOD__ );
}
@@ -184,10 +185,10 @@
$res = $this->readDb->select(
array( 'nl_publishers', 'nl_newsletters' ),
array( 'nl_id', 'nl_name', 'nl_desc',
'nl_main_page_id', 'nl_frequency', 'nl_owner_id' ),
- array( 'publisher_id' => $user->getId() ),
+ array( 'nlp_publisher_id' => $user->getId() ),
__METHOD__,
array(),
- array( 'nl_newsletters' => array( 'LEFT JOIN',
'nl_id=newsletter_id' ) )
+ array( 'nl_newsletters' => array( 'LEFT JOIN',
'nl_id=nlp_publisher_id' ) )
);
return $this->getNewslettersFromResult( $res );
@@ -236,16 +237,16 @@
//Note: the writeDb is used as this is used in the next insert
$lastIssueId = $this->writeDb->selectRowCount(
'nl_issues',
- array( 'issue_id' ),
- array( 'issue_newsletter_id' => $newsletterId ),
+ array( 'nli_issue_id' ),
+ array( 'nli_newsletter_id' => $newsletterId ),
__METHOD__
);
-
+ // @todo should probably AUTO INCREMENT here
$rowData = array(
- 'issue_id' => $lastIssueId + 1,
- 'issue_page_id' => $pageId,
- 'issue_newsletter_id' => $newsletterId,
- 'issue_publisher_id' => $publisherId,
+ 'nli_issue_id' => $lastIssueId + 1,
+ 'nli_page_id' => $pageId,
+ 'nli_newsletter_id' => $newsletterId,
+ 'nli_publisher_id' => $publisherId,
);
try{
return $this->writeDb->insert( 'nl_issues', $rowData,
__METHOD__ );
diff --git a/includes/specials/pagers/NewsletterManageTablePager.php
b/includes/specials/pagers/NewsletterManageTablePager.php
index 7a8c4b1..0a8a1ac 100644
--- a/includes/specials/pagers/NewsletterManageTablePager.php
+++ b/includes/specials/pagers/NewsletterManageTablePager.php
@@ -14,8 +14,8 @@
public function getFieldNames() {
if ( $this->fieldNames === null ) {
$this->fieldNames = array(
- 'newsletter_id' => $this->msg(
'newsletter-manage-header-name' )->text(),
- 'publisher_id' => $this->msg(
'newsletter-manage-header-publisher' )->text(),
+ 'nl_id' => $this->msg(
'newsletter-manage-header-name' )->text(),
+ 'nlp_publisher_id' => $this->msg(
'newsletter-manage-header-publisher' )->text(),
'permissions' => $this->msg(
'newsletter-manage-header-permissions' )->text(),
'action' => $this->msg(
'newsletter-manage-header-action' )->text(),
);
@@ -27,12 +27,12 @@
return array(
'tables' => array( 'nl_publishers', 'nl_newsletters' ),
'fields' => array(
- 'newsletter_id',
- 'publisher_id',
- 'is_owner' => 'publisher_id = nl_owner_id',
+ 'nl_id',
+ 'nlp_publisher_id',
+ 'is_owner' => 'nlp_publisher_id = nl_owner_id',
),
'join_conds' => array(
- 'nl_newsletters' => array( 'LEFT JOIN',
'newsletter_id = nl_id' ),
+ 'nl_newsletters' => array( 'LEFT JOIN',
'nlp_newsletter_id = nl_id' ),
),
);
}
@@ -41,11 +41,12 @@
static $previous;
switch ( $field ) {
- case 'newsletter_id':
+ case 'nl_id':
if ( $previous === $value ) {
return null;
} else {
+ // @todo should be retrieved as a batch
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select(
'nl_newsletters',
@@ -62,7 +63,7 @@
return $newsletterName;
}
- case 'publisher_id' :
+ case 'nlp_publisher_id' :
$user = User::newFromId( $value );
return $user->getName();
@@ -89,16 +90,16 @@
return $radioOwner . $radioPublisher;
case 'action' :
- $isCurrentUser =
$this->mCurrentRow->publisher_id == $this->getUser()->getId();
+ $isCurrentUser =
$this->mCurrentRow->nlp_publisher_id == $this->getUser()->getId();
if ( !$this->mCurrentRow->is_owner &&
!$isCurrentUser ) {
return HTML::element(
'input',
array(
'type' => 'button',
- 'value' => 'Remove',
+ 'value' => 'Remove', //
@todo needs i18n
'name' => $previous,
- 'id' =>
$this->mCurrentRow->publisher_id,
+ 'id' =>
$this->mCurrentRow->nlp_publisher_id,
)
);
}
@@ -113,7 +114,7 @@
}
public function getDefaultSort() {
- return 'newsletter_id';
+ return 'nl_id';
}
public function isFieldSortable( $field ) {
diff --git a/includes/specials/pagers/NewsletterTablePager.php
b/includes/specials/pagers/NewsletterTablePager.php
index fab47ff..b77cfc0 100644
--- a/includes/specials/pagers/NewsletterTablePager.php
+++ b/includes/specials/pagers/NewsletterTablePager.php
@@ -3,6 +3,7 @@
/**
* @license GNU GPL v2+
* @author Tina Johnson
+ * @todo Optimize queries here
*/
class NewsletterTablePager extends TablePager {
@@ -32,8 +33,8 @@
'nl_name',
'nl_desc',
'nl_id',
- 'subscribers' => ( '( SELECT COUNT(*) FROM
nl_subscriptions WHERE newsletter_id = nl_id )' ),
- 'current_user_subscribed' => "$userId IN
(SELECT subscriber_id FROM nl_subscriptions WHERE newsletter_id = nl_id )" ,
+ 'subscribers' => ( '( SELECT COUNT(*) FROM
nl_subscriptions WHERE nls_newsletter_id = nl_id )' ),
+ 'current_user_subscribed' => "$userId IN
(SELECT nls_subscriber_id FROM nl_subscriptions WHERE nls_newsletter_id = nl_id
)" ,
),
'options' => array( 'DISTINCT nl_id' ),
);
@@ -44,6 +45,7 @@
public function formatValue( $field, $value ) {
switch ( $field ) {
case 'nl_name':
+ // @todo do batch queries instead of separate
queries for each row
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select(
'nl_newsletters',
diff --git a/sql/nl_issues.sql b/sql/nl_issues.sql
index b425b6f..8b73978 100644
--- a/sql/nl_issues.sql
+++ b/sql/nl_issues.sql
@@ -1,11 +1,11 @@
-- Database schema for creating nl_issues table.
CREATE TABLE /*_*/nl_issues(
- issue_id int unsigned NOT NULL,
- issue_page_id int NOT NULL,
+ nli_issue_id int unsigned NOT NULL,
+ nli_page_id int NOT NULL,
-- Foreign key referenced from nl_newsletters
- issue_newsletter_id int REFERENCES nl_newsletters(nl_id),
- issue_publisher_id int NOT NULL,
+ nli_newsletter_id int,
+ nli_publisher_id int NOT NULL,
-- Composite primary key
- PRIMARY KEY (issue_id, issue_newsletter_id)
-)/*$wgDBTableOptions*/;
\ No newline at end of file
+ PRIMARY KEY (nli_issue_id, nli_newsletter_id)
+)/*$wgDBTableOptions*/;
diff --git a/sql/nl_newsletters.sql b/sql/nl_newsletters.sql
index d38f7b2..566b777 100644
--- a/sql/nl_newsletters.sql
+++ b/sql/nl_newsletters.sql
@@ -1,13 +1,14 @@
-- Database schema for creating nl_newsletter table.
CREATE TABLE /*_*/nl_newsletters(
- --Primary key
+ -- Primary key
nl_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- nl_name varchar(50) NOT NULL UNIQUE,
- nl_desc varbinary(767),
- nl_main_page_id int NOT NULL UNIQUE,
+ nl_name varchar(64) NOT NULL,
+ nl_desc varbinary(1024),
+ nl_main_page_id int unsigned NOT NULL UNIQUE,
nl_frequency varchar(50) NOT NULL,
nl_owner_id int NOT NULL
)/*$wgDBTableOptions*/;
-CREATE INDEX /*i*/nl_owner_id ON /*_*/nl_newsletters(nl_owner_id);
\ No newline at end of file
+CREATE INDEX /*i*/nl_owner_id ON /*_*/nl_newsletters(nl_owner_id);
+CREATE UNIQUE INDEX /*i*/nl_name ON /*_*/nl_newsletters (nl_name);
diff --git a/sql/nl_publishers.sql b/sql/nl_publishers.sql
index d6cef4b..93e74d5 100644
--- a/sql/nl_publishers.sql
+++ b/sql/nl_publishers.sql
@@ -1,8 +1,9 @@
-- Database schema for creating nl_publishers table.
CREATE TABLE /*_*/nl_publishers(
- --Primary key
- newsletter_id int REFERENCES nl_newsletter(nl_id),
- publisher_id int NOT NULL,
- PRIMARY KEY (publisher_id, newsletter_id)
+ nlp_newsletter_id int unsigned NOT NULL,
+ nlp_publisher_id int NOT NULL,
+ PRIMARY KEY (nlp_publisher_id, nlp_newsletter_id)
)/*$wgDBTableOptions*/;
+
+CREATE INDEX /*i*/nlp_nl_id ON /*_*/nl_publishers(nlp_newsletter_id);
diff --git a/sql/nl_subscriptions.sql b/sql/nl_subscriptions.sql
index 6b982af..4f857ef 100644
--- a/sql/nl_subscriptions.sql
+++ b/sql/nl_subscriptions.sql
@@ -1,9 +1,10 @@
-- Database schema for creating nl_subscriptions table.
CREATE TABLE /*_*/nl_subscriptions(
- -- Foreign key referenced from nl_newsletters
- newsletter_id int REFERENCES nl_newsletters(nl_id),
- subscriber_id int NOT NULL,
+ nls_newsletter_id int NOT NULL,
+ nls_subscriber_id int NOT NULL,
-- Composite primary key
- PRIMARY KEY (newsletter_id, subscriber_id)
-)/*$wgDBTableOptions*/;
\ No newline at end of file
+ PRIMARY KEY (nls_newsletter_id, nls_subscriber_id)
+)/*$wgDBTableOptions*/;
+
+CREATE INDEX /*i*/nls_subscriber_id ON
/*_*/nl_subscriptions(nls_subscriber_id);
--
To view, visit https://gerrit.wikimedia.org/r/235437
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I4b6512285f30759c2ede9c26314071303e4499c6
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Newsletter
Gerrit-Branch: master
Gerrit-Owner: Glaisher <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits