MDL-59774 analytics: Fix sql_compare_text usage
authorDavid Monllao <david.monllao@gmail.com>
Wed, 9 Aug 2017 06:55:19 +0000 (08:55 +0200)
committerDavid Monllao <davidm@moodle.com>
Mon, 14 Aug 2017 05:56:06 +0000 (07:56 +0200)
Replace a distinct + join by an exists, which suits better what we need to do.

analytics/classes/manager.php

index 581f917..80f80cd 100644 (file)
@@ -84,15 +84,9 @@ class manager {
 
         $params = array();
 
-        $fields = 'am.id, am.enabled, am.trained, am.target, ' . $DB->sql_compare_text('am.indicators') .
-            ', am.timesplitting, am.version, am.timecreated, am.timemodified, am.usermodified';
-        $sql = "SELECT DISTINCT $fields FROM {analytics_models} am";
-        if ($predictioncontext) {
-            $sql .= " JOIN {analytics_predictions} ap ON ap.modelid = am.id AND ap.contextid = :contextid";
-            $params['contextid'] = $predictioncontext->id;
-        }
+        $sql = "SELECT am.* FROM {analytics_models} am";
 
-        if ($enabled || $trained) {
+        if ($enabled || $trained || $predictioncontext) {
             $conditions = [];
             if ($enabled) {
                 $conditions[] = 'am.enabled = :enabled';
@@ -102,6 +96,10 @@ class manager {
                 $conditions[] = 'am.trained = :trained';
                 $params['trained'] = 1;
             }
+            if ($predictioncontext) {
+                $conditions[] = "EXISTS (SELECT 'x' FROM {analytics_predictions} ap WHERE ap.modelid = am.id AND ap.contextid = :contextid)";
+                $params['contextid'] = $predictioncontext->id;
+            }
             $sql .= ' WHERE ' . implode(' AND ', $conditions);
         }
         $sql .= ' ORDER BY am.enabled DESC, am.timemodified DESC';