Attempt to speed up more cent group computation on account landing page, also discards item_impressions sooner, a=chris

Chris Pollett [2022-07-12 22:Jul:th]
Attempt to speed up more cent group computation on account landing page, also discards item_impressions sooner, a=chris
Filename
src/controllers/components/AccountaccessComponent.php
src/models/ImpressionModel.php
diff --git a/src/controllers/components/AccountaccessComponent.php b/src/controllers/components/AccountaccessComponent.php
index f639d3c29..a8e12a991 100644
--- a/src/controllers/components/AccountaccessComponent.php
+++ b/src/controllers/components/AccountaccessComponent.php
@@ -172,13 +172,19 @@ class AccountaccessComponent extends Component
         $data['GROUPS'] = [];
         $i = 0;
         $len = strlen(C\PERSONAL_GROUP_PREFIX);
+        $group_ids = [];
+        foreach ($groups as $group) {
+            $group_ids[] = $group['GROUP_ID'];
+        }
+        $most_recent_views = $impression_model->mostRecentGroupViews($user_id,
+            $group_ids);
         foreach ($groups as $group) {
             $group_id = $group['GROUP_ID'];
             $data['GROUPS'][$i] = $group;
             $data['GROUPS'][$i]['MEMBER_STATUS'] =
                 $data['GROUPS'][$i]['STATUS'];
             $data['GROUPS'][$i]["MOST_RECENT_VIEW"] =
-                $impression_model->mostRecentGroupView($user_id, $group_id);
+                $most_recent_views[$group_id] ?? 0;
             $item = $group_model->getMostRecentGroupPost($group_id);
             $data['GROUPS'][$i]['NUM_POSTS'] =
                 $group_model->getGroupPostCount($group_id);
diff --git a/src/models/ImpressionModel.php b/src/models/ImpressionModel.php
index 15c087122..14d82fe06 100644
--- a/src/models/ImpressionModel.php
+++ b/src/models/ImpressionModel.php
@@ -155,19 +155,35 @@ class ImpressionModel extends Model
         $rows = array_values(array_filter($rows));
         return $rows;
     }
-    public function mostRecentGroupView($user_id, $group_id)
+    /**
+     * @param int $user_id
+     * @param array $group_ids
+     */
+    public function mostRecentGroupViews($user_id, $group_ids)
     {
         $db = $this->db;
-        $sql = "SELECT MAX(VIEW_DATE) AS MOST_RECENT " .
+        $in_clause = " (";
+        $comma = "";
+        foreach ($group_ids as $group_id) {
+            $in_clause .= $comma . intval($group_id);
+            $comma = ",";
+        }
+        $in_clause .= ") ";
+        $sql = "SELECT ITEM_ID AS GROUP_ID, MAX(VIEW_DATE) AS MOST_RECENT " .
             "FROM ITEM_IMPRESSION " .
             "WHERE USER_ID = ? AND ITEM_TYPE = " . C\GROUP_IMPRESSION .
-            " AND ITEM_ID = ?  ";
-        $result = $db->execute($sql, [$user_id, $group_id]);
+            " AND ITEM_ID IN $in_clause GROUP BY ITEM_ID";
+        $result = $db->execute($sql, [$user_id]);
         if (!$result) {
-            return -1;
+            return [];
         }
-        $row = $db->fetchArray($result);
-        return $row["MOST_RECENT"] ?? -1;
+        $group_views = [];
+        while ($row = $db->fetchArray($result)) {
+            if (!empty($row["GROUP_ID"]) && $row["MOST_RECENT"]) {
+                $group_views[$row["GROUP_ID"]] = $row["MOST_RECENT"];
+            }
+        }
+        return $group_views;
     }
     /**
      * Used by Analytics job to aggregate impression raw data to make
@@ -207,10 +223,10 @@ class ImpressionModel extends Model
         }
         // delete user data older than one year
         $sql = "DELETE FROM ITEM_IMPRESSION WHERE VIEW_DATE < ?";
-        $db->execute($sql, [$timestamp]);
+        $db->execute($sql, [$timestamps[C\ONE_DAY]]);
         $sql = "DELETE FROM ITEM_IMPRESSION_SUMMARY WHERE UPDATE_TIMESTAMP < ?".
             " AND UPDATE_PERIOD > ". C\FOREVER;
-        $db->execute($sql, [$timestamp]);
+        $db->execute($sql, [$timestamps[C\ONE_YEAR]]);
     }
     /**
      * Used to return an array of impression statistics for a particular update
ViewGit