From 9badeafbed1ca44d9c8a9c2cad6ac1a705fa234b Mon Sep 17 00:00:00 2001
From: Dan Poltawski <dan.poltawski@lancaster.ac.uk>
Date: Thu, 21 May 2009 11:33:06 +0100
Subject: [PATCH] CONTRIB-1276 - ugly database query optimisaiton

Use this single query so we don't have to run one on every
questionnaire reponse type. Ugly, but non-disruptive
---
 locallib.php |   39 +++++++++++++++++++++++++++++++--------
 1 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/locallib.php b/locallib.php
index 3d71e02..2e75e6e 100755
--- a/locallib.php
+++ b/locallib.php
@@ -1479,11 +1479,34 @@ class questionnaire {
             $col = ',' . implode(',', array_map(create_function('$a','return "q.$a";'), $col));
         }
 
+        // This is pretty ugly optimisation to stop us running sql on every
+        // response type for every response 
+        $allresponses_sql = "SELECT
+            count(r.id) as recordid,
+            count(bool.id) as bool,
+            count(single.id) as single,
+            count(multiple.id) as multiple,
+            count(other.id) as other,
+            count(rank.id) as rank,
+            count(text.id) as text,
+            count(date.id) as date
+            FROM {$CFG->prefix}questionnaire_response r
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_bool bool ON bool.response_id = r.id
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_resp_single single ON single.response_id = r.id
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_resp_multiple multiple ON multiple.response_id = r.id
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_other other ON other.response_id = r.id
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_rank rank ON rank.response_id = r.id
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_text text ON text.response_id = r.id
+            LEFT OUTER JOIN {$CFG->prefix}questionnaire_response_date date ON date.response_id = r.id
+            WHERE r.id = $rid";
+
+        $responseexists = get_record_sql($allresponses_sql);
+
         // --------------------- response_bool (yes/no)---------------------
         $sql = 'SELECT q.id '.$col.', a.choice_id '.
                'FROM '.$CFG->prefix.'questionnaire_response_bool a, '.$CFG->prefix.'questionnaire_question q '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->bool && $records = get_records_sql($sql)) {
             foreach ($records as $qid => $row) {
                 $choice = $row->choice_id;
                 if (isset ($row->name) && $row->name == '') {
@@ -1512,7 +1535,7 @@ class questionnaire {
                        $CFG->prefix.'questionnaire_question q, '.
                        $CFG->prefix.'questionnaire_quest_choice c '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id AND a.choice_id=c.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->single && $records = get_records_sql($sql)) {
             foreach ($records as $qid => $row) {
                 $cid = $row->cid;
                 $qtype = $row->q_type;
@@ -1573,7 +1596,7 @@ class questionnaire {
         if ($csvexport) {
                 $tmp = null;
 
-                if ($records = get_records_sql($sql)) {
+                if ($responseexists->multiple && $records = get_records_sql($sql)) {
                     $qids2 = array();
                     $oldqid = '';
                     foreach ($records as $qid => $row) {
@@ -1648,7 +1671,7 @@ class questionnaire {
         } else {
                 $arr = array();
                 $tmp = null;
-                if ($records = get_records_sql($sql)) {
+                if ($responseexists->multiple && $records = get_records_sql($sql)) {
                     foreach ($records as $aid => $row) {
                         $qid = $row->qid;
                         $cid = $row->cid;
@@ -1695,7 +1718,7 @@ class questionnaire {
                        $CFG->prefix.'questionnaire_quest_choice c '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id AND a.choice_id=c.id '.
                'ORDER BY a.question_id,c.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->other && $records = get_records_sql($sql)) {
             foreach ($records as $record) {
                 $newrow = array();
                 $position = $record->position;
@@ -1730,7 +1753,7 @@ class questionnaire {
                        $CFG->prefix.'questionnaire_quest_choice c '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id AND a.choice_id=c.id '.
                'ORDER BY aid, a.question_id,c.id';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->rank && $records = get_records_sql($sql)) {
             foreach ($records as $row) {
                 /// Next two are 'qid' and 'cid', each with numeric and hash keys.
                 $osgood = false;
@@ -1782,7 +1805,7 @@ class questionnaire {
         $sql = 'SELECT q.id '.$col.',a.response as aresponse '.
                'FROM '.$CFG->prefix.'questionnaire_response_text a, '.$CFG->prefix.'questionnaire_question q '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->text && $records = get_records_sql($sql)) {
             foreach ($records as $qid => $row) {
                 unset($row->id);
                 $row = (array)$row;
@@ -1802,7 +1825,7 @@ class questionnaire {
         $sql = 'SELECT q.id '.$col.',a.response as aresponse '.
                'FROM '.$CFG->prefix.'questionnaire_response_date a, '.$CFG->prefix.'questionnaire_question q '.
                'WHERE a.response_id=\''.$rid.'\' AND a.question_id=q.id ';
-        if ($records = get_records_sql($sql)) {
+        if ($responseexists->date && $records = get_records_sql($sql)) {
             $dateformat = get_string('strfdate', 'questionnaire');
             foreach ($records as $qid => $row) {
                 unset ($row->id);
-- 
1.6.2.4

