Procházet zdrojové kódy

#4368 Accounts: remake grid query for performance

Alex Trofimov před 3 roky
rodič
revize
9b88268b4f

+ 7 - 1
inc/classes/BxDolSessionQuery.php

@@ -83,7 +83,13 @@ class BxDolSessionQuery extends BxDolDb
         if ($iDate > 0)
         if ($iDate > 0)
             BxDolAccountQuery::getInstance()->_updateField($iId, 'active', $iDate);
             BxDolAccountQuery::getInstance()->_updateField($iId, 'active', $iDate);
     }
     }
-    
+
+    function getLastActivityAccount($iUserId)
+    {
+        $sSql = $this->prepare("SELECT `date` FROM `" . $this->sTable . "` WHERE `user_id`=? LIMIT 1", $iUserId);
+        return $this->getOne($sSql);
+    }
+
     function getOldSession($iUserId) {
     function getOldSession($iUserId) {
         $sSql = $this->prepare("SELECT `id` FROM `" . $this->sTable . "` WHERE `user_id`=? LIMIT 1", $iUserId);
         $sSql = $this->prepare("SELECT `id` FROM `" . $this->sTable . "` WHERE `user_id`=? LIMIT 1", $iUserId);
         $sSession = $this->getOne($sSql);
         $sSession = $this->getOne($sSql);

+ 3 - 9
modules/boonex/accounts/classes/BxAccntGridAdministration.php

@@ -84,14 +84,6 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
         return parent::_getDataSqlInner($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
         return parent::_getDataSqlInner($sFilter, $sOrderField, $sOrderDir, $iStart, $iPerPage);
     }
     }
     
     
-    protected function _getDataSqlOrderClause ($sOrderByFilter, $sOrderField, $sOrderDir, $bFieldsOnly = false)
-    {
-        $sQuery = " GROUP BY `ta`.`id`";
-        $sQuery .= parent::_getDataSqlOrderClause ($sOrderByFilter, $sOrderField, $sOrderDir, $bFieldsOnly);
-       
-        return $sQuery;
-    }
-    
     protected function _getFilterControls()
     protected function _getFilterControls()
     {
     {
         parent::_getFilterControls();
         parent::_getFilterControls();
@@ -621,7 +613,9 @@ class BxAccntGridAdministration extends BxBaseModProfileGridAdministration
     
     
     protected function _getCellLastActive($mixedValue, $sKey, $aField, $aRow)
     protected function _getCellLastActive($mixedValue, $sKey, $aField, $aRow)
     {
     {
-        $mixedValue = !empty($mixedValue) ? bx_time_js($mixedValue) : _t('_sys_not_available');
+        $iSessionDate = (new BxDolSessionQuery())->getLastActivityAccount($aRow['id']);
+        $iTs = max($iSessionDate, $aRow['active']);
+        $mixedValue = $iTs ? bx_time_js($iTs) : _t('_sys_not_available');
 
 
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
         return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
     } 
     } 

+ 1 - 1
modules/boonex/accounts/install/sql/enable.sql

@@ -81,7 +81,7 @@ INSERT INTO `sys_acl_matrix` (`IDLevel`, `IDAction`) VALUES
 
 
 -- GRIDS: administration
 -- GRIDS: administration
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `show_total_count`, `override_class_name`, `override_class_file`) VALUES
 INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `show_total_count`, `override_class_name`, `override_class_file`) VALUES
-('bx_accounts_administration', 'Sql', 'SELECT `ta`.*, `tp`.`status` AS `status`, MAX(IFNULL(`ts`.`date`, `ta`.`active`)) AS `last_active` FROM `sys_accounts` AS `ta` LEFT JOIN `sys_profiles` AS `tp` ON `ta`.`id`=`tp`.`account_id` AND `tp`.`type`=''system'' LEFT JOIN `sys_sessions` AS `ts` ON `ts`.`user_id` = `ta`.`id` WHERE 1 ', 'sys_accounts', 'id', 'logged', 'status', '', 20, NULL, 'start', '', 'name,email,ip,phone', '', 'like', 'email_confirmed,logged,added,last_active', '', 192, 1, 'BxAccntGridAdministration', 'modules/boonex/accounts/classes/BxAccntGridAdministration.php');
+('bx_accounts_administration', 'Sql', 'SELECT `ta`.*, `tp`.`status` AS `status`, `ta`.`active` FROM `sys_accounts` AS `ta` LEFT JOIN `sys_profiles` AS `tp` ON `ta`.`id`=`tp`.`account_id` AND `tp`.`type`=''system'' WHERE 1 ', 'sys_accounts', 'id', 'logged', 'status', '', 20, NULL, 'start', '', 'name,email,ip,phone', '', 'like', 'email_confirmed,logged,added', '', 192, 1, 'BxAccntGridAdministration', 'modules/boonex/accounts/classes/BxAccntGridAdministration.php');
 
 
 INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
 INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
 ('bx_accounts_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),
 ('bx_accounts_administration', 'checkbox', '_sys_select', '2%', 0, '', '', 1),