← Back to team overview

mvhub-dev team mailing list archive

[Merge] lp:~saroun-sek/mvhub/sql_change into lp:mvhub

 

Saroun Sek has proposed merging lp:~saroun-sek/mvhub/sql_change into lp:mvhub.

Requested reviews:
  MVHub devs with commit rights (mvhub-commit)
Related bugs:
  #396354 [f] refactor SQL into SQL::LIbrary
  https://bugs.launchpad.net/bugs/396354

-- 
https://code.launchpad.net/~saroun-sek/mvhub/sql_change/+merge/28658
Your team MVHub Developers is subscribed to branch lp:mvhub.
=== modified file 'app-mvhub/DocumentRoot/cgi-bin/mvhub/admin/admin_reports.pl'
--- app-mvhub/DocumentRoot/cgi-bin/mvhub/admin/admin_reports.pl	2010-06-22 19:00:02 +0000
+++ app-mvhub/DocumentRoot/cgi-bin/mvhub/admin/admin_reports.pl	2010-06-28 17:27:29 +0000
@@ -43,71 +43,17 @@
     {   title => 'Agencies not responding to email or with bad contact email',
         comment =>
             'If the agency or program contact does not update their records after 4 emails we pick up the phone',
-        sql => q/
-            SELECT
-                a.agency_name, 
-                a.contact_phone,
-                a.contact_first_name || ' '
-                || a.contact_last_name AS contact,
-                a.contact_email,
-                ' MAIN AGENCY RECORD' AS program_name
-            FROM 
-                agency a
-            WHERE
-                a.contact_email like '%bad@xxxxxxxxxxxxxx%'  
-                OR a.contact_email = 'none'
-                OR a.contact_email = 'unknown'
-                OR a.reminders_sent >= ?
-            UNION 
-            SELECT
-                a.agency_name, 
-                p.contact_phone,
-                p.contact_first_name || ' '
-                || p.contact_last_name AS contact,
-                p.contact_email,
-                p.program_name 
-            FROM 
-                program p
-            JOIN agency a ON a.agency_id = p.agency_id
-            WHERE
-                p.contact_email like '%bad@xxxxxxxxxxxxxx%'  
-                OR p.contact_email = 'none'
-                OR p.contact_email = 'unknown'
-                OR p.reminders_sent >=?
-            ORDER BY
-                agency_name,program_name
-            /,
+        sql => MVHub::Utils::DB::get_sql_select_statement(
+            'AGENCY_X_DATE_OF_OLDEST_RECORD'),
         bind_values => [ $max_notifications, $max_notifications ]
     },
     {   title => 'Agencies with Missing or Unknown Contact Information',
-        sql   => q/
-        SELECT agency_name, address1, email, main_phone, contact_first_name, 
-            contact_last_name, contact_email, contact_phone 
-        FROM agency 
-        WHERE 
-            address1 ~* '(unknown|contact|\\\\?)'
-            or email ~* 'unknown' 
-            or contact_email ~* 'unknown' 
-            or contact_first_name ~* '(unknown|contact|\\\\?)' 
-            or contact_last_name ~* '(unknown|contact|\\\\?)'
-        /
+        sql   => MVHub::Utils::DB::get_sql_select_statement(
+            'AGENCY_X_AGENCIES_WITH_MISSING_CONTACT_INFO')
     },
     {   title => 'Programs with Missing or Unknown Contact Information',
-        sql   => q/
-            SELECT p.program_name, a.agency_name, p.address1, p.email, p.main_phone, 
-                p.contact_first_name, p.contact_last_name, p.contact_email, 
-                p.contact_phone
-            FROM program p, agency a 
-            WHERE 
-            (
-                p.address1 ~* '(unknown|contact|\\\\?)'
-                or p.email ~* 'unknown'
-                or p.contact_email ~* 'unknown'
-                or p.contact_first_name ~* '(unknown|contact|\\\\?)' 
-                or p.contact_last_name ~* '(unknown|contact|\\\\?)'
-            ) 
-            and a.agency_id = p.agency_id
-        /
+        sql   => MVHub::Utils::DB::get_sql_select_statement(
+            'AGENCY_PROGRAM_X_PROGRAM_WITH_MISSING_CONTACT_INFO')
     }
 );    # @REPORTS
 

=== modified file 'app-mvhub/DocumentRoot/cgi-bin/mvhub/admin/structure.pl'
--- app-mvhub/DocumentRoot/cgi-bin/mvhub/admin/structure.pl	2010-06-17 18:46:44 +0000
+++ app-mvhub/DocumentRoot/cgi-bin/mvhub/admin/structure.pl	2010-06-28 17:27:29 +0000
@@ -470,14 +470,26 @@
     # The SELECT EXISTS (SELECT 1 ...) syntax is generally faster than the
     # SELECT count(*) syntax, since the former only scans until it finds
     # the first match.
-    my $sql = "SELECT 1 FROM category WHERE lower(category_name) = "
-        . $dbh->quote( lc($category_name) );
-    if ($category_id) {
-        $sql .= " AND category_id <> " . $dbh->quote($category_id);
-    }
-    $sql = "SELECT EXISTS($sql)";
-
-    my @row = $dbh->selectrow_array($sql);
+    my @bind_variables = ( lc($category_name) );
+    my $sql            = MVHub::Utils::DB::get_sql_select_statement(
+        'CATEGORY_X_ONE_CATEGORY_NAME');
+
+    if ($category_id) {
+        @bind_variables = ( lc($category_name), $category_id );
+        $sql = MVHub::Utils::DB::get_sql_select_statement(
+            'CATEGORY_X_ONE_CATEGORY_NAME_NOT_ID');
+    }
+
+    $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'CATEGORY_X_EXISTS_ONE_CATEGORY_NAME');
+
+    if ($category_id) {
+        $sql = MVHub::Utils::DB::get_sql_select_statement(
+            'CATEGORY_X_EXISTS_ONE_CATEGORY_NAME_NOT_ID');
+    }
+
+    my @row
+        = $dbh->selectall_arrayref( $sql, { Slice => {} }, @bind_variables );
 
     return ( $row[0] );
 }

=== modified file 'app-mvhub/DocumentRoot/cgi-bin/mvhub/agency_form.pl'
--- app-mvhub/DocumentRoot/cgi-bin/mvhub/agency_form.pl	2010-06-24 15:15:46 +0000
+++ app-mvhub/DocumentRoot/cgi-bin/mvhub/agency_form.pl	2010-06-28 17:27:29 +0000
@@ -291,20 +291,6 @@
     return ( $row[0] != 0 );
 }
 
-sub is_valid_agency_name {
-    my %args        = @_;
-    my $agency_id   = delete $args{'agency_id'};
-    my $agency_name = delete $args{'agency_name'};
-    my $table       = delete $args{'table'};
-
-    my $dbh = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
-    my $stmt
-        = "SELECT COUNT(*) FROM $table WHERE agency_name=? AND agency_id=?";
-    my @row = $dbh->selectrow_array( $stmt, undef, $agency_name, $agency_id );
-
-    return ( $row[0] != 0 );
-}
-
 sub prepare_record_for_db {
     my ( $values_href, $username, $is_data_entry_operator, $update_status )
         = @_;

=== modified file 'app-mvhub/DocumentRoot/cgi-bin/mvhub/program.pl'
--- app-mvhub/DocumentRoot/cgi-bin/mvhub/program.pl	2010-06-24 15:15:46 +0000
+++ app-mvhub/DocumentRoot/cgi-bin/mvhub/program.pl	2010-06-28 17:27:29 +0000
@@ -384,19 +384,20 @@
     MVHub::Utils::assert( ( scalar keys %args ) == 0,
         "Unknown arguments: @{[%args]}" );
     my $dbh = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
-    my $stmt
-        = 'SELECT COUNT(*) FROM program'
-        . ' WHERE LOWER(program_name) = '
-        . $dbh->quote( lc($program_name) )
-        . ' AND agency_id = '
-        . $dbh->quote($agency_id);
+
+    my @bind_variables = ( lc($program_name), $agency_id );
+
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'PROGRAM_LOWER_PROGRAM_NAME_X_COUNT');
 
     # So they can update an existing program, and keep the same name
     if ( $program_id != $MVHub::Common::NO_PROGRAM_ID ) {
-        $stmt .= " AND program_id <> " . $dbh->quote($program_id);
+        $sql = MVHub::Utils::DB::get_sql_select_statement(
+            'PROGRAM_LOWER_PROGRAM_NAME_ID_X_COUNT');
+        @bind_variables = ( lc($program_name), $agency_id, $program_id );
     }
 
-    my @row = $dbh->selectrow_array($stmt);
+    my @row = $dbh->selectrow_array( $sql, { Slice => {} }, @bind_variables );
 
     return ( $row[0] == 0 );
 }
@@ -455,10 +456,10 @@
 
     my $dbh = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
 
-    my $stmt = MVHub::Utils::DB::get_sql_select_statement(
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
         'CATEGORY_HEADING_CATEGORY_X_HEADING_CATEGORY_NAME');
 
-    my $categories_aref = $dbh->selectall_arrayref( $stmt, { Slice => {} } );
+    my $categories_aref = $dbh->selectall_arrayref( $sql, { Slice => {} } );
 
     # Fill a hash of: heading => { category_id => category_name, ... }
     my %categories_hash;
@@ -471,11 +472,12 @@
     # Get any category ID previously selected for this program, if any
     my $preselected_category_ids_aref;
     if ($existing) {
-        my $stmt2
-            = 'SELECT category_id FROM program_category '
-            . 'WHERE program_id = '
-            . $dbh->quote($program_id);
-        $preselected_category_ids_aref = $dbh->selectcol_arrayref($stmt2);
+        my @bind_variables = ($program_id);
+        $sql = MVHub::Utils::DB::get_sql_select_statement(
+            'PROGRAM_CATEGORY_X_CATEGORY_ID');
+        $preselected_category_ids_aref
+            = $dbh->selectcol_arrayref( $sql, { Slice => {} },
+            @bind_variables );
     }
 
     # Produce our page
@@ -900,12 +902,15 @@
 
 # Make sure there is a program to be deleted (because someone might accidentally click
 # the "Remove" link twice in a row)
-    if (scalar $dbh->selectrow_array(
-            "SELECT COUNT(*) FROM program WHERE program_id = "
-                . $dbh->quote($program_id)
-        )
+
+    my $sql
+        = MVHub::Utils::DB::get_sql_select_statement('PROGRAM_X_COUNT_ALL');
+    my @bind_variables = ($program_id);
+
+    if (scalar $dbh->selectrow_array( $sql, { Slice => {} }, @bind_variables )
         )
     {
+
         if ( !$is_admin ) {
 
  # We send the notification before doing the deletion since the following call
@@ -942,15 +947,13 @@
 
     my $dbh = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
 
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'AGENCY_PROGRAM_X_AGENCY_NAME');
+    my @bind_variables = ( $program_id, $agency_id );
+
     # Regardless of mode, get the program info and prepare it for display
-    my $result_aref = $dbh->selectall_arrayref(
-        "SELECT a.agency_name, p.* FROM agency a, program p "
-            . "WHERE p.program_id = "
-            . $dbh->quote($program_id)
-            . "AND a.agency_id = "
-            . $dbh->quote($agency_id),
-        { Slice => {} }
-    );
+    my $result_aref
+        = $dbh->selectall_arrayref( $sql, { Slice => {} }, @bind_variables );
 
     MVHub::Utils::assert( ( @$result_aref == 1 ),
         "Expected 1 result, got " . scalar @$result_aref );
@@ -1274,56 +1277,6 @@
     $values_href->{bus_lines} = $transit_routes_aref;
 }
 
-sub is_program_name_unique {
-    my %args         = @_;
-    my $program_name = delete $args{'program_name'};
-    my $agency_id    = delete $args{'agency_id'};
-    my $table        = delete $args{'table'};
-    MVHub::Utils::assert( defined $program_name && $program_name ne "",
-        "Missing program_name argument" );
-    MVHub::Utils::assert( ( scalar keys %args ) == 0,
-        "Unknown arguments: @{[%args]}" );
-    my $dbh = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
-    my $stmt
-        = "SELECT COUNT(*) FROM $table WHERE LOWER(program_name)= "
-        . $dbh->quote( lc($program_name) )
-        . "AND agency_id= "
-        . $dbh->quote($agency_id);
-
-    my @row = $dbh->selectrow_array($stmt);
-
-    return ( $row[0] == 0 );
-}
-
-sub is_valid_program_id {
-    my %args       = @_;
-    my $program_id = delete $args{'program_id'};
-    my $table      = delete $args{'table'};
-    MVHub::Utils::assert( ( scalar keys %args ) == 0,
-        "Unknown arguments: @{[%args]}" );
-
-    my $dbh  = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
-    my $stmt = "SELECT COUNT(*) FROM $table WHERE program_id=?";
-    my @row  = $dbh->selectrow_array( $stmt, undef, $program_id );
-
-    return ( $row[0] != 0 );
-}
-
-sub is_valid_program_name {
-    my %args         = @_;
-    my $program_id   = delete $args{'program_id'};
-    my $program_name = delete $args{'program_name'};
-    my $table        = delete $args{'table'};
-
-    my $dbh = MVHub::Utils::DB::get_dbh( $ENV{MV_CONFIG_FILE} );
-    my $stmt
-        = "SELECT COUNT(*) FROM $table WHERE program_name=? AND program_id=?";
-    my @row
-        = $dbh->selectrow_array( $stmt, undef, $program_name, $program_id );
-
-    return ( $row[0] != 0 );
-}
-
 sub send_confirmation_email {
     my $values_href = shift;
     my $agency_name

=== modified file 'app-mvhub/DocumentRoot/cgi-bin/mvhub/reports.pl'
--- app-mvhub/DocumentRoot/cgi-bin/mvhub/reports.pl	2010-06-25 14:58:28 +0000
+++ app-mvhub/DocumentRoot/cgi-bin/mvhub/reports.pl	2010-06-28 17:27:29 +0000
@@ -42,22 +42,15 @@
     #     },
     {   title   => 'Agency Addition Dates',
         comment => "This gives the date when each agency was added to MVHub.",
-        sql     => qq/
-			SELECT agency_name, date_created
-			FROM agency 
-			ORDER BY date_created;
-		/
+        sql     => MVHub::Utils::DB::get_sql_select_statement(
+            'AGENCY_X_AGENCY_NAME_DATE_CREATED')
     },
 
     {   title => 'Program Addition Dates',
         comment =>
             "This gives the date when each program was added to MVHub.",
-        sql => qq/
-			SELECT p.program_name, a.agency_name, p.date_created
-			FROM agency a, program p 
-			WHERE p.agency_id = a.agency_id
-			ORDER BY p.date_created;
-		/
+        sql => MVHub::Utils::DB::get_sql_select_statement(
+            'AGENCY_X_PROGRAM_NAME_AGENCY_NAME_DATE_CREATED')
     },
 
     {   title => 'All Searches',
@@ -69,18 +62,8 @@
             . "was conducted. A referer with an external site address probably means that site "
             . "has a link to a specific search. A blank referer probably means the user used a bookmark "
             . "(of a previously conducted search).",
-        sql => qq/
-        SELECT to_char(timestamp, 'Dy, Mon DD, YYYY HH24:MI') as conducted_on, search_phrase, search_type, category_score, agencies_displayed, split_part(referer, '?', 1) as referer FROM (
-            SELECT search_id, timestamp, search_phrase, 'agency' as search_type, NULL as category_score, 
-                   hit_count as agencies_displayed, referer
-            FROM agency_search_log
-            UNION
-            SELECT search_id, timestamp, search_phrase, 'category' as search_type, top_score as category_score,
-                   NULL as agencies_displayed, referer
-            FROM category_search_log WHERE search_phrase IS NOT NULL
-        ) as all_searches
-        ORDER BY search_id DESC;
-        /
+        sql => MVHub::Utils::DB::get_sql_select_statement(
+            'AGENCY_SEARCH_LOG_X_ALL_SEARCHES')
     },
 
     {   title => 'Searchers per Day',
@@ -88,15 +71,8 @@
             'The number of people conducting searches per day. Multiple searches '
             . 'from the same IP address on the same day are attributed to the same '
             . 'person. Only dates with one or more searches are listed.',
-        sql => q/
-            SELECT to_char(search_date, 'Dy, Mon DD, YYYY') as search_date, count FROM 
-                (  
-                    SELECT date(timestamp) as search_date, count(distinct ip_address) as count
-                    FROM search_log 
-                    GROUP BY search_date ORDER BY search_date DESC
-                ) as preformatted_results
-                
-        /
+        sql => MVHub::Utils::DB::get_sql_select_statement(
+            'SEARCH_LOG_X_SEARCHERS_PER_DAY')
     },
     {   title =>
             'Number &amp; percentage of Agencies &amp; Programs updated in the Last 6 Months',
@@ -129,27 +105,14 @@
             'Date of the Oldest Record belonging to each Agency (ordered by date)',
         comment =>
             "(An agency's oldest record may be its agency record &\/or any of its program record(s))",
-        sql => q/
-            SELECT a.agency_name, 
-                min(record_ages.last_updated) AS "Oldest Record (yyyy-mm-dd)" 
-            FROM (
-                SELECT agency_id, last_updated from program
-                UNION
-                SELECT agency_id, last_updated from agency 
-            ) AS record_ages, agency a
-            WHERE a.agency_id = record_ages.agency_id
-            GROUP BY agency_name ORDER BY "Oldest Record (yyyy-mm-dd)", agency_name
-        /
+        sql => MVHub::Utils::DB::get_sql_select_statement(
+            'PROGRAM_AGENCY_ID_X_OLDEST_RECORD_DATE')
     },
     {   title => 'Number of Programs under each Category',
 
    # We use a left join below so that we also see which categories are unused.
-        sql => q/
-            SELECT c.category_name, count(pc.program_id) AS programs
-            FROM category c LEFT OUTER JOIN program_category pc
-            ON (c.category_id = pc.category_id)
-            GROUP BY c.category_name ORDER BY programs DESC, category_name
-        /
+        sql => MVHub::Utils::DB::get_sql_select_statement(
+            'CATEGORY_PROGRAM_CATEGORY_X_NUMBER_OF_PROGRAMS_UNDER_CATEGORY')
     },
     {   title => 'Number of Categories used by each Program',
 

=== modified file 'app-mvhub/conf/sql_select.lib'
--- app-mvhub/conf/sql_select.lib	2010-06-19 19:50:00 +0000
+++ app-mvhub/conf/sql_select.lib	2010-06-28 17:27:29 +0000
@@ -104,6 +104,12 @@
                          )
         AND NOT agency.hidden
 		
+[AGENCY_PROGRAM_X_AGENCY_NAME]
+SELECT a.agency_name, p.* 
+FROM agency a, program p 
+WHERE p.program_id = ?
+AND a.agency_id = ?
+
 [AGENCY_PROGRAM_X_AGENCY_NAME_AGENCY_ALIAS]
 SELECT 
   a.agency_name, a.agency_alias, p.* 
@@ -121,6 +127,34 @@
 	USING ( agency_id )
 WHERE agency_id =  ?
 
+[AGENCY_PROGRAM_X_PROGRAM_WITH_MISSING_CONTACT_INFO]
+SELECT p.program_name, a.agency_name, p.address1, p.email, p.main_phone, 
+    p.contact_first_name, p.contact_last_name, p.contact_email, 
+    p.contact_phone
+FROM program p, agency a 
+WHERE 
+(
+    p.address1 ~* '(unknown|contact)'
+    or p.email ~* 'unknown'
+    or p.contact_email ~* 'unknown'
+    or p.contact_first_name ~* '(unknown|contact)' 
+    or p.contact_last_name ~* '(unknown|contact)'
+) 
+and a.agency_id = p.agency_id
+		
+[AGENCY_SEARCH_LOG_X_ALL_SEARCHES]
+SELECT to_char(timestamp, 'Dy, Mon DD, YYYY HH24:MI') as conducted_on, search_phrase, search_type, category_score, agencies_displayed, split_part(referer, '?', 1) as referer 
+FROM (
+      SELECT search_id, timestamp, search_phrase, 'agency' as search_type, NULL as category_score, 
+                   hit_count as agencies_displayed, referer
+      FROM agency_search_log
+      UNION
+      SELECT search_id, timestamp, search_phrase, 'category' as search_type, top_score as category_score,
+                   NULL as agencies_displayed, referer
+      FROM category_search_log WHERE search_phrase IS NOT NULL
+) as all_searches
+ORDER BY search_id DESC;       
+		
 [AGENCY_SEARCH_LOG_X_IF_RECORDED_RECENT_AGENCY_SEARCH_BY_USER]
 SELECT 
 EXISTS 
@@ -134,7 +168,38 @@
       AND 
 	  search_phrase = ?
     )
+
+[AGENCY_X_AGENCIES_WITH_MISSING_CONTACT_INFO]
+SELECT agency_name, address1, email, main_phone, contact_first_name, 
+     contact_last_name, contact_email, contact_phone 
+FROM agency 
+WHERE 
+     address1 ~* '(unknown|contact)'
+     or email ~* 'unknown' 
+     or contact_email ~* 'unknown' 
+     or contact_first_name ~* '(unknown|contact)' 
+     or contact_last_name ~* '(unknown|contact)'
+	 
+[AGENCY_X_AGENCY_ID]
+SELECT * 
+FROM agency 
+WHERE agency_id = ?
+	
+[AGENCY_X_AGENCY_ID_NAME]
+SELECT agency_id,agency_name 
+FROM agency 
+ORDER by agency_name
+
+[AGENCY_X_AGENCY_NAME]
+SELECT agency_name 
+FROM agency 
+WHERE agency_id=?
     
+[AGENCY_X_AGENCY_NAME_DATE_CREATED]
+SELECT agency_name, date_created
+FROM agency 
+ORDER BY date_created;
+			
 [AGENCY_X_AGENCY_NAME_PASSWORD]
 SELECT agency_name, password 
 FROM 
@@ -148,7 +213,8 @@
 			  FROM program 
 			  WHERE contact_email = ?
         	    )
-  
+ 
+		
 [AGENCY_X_ALL]
 SELECT 
          * 
@@ -198,6 +264,40 @@
 FROM agency 
 WHERE NOT hidden
   
+[AGENCY_X_DATE_OF_OLDEST_RECORD]	 
+SELECT
+      a.agency_name, 
+      a.contact_phone,
+      a.contact_first_name || ' '
+      || a.contact_last_name AS contact,
+      a.contact_email,
+      ' MAIN AGENCY RECORD' AS program_name
+FROM 
+      agency a
+WHERE
+      a.contact_email like '%bad@xxxxxxxxxxxxxx%'  
+      OR a.contact_email = 'none'
+      OR a.contact_email = 'unknown'
+      OR a.reminders_sent >= ?
+UNION 
+SELECT
+      a.agency_name, 
+      p.contact_phone,
+      p.contact_first_name || ' '
+      || p.contact_last_name AS contact,
+      p.contact_email,
+      p.program_name 
+FROM 
+      program p
+JOIN agency a ON a.agency_id = p.agency_id
+WHERE
+      p.contact_email like '%bad@xxxxxxxxxxxxxx%'  
+      OR p.contact_email = 'none'
+      OR p.contact_email = 'unknown'
+      OR p.reminders_sent >=?
+ORDER BY
+      agency_name,program_name
+
 [AGENCY_X_EXPIRED_RECORDS]
    SELECT 
       agency_id, 
@@ -222,6 +322,12 @@
 FROM agency 
 WHERE agency_id = ?
 
+[AGENCY_X_PROGRAM_NAME_AGENCY_NAME_DATE_CREATED]
+SELECT p.program_name, a.agency_name, p.date_created
+FROM agency a, program p 
+WHERE p.agency_id = a.agency_id
+ORDER BY p.date_created;
+
 [AGENCY_X_SEARCH_WITH_TERMS]
 SELECT 
   agency_id, agency_name, agency_alias, address1, address2,
@@ -236,7 +342,7 @@
   hidden=false 
 ORDER BY 
   agency_name
-
+  
 [AGENCY_X_WEBSITE]       
 SELECT
   website 
@@ -282,6 +388,12 @@
 FROM category c, heading_category h 
 WHERE h.category_id = c.category_id
 
+[CATEGORY_PROGRAM_CATEGORY_X_NUMBER_OF_PROGRAMS_UNDER_CATEGORY]
+SELECT c.category_name, count(pc.program_id) AS programs
+FROM category c LEFT OUTER JOIN program_category pc
+ON (c.category_id = pc.category_id)
+GROUP BY c.category_name ORDER BY programs DESC, category_name
+		
 [CATEGORY_PROGRAM_VIEW_HEADING_CATEGORY_X_ID_NAME_COUNT]
 SELECT
   c.category_id, c.category_name, c.program_count
@@ -323,10 +435,35 @@
 WHERE 
    category_id = ?
 
+[CATEGORY_X_EXISTS_ONE_CATEGORY_NAME]
+SELECT EXISTS(
+	SELECT 1 
+	FROM category 
+	WHERE lower(category_name) = ?
+)
+
+[CATEGORY_X_EXISTS_ONE_CATEGORY_NAME_NOT_ID]
+SELECT EXISTS(
+	SELECT 1 
+	FROM category 
+	WHERE lower(category_name) = ?
+	AND category_id <> ?
+)
 [CATEGORY_X_IN_CATEGORY_NAME]
 SELECT category_name 
 FROM category
 
+[CATEGORY_X_ONE_CATEGORY_NAME]
+SELECT 1 
+FROM category 
+WHERE lower(category_name) = ?
+
+[CATEGORY_X_ONE_CATEGORY_NAME_NOT_ID]
+SELECT 1 
+FROM category 
+WHERE lower(category_name) = ?
+AND category_id <> ?
+
 [HEADING_CATEGORY_X_HEADING_NAME]
 SELECT heading_name 
 FROM heading_category 
@@ -340,6 +477,56 @@
 ORDER BY 
 	heading_name
 
+[INFORMATION_SCHEMA_X_ONE]
+SELECT 1 
+FROM information_schema.tables 
+WHERE table_name='version_log' 
+LIMIT 1
+
+[PG_DATABASE_X_DATNAME]
+SELECT 
+     datname 
+FROM 
+     pg_database
+WHERE 
+     datname = ?
+	 
+[PG_ROLES_X_ROLNAME_CREATEROLE_CREATEDB]
+SELECT 
+     rolname,rolcreaterole,rolcreatedb 
+FROM 
+     pg_roles
+WHERE 
+     rolname = ?
+	 
+[PG_ROLES_X_ROLNAME_ROLSUPER]
+SELECT 
+     rolname,rolsuper 
+FROM 
+     pg_roles
+WHERE 
+     rolname = ?
+
+[PG_USER_X_USENAME]
+SELECT 
+     usename 
+FROM 
+     pg_user
+WHERE 
+     usename = ?
+
+[PROGRAM_AGENCY_ID_X_OLDEST_RECORD_DATE]
+SELECT a.agency_name, 
+   min(record_ages.last_updated) AS "Oldest Record (yyyy-mm-dd)" 
+FROM (
+   SELECT agency_id, last_updated from program
+   UNION
+   SELECT agency_id, last_updated from agency 
+) AS record_ages, agency a
+WHERE a.agency_id = record_ages.agency_id
+GROUP BY agency_name 
+ORDER BY "Oldest Record (yyyy-mm-dd)", agency_name
+        
 [PROGRAM_AGENCY_PROGRAM_CATEGORY_X_AGENCY_NAME_ID_PROGRAM_NAME]
 SELECT 
     a.agency_name, p.program_id, p.program_name,
@@ -388,17 +575,44 @@
 WHERE 
  hc.category_id =pc.category_id
  
+[PROGRAM_CATEGORY_X_CATEGORY_ID]
+SELECT category_id 
+FROM program_category 
+WHERE program_id = ?
+			
 [PROGRAM_CATEGORY_X_PROGRAM_ID]
 SELECT program_id 
 FROM program_category 
 WHERE category_id = ?
- 
+
+[PROGRAM_ID_X_PROGRAM_NAME]
+SELECT program_name 
+FROM program 
+WHERE program_id=?
+
+[PROGRAM_LOWER_PROGRAM_NAME_ID_X_COUNT]
+SELECT COUNT(*) 
+FROM program
+WHERE LOWER(program_name) = ?
+AND agency_id = ?
+AND program_id <> ?
+
+[PROGRAM_LOWER_PROGRAM_NAME_X_COUNT]
+SELECT COUNT(*) 
+FROM program
+WHERE LOWER(program_name) = ?
+AND agency_id = ?
+
+[PROGRAM_X_COUNT_ALL]
+SELECT COUNT(*) 
+FROM program 
+WHERE program_id = ?
+
 [PROGRAM_X_DISTINCT_PROGRAM_CONTACT_FIRST_LAST_NAME_EMAIL]
 SELECT DISTINCT contact_first_name, contact_last_name, contact_email 
 FROM program 
 WHERE agency_id = ? 
 AND NOT (contact_first_name = ? AND contact_last_name = ? AND contact_email = ?)
- 
 
 [PROGRAM_X_EXPIRED_RECORDS]
    SELECT 
@@ -458,17 +672,20 @@
 WHERE 
   program_id = ?   
 
-[SYNONYM_STEM_X_CONCAT_SUBMITTED_WORDS]
-SELECT 
-  our_aggregate_concat(submitted_word) 
-AS 
-  submitted_words 
-FROM 
-  synonym_stem 
-GROUP BY 
-  synonym_id 
-ORDER BY
-  submitted_words
+[SEARCH_LOG_X_SEARCHERS_PER_DAY]
+SELECT to_char(search_date, 'Dy, Mon DD, YYYY') as search_date, count FROM 
+(  
+      SELECT date(timestamp) as search_date, count(distinct ip_address) as count
+      FROM search_log 
+      GROUP BY search_date ORDER BY search_date DESC
+) as preformatted_results
+
+[SYNONYM_STEM_X_SUBMITTED_WORDS]
+SELECT our_aggregate_concat(submitted_word) 
+AS submitted_words 
+FROM synonym_stem 
+GROUP BY synonym_id
+ORDER BY submitted_words
 
 [SYNONYM_STEM_X_WORD_STEM]  
 SELECT DISTINCT 
@@ -491,3 +708,7 @@
 SELECT town_state 
 FROM town WHERE display = TRUE 
 ORDER BY town_state
+
+[VERSION_LOG_X_MAX]
+SELECT max(version) 
+FROM version_log

=== modified file 'app-mvhub/t/sql_lib_sanity.t'
--- app-mvhub/t/sql_lib_sanity.t	2010-06-17 18:46:04 +0000
+++ app-mvhub/t/sql_lib_sanity.t	2010-06-28 17:27:29 +0000
@@ -40,13 +40,20 @@
         'AGENCY_HEADING_PROGRAM_X_AGENCY_ID'       => ['103553'],
         'AGENCY_HEADING_PROGRAM_X_AGENCY_ID_EQUAL' => ['103553'],
         'AGENCY_PROGRAM_X_ALL'                     => ['103553'],
+        'AGENCY_PROGRAM_X_AGENCY_NAME'             => [ 103553, 103553 ],
+        'AGENCY_PROGRAM_X_PROGRAM_WITH_MISSING_CONTACT_INFO' => [],
+        'AGENCY_SEARCH_LOG_X_ALL_SEARCHES'                   => [],
         'AGENCY_SEARCH_LOG_X_IF_RECORDED_RECENT_AGENCY_SEARCH_BY_USER' =>
             [ '66.92.77.160.5111109', 'nscap' ],
+        'AGENCY_X_AGENCY_ID'   => [103553],
+        'AGENCY_X_AGENCY_NAME' => [103553],
         'AGENCY_X_AGENCY_NAME_PASSWORD' =>
             [ 'chester@xxxxxxxxxxxxxx', 'chester@xxxxxxxxxxxxxx' ],
-        'AGENCY_X_AUTH_AGENCY'       => [ '103553',     '@lunch4all' ],
-        'AGENCY_X_EXPIRED_RECORDS'   => [ '01-01-2008', 0 ],
-        'AGENCY_X_SEARCH_WITH_TERMS' => [
+        'AGENCY_X_AGENCIES_WITH_MISSING_CONTACT_INFO' => [],
+        'AGENCY_X_AUTH_AGENCY' => [ '103553', '@lunch4all' ],
+        'AGENCY_X_DATE_OF_OLDEST_RECORD' => [ 103553,       103553 ],
+        'AGENCY_X_EXPIRED_RECORDS'       => [ '01-01-2008', 0 ],
+        'AGENCY_X_SEARCH_WITH_TERMS'     => [
             '[[:<:]](ymca|counsel|immi|shelter)[[:>:]]',
             '[[:<:]](ymca|counsel|immi|shelter)[[:>:]]'
         ],
@@ -56,17 +63,30 @@
         'ALIAS_X_ALIAS_NAME'                        => [1],
         'ALL_NAMES_VIEW_CATS_WITH_VISIBLE_PROGRAMS_VIEW_X_ALL_FOR_SYNONYMS' =>
             ['[[:<:]](ymca|counsel|immi|shelter)[[:>:]]'],
-        'CATEGORY_PROGRAM_X_CATEGORY_NAME' => [103553],
+        'CATEGORY_X_EXISTS_ONE_CATEGORY_NAME'        => ['cat'],
+        'CATEGORY_X_EXISTS_ONE_CATEGORY_NAME_NOT_ID' => [ 'cat', 103553 ],
+        'CATEGORY_X_ONE_CATEGORY_NAME'               => ['cat'],
+        'CATEGORY_X_ONE_CATEGORY_NAME_NOT_ID'        => [ 'cat', 103553 ],
+        'CATEGORY_PROGRAM_X_CATEGORY_NAME'           => [103553],
         'CATEGORY_PROGRAM_VIEW_HEADING_CATEGORY_X_ID_NAME_COUNT' =>
             ['Arts/Culture/Entertainment'],
         'CATEGORY_SEARCH_LOG_X_IF_RECORDED_RECENT_CATEGORY_SEARCH_BY_USER' =>
             [ '66.92.77.160.5111109', 'test' ],
-        'CATEGORY_X_CATEGORY_NAME'        => [800363],
-        'HEADING_CATEGORY_X_HEADING_NAME' => [103553],
+        'CATEGORY_X_CATEGORY_NAME'               => [800363],
+        'HEADING_CATEGORY_X_HEADING_NAME'        => [103553],
+        'PG_DATABASE_X_DATNAME'                  => ['dat'],
+        'PG_ROLES_X_ROLNAME_CREATEROLE_CREATEDB' => ['rol'],
+        'PG_ROLES_X_ROLNAME_ROLSUPER'            => ['rolname'],
+        'PG_USER_X_USENAME'                      => ['use'],
         'PROGRAM_AGENCY_PROGRAM_CATEGORY_X_AGENCY_NAME_ID_PROGRAM_NAME' =>
             [800363],
-        'PROGRAM_AGENCY_X_PROGRAM_AGENCY_NAME' => ['103553'],
-        'PROGRAM_CATEGORY_X_PROGRAM_ID'        => ['103553'],
+        'PROGRAM_AGENCY_X_PROGRAM_AGENCY_NAME'  => ['103553'],
+        'PROGRAM_CATEGORY_X_PROGRAM_ID'         => ['103553'],
+        'PROGRAM_CATEGORY_X_CATEGORY_ID'        => [103553],
+        'PROGRAM_ID_X_PROGRAM_NAME'             => [103553],
+        'PROGRAM_LOWER_PROGRAM_NAME_ID_X_COUNT' => [ 'name', 103553, 103553 ],
+        'PROGRAM_LOWER_PROGRAM_NAME_X_COUNT' => [ 'name', 103553 ],
+        'PROGRAM_X_COUNT_ALL'                => [103553],
         'PROGRAM_X_DISTINCT_PROGRAM_CONTACT_FIRST_LAST_NAME_EMAIL' =>
             [ '103553', 'fname', 'lname', 'a@xxxxx' ],
         'PROGRAM_X_EXPIRED_RECORDS' => [ '01-01-2008', 0 ],
@@ -76,7 +96,6 @@
         'PROGRAM_X_WEBSITE'      => [509548],
         'PROGRAM_X_LAST_UPDATED' => [509548],
         'SYNONYM_STEM_X_WORD_STEM' => ['alcohol'],
-
     );
     return \%data;
 }

=== modified file 'lib-mvhub/lib/MVHub/Synonyms.pm'
--- lib-mvhub/lib/MVHub/Synonyms.pm	2010-06-09 15:43:40 +0000
+++ lib-mvhub/lib/MVHub/Synonyms.pm	2010-06-28 17:27:29 +0000
@@ -38,7 +38,8 @@
 sub fetch_synonyms_from_db {
     my $dbh = MVHub::Utils::DB::get_dbh();
     my $sql = MVHub::Utils::DB::get_sql_select_statement(
-        'SYNONYM_STEM_X_CONCAT_SUBMITTED_WORDS');
+        'SYNONYM_STEM_X_SUBMITTED_WORDS');
+
     my $rows_aref = $dbh->selectcol_arrayref($sql);
     foreach ( @{$rows_aref} ) {
         s/,//g;

=== modified file 'lib-mvhub/lib/MVHub/Utils/DB.pm'
--- lib-mvhub/lib/MVHub/Utils/DB.pm	2010-06-10 19:10:03 +0000
+++ lib-mvhub/lib/MVHub/Utils/DB.pm	2010-06-28 17:27:29 +0000
@@ -32,8 +32,6 @@
     select_program_record
     select_records
     select_unique_record
-    translate_agency_name
-    translate_program_name
     update_one_record
 );
 
@@ -95,19 +93,8 @@
     my $username               = shift;
     my $is_data_entry_operator = shift;
 
-    my $sql;
-    if ( $username =~ /^3\d{5,6}$/ ) {
-        $sql = "SELECT first_name, last_name FROM users WHERE user_id=?";
-    }
-    elsif ( $username =~ /^\d{6,7}$/ && $is_data_entry_operator ) {
-        $sql = "SELECT agency_name FROM data_entry_agency WHERE agency_id=?";
-    }
-    elsif ( $username =~ /^\d{6,7}$/ ) {
-        $sql = "SELECT agency_name FROM agency WHERE agency_id=?";
-    }
-    else {
-        $sql = "SELECT first_name, last_name FROM users WHERE username=?";
-    }
+    my $sql
+        = MVHub::Utils::DB::get_sql_select_statement('AGENCY_X_AGENCY_NAME');
 
     my ( $first_name, $last_name )
         = $dbh->selectrow_array( $sql, undef, $username );
@@ -120,9 +107,10 @@
 sub get_hash_of_agencies {
     my $dbh = shift;
 
-    my $stmt
-        = "SELECT agency_id,agency_name from agency order by agency_name";
-    my $aref = $dbh->selectcol_arrayref( $stmt, { Columns => [ 1, 2 ] } );
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'AGENCY_X_AGENCY_ID_NAME');
+
+    my $aref = $dbh->selectcol_arrayref( $sql, { Columns => [ 1, 2 ] } );
     my %agency_hash = @$aref;
     return %agency_hash;
 }
@@ -150,7 +138,8 @@
     my $dbh        = shift;
     my $program_id = shift;
 
-    my $sql = "SELECT program_name FROM program WHERE program_id=?";
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'PROGRAM_ID_X_PROGRAM_NAME');
 
     my ($program_name) = $dbh->selectrow_array( $sql, undef, $program_id );
     return $program_name;
@@ -293,9 +282,12 @@
     my $agency_id          = $args{agency_id};
     my $allow_empty_result = $args{allow_empty_result};
 
-    my $stmt
-        = "SELECT * FROM agency WHERE agency_id = " . $dbh->quote($agency_id);
-    my $records_aref = $dbh->selectall_arrayref( $stmt, { Slice => {} } );
+    my @bind_variables = ($agency_id);
+    my $sql
+        = MVHub::Utils::DB::get_sql_select_statement('AGENCY_X_AGENCY_ID');
+
+    my $records_aref
+        = $dbh->selectall_arrayref( $sql, { Slice => {} }, @bind_variables );
 
     return if ( @$records_aref == 0 && $allow_empty_result );
     MVHub::Utils::assert(
@@ -418,33 +410,6 @@
     return $records_aref->[0];
 }
 
-# Takes an agency name, returns an agency id
-sub translate_agency_name {
-    my $dbh         = shift;
-    my $agency_name = shift;
-
-    my $sql
-        = "SELECT DISTINCT on (agency_id) agency_id FROM data_entry_agency WHERE agency_name = ?";
-    my $agency_id_href
-        = $dbh->selectrow_hashref( $sql, { Slice => {} }, $agency_name );
-
-    return $agency_id_href->{agency_id};
-}
-
-# Takes an agency id and an program name, returns a program name
-sub translate_program_name {
-    my $dbh          = shift;
-    my $agency_id    = shift;
-    my $program_name = shift;
-
-    my $sql
-        = "SELECT DISTINCT on (program_id) program_id FROM data_entry_program WHERE agency_id = ? AND program_name = ?";
-    my $program_id_href = $dbh->selectrow_hashref( $sql, { Slice => {} },
-        $agency_id, $program_name );
-
-    return $program_id_href->{program_id};
-}
-
 # Update a unique record in the given database table.
 # Arguments:
 #    dbh - a database handle.
@@ -633,14 +598,6 @@
  
  TODO
  
-=head2 translate_agency_name
- 
- TODO
- 
-=head2 translate_program_name
- 
- TODO
- 
 =head2 update_one_record
  
  TODO

=== modified file 'lib-mvhub/lib/MVHub/Utils/Setup.pm'
--- lib-mvhub/lib/MVHub/Utils/Setup.pm	2010-06-25 14:51:40 +0000
+++ lib-mvhub/lib/MVHub/Utils/Setup.pm	2010-06-28 17:27:29 +0000
@@ -122,14 +122,8 @@
         { type => SCALAR },
     );
 
-    my $sql = <<"SQL";
-SELECT 
-     datname 
-FROM 
-     pg_database
-WHERE 
-     datname = ?
-SQL
+    my $sql
+        = MVHub::Utils::DB::get_sql_select_statement('PG_DATABASE_X_DATNAME');
 
     my $matching_dbs_aref = $dbh->selectall_arrayref( $sql, {}, ($db_name) );
     return scalar @$matching_dbs_aref;
@@ -143,14 +137,7 @@
         { type => SCALAR },
     );
 
-    my $sql = <<"SQL";
-SELECT 
-     usename 
-FROM 
-     pg_user
-WHERE 
-     usename = ?
-SQL
+    my $sql = MVHub::Utils::DB::get_sql_select_statement('PG_USER_X_USENAME');
 
     my $matching_db_users_aref
         = $dbh->selectall_arrayref( $sql, {}, ($username) );
@@ -164,14 +151,8 @@
         { type => SCALAR },
     );
 
-    my $sql = <<"SQL";
-SELECT 
-     rolname,rolcreaterole,rolcreatedb 
-FROM 
-     pg_roles
-WHERE 
-     rolname = ?
-SQL
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'PG_ROLES_X_ROLNAME_CREATEROLE_CREATEDB');
 
     my $role_rows_aref
         = $dbh->selectall_arrayref( $sql, { Slice => {} }, ($username) );
@@ -188,14 +169,8 @@
         { type => SCALAR },
     );
 
-    my $sql = <<"SQL";
-SELECT 
-     rolname,rolsuper 
-FROM 
-     pg_roles
-WHERE 
-     rolname = ?
-SQL
+    my $sql = MVHub::Utils::DB::get_sql_select_statement(
+        'PG_ROLES_X_ROLNAME_ROLSUPER');
 
     my $role_rows_aref
         = $dbh->selectall_arrayref( $sql, { Slice => {} }, ($username) );
@@ -429,12 +404,15 @@
 
     my $version;
 
-    my $exist_sql
-        = "SELECT 1 FROM information_schema.tables WHERE table_name='version_log' LIMIT 1";
+    my $exist_sql = MVHub::Utils::DB::get_sql_select_statement(
+        'INFORMATION_SCHEMA_X_ONE');
+
     my $table_exists = ( $dbh->selectrow_array($exist_sql) )[0];
 
     if ($table_exists) {
-        my $sql = "SELECT max(version) FROM version_log;";
+        my $sql
+            = MVHub::Utils::DB::get_sql_select_statement('VERSION_LOG_X_MAX');
+
         $version = ( $dbh->selectrow_array($sql) )[0];
     }
     else {


Follow ups