English Wikipedia @ Freddythechick:Database reports/WikiProjects by changes/Configuration

This report is updated every 7 days.

Source code

<syntaxhighlight lang="rust"> /* Copyright 2009-2010 bjweeks, MZMcBride, svick Copyright 2021 Kunal Mehta <legoktm@debian.org>

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

*/

use anyhow::Result; use dbreps2::{str_vec, Frequency, Report}; use mysql_async::prelude::*; use mysql_async::Conn;

pub struct Row {

   project: String,
   count: u32,
   no_bots_count: u32,
   // For some reason this subquery is NULL sometimes
   page_is_redirect: Option<u32>,

}

pub struct ProjectChanges {}

impl Report<Row> for ProjectChanges {

   fn title(&self) -> &'static str {
       "WikiProjects by changes"
   }
   fn frequency(&self) -> Frequency {
       Frequency::Weekly
   }
   fn query(&self) -> &'static str {
       r"

/* projectchanges.rs SLOW_OK */ SELECT

 SUBSTRING_INDEX(page_title, '/', 1) AS project,
 SUM(
   (
     SELECT
       COUNT(*)
     FROM
       revision
     WHERE
       page_id = rev_page
       AND DATEDIFF(NOW(), rev_timestamp) <= 365
   )
 ) AS count,
 SUM(
   (
     SELECT
       COUNT(*)
     FROM
       revision_userindex
     WHERE
       page_id = rev_page
       AND DATEDIFF(NOW(), rev_timestamp) <= 365
       AND rev_actor NOT IN (
         SELECT
           actor_id
         FROM
           user_groups
           JOIN user ON user_id = ug_user
           JOIN actor ON actor_user = user_id
         WHERE
           ug_group = 'bot'
       )
   )
 ) AS no_bots_count,
 (
   SELECT
     page_is_redirect
   FROM
     page
   WHERE
     page_namespace = 4
     AND page_title = project
 ) AS redirect

FROM

 page

WHERE

 (
   page_title LIKE 'WikiProject\_%'
   OR page_title LIKE 'WikiAfrica'
 )
 AND page_namespace BETWEEN 4
 AND 5
 AND page_is_redirect = 0

GROUP BY

 project

ORDER BY

 count DESC

"

   }
   async fn run_query(&self, conn: &mut Conn) -> Result<Vec<Row>> {
       let rows = conn
           .query_map(
               self.query(),
               |(project, count, no_bots_count, page_is_redirect)| Row {
                   project,
                   count,
                   no_bots_count,
                   page_is_redirect,
               },
           )
           .await?;
       Ok(rows)
   }
   fn intro(&self) -> &'static str {
       "List of the active or inactive WikiProjects by number of changes to all its pages in the last 365 days"
   }
   fn headings(&self) -> Vec<&'static str> {
       vec!["WikiProject", "Edits", "excl. bots"]
   }
   fn format_row(&self, row: &Row) -> Vec<String> {
       let page = if row.page_is_redirect.unwrap_or(0) == 1 {
           format!("[[Project:{}|]]", &row.project)
       } else {
           format!("[[Project:{}|]]", &row.project)
       };
       str_vec![page, row.count, row.no_bots_count]
   }
   fn code(&self) -> &'static str {
       include_str!("projectchanges.rs")
   }

} </syntaxhighlight>