/* Statistics.java - Statistics of the source Wiki database. * * Copyright (c) 2005-2009 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com> * Distributed under GNU Public License. */ package wikipedia.sql; import java.sql.*; /** Presents various statistics related to Wikipedia MySQL database */ public class Statistics { public Statistics() { } /** Gets number of elements in the table: SELECT COUNT(*) FROM table_name. * * @return -1 if database is not available */ public static int Count(Connect connect, String table_name) { if(null==connect || null==connect.conn) return -1; int size = 0; String str_sql = null; try { Statement s = connect.conn.createStatement (); try { str_sql = "SELECT COUNT(*) AS size FROM " + table_name; ResultSet rs = s.executeQuery(str_sql); try { if (rs.next ()) size = rs.getInt("size"); } finally { rs.close(); } } finally { s.close(); } } catch(SQLException ex) { System.err.println("SQLException (Statistics.java Count()): sql='" + str_sql + "' " + ex.getMessage()); } return size; } /** Gets number of articles or categories: <br> * SELECT COUNT(*) AS size FROM page WHERE page_namespace=ns * * @param where additional constraint, e.g. "page_is_redirect=0 AND" * * @return -1 if database is not available */ private static int CountPageForNamespace(Connect connect, String where, PageNamespace ns) { Statement s = null; ResultSet rs= null; int size = 0; String str_sql = null; if(null==connect || null==connect.conn) return -1; try { s = connect.conn.createStatement (); str_sql = "SELECT COUNT(*) AS size FROM page WHERE " + where + " page_namespace="+ns.toInt(); rs = s.executeQuery (str_sql); if (rs.next ()) { size = rs.getInt("size"); } } catch(SQLException ex) { System.err.println("SQLException (Statistics.java CountPageForNamespace()): sql='" + str_sql + "' " + ex.getMessage()); } finally { if (rs != null) { try { rs.close(); } catch (SQLException sqlEx) { } rs = null; } if (s != null) { try { s.close(); } catch (SQLException sqlEx) { } s = null; } } return size; } /** Gets number of articles: <br> * SELECT COUNT(*) AS size FROM page WHERE page_namespace=0 */ public static int CountArticles(Connect connect) { return CountPageForNamespace(connect, "", PageNamespace.MAIN); } /** Gets number of articles, which are not redirects: <br> * SELECT COUNT(*) AS size FROM page WHERE page_is_redirect=0 AND page_namespace=0 */ public static int CountArticlesNonRedirects(Connect connect) { return CountPageForNamespace(connect, "page_is_redirect=0 AND", PageNamespace.MAIN); } /** Gets number of categories. */ public static int CountCategories(Connect connect) { return CountPageForNamespace(connect, "", PageNamespace.CATEGORY); } public static int CountLinks(Connect connect) { return 0; } /** Gets sum of elements of some field in the table.<br><br> * SELECT SUM(field_name) FROM table_name; * * @return -1 if database is not available */ public static int Sum(Connect connect, String table_name, String field_name) { if(null==connect || null==connect.conn) return -1; int sum = 0; StringBuilder str_sql = new StringBuilder(); try { Statement s = connect.conn.createStatement (); try { // SELECT SUM(field_name) FROM table_name; str_sql.append("SELECT SUM(").append(field_name); str_sql.append(") AS sum FROM ").append(table_name); ResultSet rs = s.executeQuery(str_sql.toString()); try { if (rs.next ()) sum = rs.getInt("sum"); } finally { rs.close(); } } finally { s.close(); } } catch(SQLException ex) { System.err.println("SQLException (Statistics.java Count()): sql='" + str_sql + "' " + ex.getMessage()); } return sum; } }