diff --git a/lib/classes/Session/Logger.php b/lib/classes/Session/Logger.php index d65353bbb3..b3495cffdf 100644 --- a/lib/classes/Session/Logger.php +++ b/lib/classes/Session/Logger.php @@ -111,12 +111,14 @@ class Session_Logger } } + $conn = $databox->get_connection(); + $sql = "INSERT INTO log - (id, date,sit_session, user, site, usrid,coll_list, nav, + (id, date,sit_session, user, site, usrid, nav, version, os, res, ip, user_agent,appli, fonction, societe, activite, pays) VALUES - (null,now() , :ses_id, :usr_login, :site_id, :usr_id, :coll_list + (null,now() , :ses_id, :usr_login, :site_id, :usr_id , :browser, :browser_version, :platform, :screen, :ip , :user_agent, :appli, :fonction, :company, :activity, :country)"; @@ -125,7 +127,6 @@ class Session_Logger ':usr_login' => $app['phraseanet.user'] ? $app['phraseanet.user']->get_login() : null, ':site_id' => $app['phraseanet.registry']->get('GV_sit'), ':usr_id' => $app['phraseanet.user'] ? $app['phraseanet.user']->get_id() : null, - ':coll_list' => implode(',', $colls), ':browser' => $browser->getBrowser(), ':browser_version' => $browser->getExtendedVersion(), ':platform' => $browser->getPlatform(), @@ -139,12 +140,24 @@ class Session_Logger ':country' => $app['phraseanet.user'] ? $app['phraseanet.user']->get_country() : null ); - $stmt = $databox->get_connection()->prepare($sql); + $stmt = $conn->prepare($sql); $stmt->execute($params); - - $log_id = $databox->get_connection()->lastInsertId(); + $log_id = $conn->lastInsertId(); $stmt->closeCursor(); + $sql = "INSERT INTO log_colls (id, log_id, coll_id) VALUES (null, :log_id, :coll_id)"; + $stmt = $conn->prepare($sql); + + foreach ($colls as $collId) { + $stmt->execute(array( + ':log_id' => $log_id, + ':coll_id' => $collId + )); + } + + $stmt->closeCursor(); + unset($stmt, $conn); + return new Session_Logger($app, $databox, $log_id); } diff --git a/lib/classes/module/report/activity.php b/lib/classes/module/report/activity.php index f0a1d84d8d..1a5108242b 100644 --- a/lib/classes/module/report/activity.php +++ b/lib/classes/module/report/activity.php @@ -113,9 +113,10 @@ class module_report_activity extends module_report $sql = " SELECT DATE_FORMAT( log.date, '%k' ) AS heures, SUM(1) AS nb - FROM log - WHERE (" . $date_filter['sql'] . ") - AND (" . $coll_filter['sql'] . ") + FROM (log) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + WHERE " . $date_filter['sql'] . " + AND " . $coll_filter['sql'] . " AND " . $site_filter['sql'] . " GROUP BY heures ORDER BY heures ASC"; @@ -177,11 +178,13 @@ class module_report_activity extends module_report $sql = " SELECT DATE_FORMAT(log_search.date,'%Y-%m-%d %H:%i:%S') as date , log_search.search ,log_search.results - FROM (log_search inner join log on log.id = log_search.log_id) + FROM (log_search) + INNER JOIN log ON (log.id = log_search.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE log_search.date > " . $date_filter['sql'] . " AND log.`" . $what . "` = :main_value AND " . $site_filter['sql'] . " - AND (" . $coll_filter['sql'] . ") + AND " . $coll_filter['sql'] . " ORDER BY date"; $stmt = $conn->prepare($sql); @@ -240,7 +243,9 @@ class module_report_activity extends module_report SELECT TRIM(log_search.search) as search, SUM(1) as nb, ROUND(avg(results)) as nb_rep - FROM (log_search inner join log on log_search.log_id = log.id) + FROM (log_search) + INNER JOIN log ON (log_search.log_id = log.id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE " . $date_filter['sql'] . " AND log_search.search != 'all' AND (" . $coll_filter['sql'] . ")"; @@ -309,8 +314,10 @@ class module_report_activity extends module_report $sql = " SELECT log_docs.record_id, log_docs.date, log_docs.final as objets - FROM (`log_docs` inner join log on log_docs.log_id = log.id - inner join record on log_docs.record_id = record.record_id) + FROM (`log_docs`) + INNER JOIN log ON (log_docs.log_id = log.id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (log_docs.record_id = record.record_id) WHERE log_docs.action = 'download' AND " . $date_filter['sql'] . " AND " . $user_filter['sql'] . " @@ -384,13 +391,11 @@ class module_report_activity extends module_report log_docs.date AS ddate, final - FROM ( - log_docs - INNER JOIN record ON record.record_id = log_docs.record_id - INNER JOIN log ON " . $site_filter['sql'] . " - AND log.id = log_docs.log_id - LEFT JOIN subdef AS s ON s.record_id = log_docs.record_id - AND s.name = log_docs.final) + FROM (log_docs) + INNER JOIN record ON (record.record_id = log_docs.record_id) + INNER JOIN log ON (" . $site_filter['sql'] . " AND log.id = log_docs.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + LEFT JOIN subdef AS s ON (s.record_id = log_docs.record_id AND s.name = log_docs.final) WHERE " . $date_filter['sql'] . " AND (log_docs.final != 'caption') AND log_docs.action = 'download' @@ -472,18 +477,20 @@ class module_report_activity extends module_report $conn = $s->getConnBas(); $params = array(); + $date_filter = $filter->getDateFilter(); $params = array_merge($params, $date_filter['params']); + $coll_filter = $filter->getCollectionFilter(); $params = array_merge($params, $coll_filter['params']); $site_filter = $filter->getGvSitFilter(); $params = array_merge($params, $site_filter['params']); - $this->req = " SELECT DISTINCT(log." . $on . ") as " . $on . ", usrid, SUM(1) as connexion - FROM log + FROM (log) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE log.user != 'API' AND " . $site_filter['sql'] . " AND " . $date_filter['sql'] . " @@ -581,14 +588,15 @@ class module_report_activity extends module_report TRIM(" . $on . ") as " . $on . ", final, sum(1) as nb, sum(size) as poid - FROM (log_docs as d - INNER JOIN log ON " . $site_filter['sql'] . " - AND log.id = d.log_id - AND " . $date_filter['sql'] . " - INNER JOIN record ON record.record_id = d.record_id - LEFT JOIN subdef as s on (d.action = 'download' OR d.action = 'mail') - AND s.record_id=d.record_id and s.name=d.final - ) + FROM (log_docs as d) + INNER JOIN log ON (" . $site_filter['sql'] . " + AND log.id = d.log_id + AND " . $date_filter['sql'] . ") + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON record.record_id = d.record_id + LEFT JOIN subdef as s on ((d.action = 'download' OR d.action = 'mail') + AND s.record_id=d.record_id and s.name=d.final + ) WHERE (" . $coll_filter['sql'] . ") AND (" . $record_filter['sql'] . ") GROUP BY " . $on . ", final, usrid @@ -703,15 +711,14 @@ class module_report_activity extends module_report $sql = " SELECT log.usrid, log.user , d.final as getter, d.record_id, d.date, s.* - FROM (log_docs as d - INNER JOIN log ON (" . $site_filter['sql'] . " - AND log.id = d.log_id - AND " . $date_filter['sql'] . ") - INNER JOIN record ON (record.record_id = d.record_id) - LEFT JOIN subdef as s ON (s.record_id=d.record_id and s.name='document')) - WHERE ((" . $coll_filter['sql'] . ") - AND " . $record_filter['sql'] . " - AND d.action='push') + FROM (log_docs as d) + INNER JOIN log ON (" . $site_filter['sql'] . " + AND log.id = d.log_id + AND " . $date_filter['sql'] . ") + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (record.record_id = d.record_id) + LEFT JOIN subdef as s ON (s.record_id=d.record_id and s.name='document') + WHERE ((" . $coll_filter['sql'] . ") AND " . $record_filter['sql'] . " AND d.action='push') "; $stmt = $conn->prepare($sql); @@ -773,14 +780,15 @@ class module_report_activity extends module_report $sql = " SELECT log.usrid, user, final, sum(1) AS nb, sum(size) AS poid - FROM (log_docs AS log_date - INNER JOIN log ON log.site = :site_id - AND log.id = log_date.log_id - AND " . $datefilter['sql'] . ") - LEFT JOIN subdef AS s ON log_date.action = 'download' - AND s.record_id = log_date.record_id - AND s.name = log_date.final - AND (" . $collfilter['sql'] . ") + FROM (log_docs AS log_date) + INNER JOIN log ON (log.site = :site_id + AND log.id = log_date.log_id + AND " . $datefilter['sql'] . ") + INNER JOIN log_colls ON (log.id = log_colls.log_id) + LEFT JOIN subdef AS s ON (log_date.action = 'download' + AND s.record_id = log_date.record_id + AND s.name = log_date.final + AND (" . $collfilter['sql'] . ")) GROUP BY user, final WITH rollup"; @@ -848,7 +856,8 @@ class module_report_activity extends module_report $sql = " SELECT log_date.id, HOUR(log_date.date) as heures - FROM log as log_date + FROM (log as log_date) + INNER JOIN log_colls ON (log_date.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND (" . $collfilter['sql'] . ") AND log_date.site = :site_id"; @@ -890,7 +899,7 @@ class module_report_activity extends module_report SELECT DISTINCT ( DATE_FORMAT( log_date.date, '%Y-%m-%d' ) ) AS ddate, COUNT( DATE_FORMAT( log_date.date, '%d' ) ) AS activity - FROM log as log_date + FROM log as log_date INNER JOIN log_colls ON (log_date.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND log_date.site = :site_id AND (" . $collfilter['sql'] . ") @@ -928,9 +937,9 @@ class module_report_activity extends module_report $sql = " SELECT log_date.usrid, log_date.user, sum(1) AS nb - FROM `log_search` - INNER JOIN log as log_date - ON log_search.log_id = log_date.id + FROM (`log_search`) + INNER JOIN log as log_date ON (log_search.log_id = log_date.id) + INNER JOIN log_colls ON (log_date.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND log_date.site = :site_id AND (" . $collfilter['sql'] . ") @@ -969,9 +978,9 @@ class module_report_activity extends module_report log_date.usrid, log_date.user, sum(1) AS nb - FROM `log_search` - INNER JOIN log as log_date - ON log_search.log_id = log_date.id + FROM (`log_search`) + INNER JOIN log as log_date ON (log_search.log_id = log_date.id) + INNER JOIN log_colls ON (log_date.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND log_date.site = :site_id AND (" . $collfilter['sql'] . ") @@ -1007,9 +1016,9 @@ class module_report_activity extends module_report $sql = " SELECT referrer, COUNT(referrer) as nb_view - FROM log_view - INNER JOIN log as log_date - ON log_view.log_id = log_date.id + FROM (log_view) + INNER JOIN log as log_date ON (log_view.log_id = log_date.id) + INNER JOIN log_colls ON (log_date.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND (" . $collfilter['sql'] . ") GROUP BY referrer @@ -1049,9 +1058,9 @@ class module_report_activity extends module_report SELECT DISTINCT ( DATE_FORMAT( log_date.date, '%Y-%m-%d' ) ) AS ddate, COUNT( DATE_FORMAT( log_date.date, '%d' ) ) AS activity - FROM log_docs as log_date - INNER JOIN log - ON log_date.log_id = log.id + FROM (log_docs as log_date) + INNER JOIN log ON (log_date.log_id = log.id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND log_date.action = 'add' AND (" . $collfilter['sql'] . ") GROUP BY ddate @@ -1083,9 +1092,9 @@ class module_report_activity extends module_report SELECT DISTINCT ( DATE_FORMAT( log_date.date, '%Y-%m-%d' ) ) AS ddate, COUNT( DATE_FORMAT( log_date.date, '%d' ) ) AS activity - FROM log_docs as log_date - INNER JOIN log - ON log_date.log_id = log.id + FROM (log_docs as log_date) + INNER JOIN log ON log_date.log_id = log.id + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND log_date.action = 'edit' AND (" . $collfilter['sql'] . ") GROUP BY ddate @@ -1116,8 +1125,9 @@ class module_report_activity extends module_report $sql = " SELECT log.usrid, log.user, sum( 1 ) AS nb - FROM log_docs as log_date - INNER JOIN log ON log_date.log_id = log.id + FROM (log_docs as log_date) + INNER JOIN log ON (log_date.log_id = log.id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE " . $datefilter['sql'] . " AND log_date.action = 'add' AND (" . $collfilter['sql'] . ") GROUP BY log.usrid diff --git a/lib/classes/module/report/connexion.php b/lib/classes/module/report/connexion.php index 46a3ef5907..20502e70ed 100644 --- a/lib/classes/module/report/connexion.php +++ b/lib/classes/module/report/connexion.php @@ -29,7 +29,6 @@ class module_report_connexion extends module_report , 'fonction' => 'log.fonction' , 'site' => 'log.site' , 'sit_session' => 'log.sit_session' - , 'coll_list' => 'log.coll_list' , 'appli' => 'log.appli' , 'ip' => 'log.ip' ); @@ -115,18 +114,7 @@ class module_report_connexion extends module_report continue; } - if ($value == 'coll_list') { - $coll = explode(",", $row[$value]); - $this->result[$i][$value] = ""; - foreach ($coll as $id) { - if ($this->result[$i][$value] != "") { - $this->result[$i][$value].= " / "; - $this->result[$i][$value] .= phrasea::bas_names(phrasea::baseFromColl($this->sbas_id, $id, $this->app), $this->app); - } elseif ($this->result[$i][$value] == "") { - $this->result[$i][$value] = phrasea::bas_names(phrasea::baseFromColl($this->sbas_id, $id, $this->app), $this->app); - } - } - } elseif ($value == 'appli') { + if ($value == 'appli') { $applis = false; if (($applis = @unserialize($row[$value])) !== false) { if (empty($applis)) { @@ -164,7 +152,8 @@ class module_report_connexion extends module_report $finalfilter .= 'log_date.site = :site_id'; $sql = "SELECT COUNT(usrid) as nb - FROM log as log_date + FROM (log as log_date) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE " . $finalfilter; $stmt = $conn->prepare($sql); diff --git a/lib/classes/module/report/dashboard/group.php b/lib/classes/module/report/dashboard/group.php index e4af08f937..fde86f1a99 100644 --- a/lib/classes/module/report/dashboard/group.php +++ b/lib/classes/module/report/dashboard/group.php @@ -55,7 +55,7 @@ class module_report_dashboard_group implements module_report_dashboard_component } } } else { - throw new Exception("cannot group on a none dashboard object"); + continue; } } } diff --git a/lib/classes/module/report/download.php b/lib/classes/module/report/download.php index 0dc748a326..6631d36428 100644 --- a/lib/classes/module/report/download.php +++ b/lib/classes/module/report/download.php @@ -187,10 +187,9 @@ class module_report_download extends module_report $sql = ' SELECT SUM(1) AS nb - FROM ( log - INNER JOIN log_docs as log_date ON log.id = log_date.log_id - INNER JOIN record on log_date.record_id = record.record_id - ) + FROM (log) + INNER JOIN log_docs as log_date ON (log.id = log_date.log_id) + INNER JOIN record ON (log_date.record_id = record.record_id) WHERE ( ' . $finalfilter . ' ) @@ -230,11 +229,10 @@ class module_report_download extends module_report $sql = ' SELECT record.record_id as id, SUM(1) AS nb, subdef.name - FROM ( log - INNER JOIN log_docs as log_date ON log.id = log_date.log_id - INNER JOIN record ON log_date.record_id = record.record_id - INNER JOIN subdef ON subdef.record_id = record.record_id - ) + FROM ( log ) + INNER JOIN log_docs as log_date (ON log.id = log_date.log_id) + INNER JOIN record ON (log_date.record_id = record.record_id) + INNER JOIN subdef ON (subdef.record_id = record.record_id) WHERE ( ' . $finalfilter . ' ) diff --git a/lib/classes/module/report/nav.php b/lib/classes/module/report/nav.php index 0f4ed74689..1872faffd7 100644 --- a/lib/classes/module/report/nav.php +++ b/lib/classes/module/report/nav.php @@ -74,7 +74,8 @@ class module_report_nav extends module_report $sql = ' SELECT SUM(1) AS total - FROM log + FROM (log) + INNER JOIN log_colls ON (log.id = log_colls.log_id) WHERE (' . $report_filter['sql'] . ' AND nav != TRIM(\'\') ) diff --git a/lib/classes/module/report/question.php b/lib/classes/module/report/question.php index 21a3d1977e..efca812b99 100644 --- a/lib/classes/module/report/question.php +++ b/lib/classes/module/report/question.php @@ -30,7 +30,6 @@ class module_report_question extends module_report , 'fonction' => 'log.fonction' , 'site' => 'log.site' , 'sit_session' => 'log.sit_session' - , 'coll_list' => 'log.coll_list' , 'appli' => 'log.appli' , 'ip' => 'log.ip' ); diff --git a/lib/classes/module/report/sqlaction.php b/lib/classes/module/report/sqlaction.php index b43c1090db..63737750d5 100644 --- a/lib/classes/module/report/sqlaction.php +++ b/lib/classes/module/report/sqlaction.php @@ -52,13 +52,13 @@ class module_report_sqlaction extends module_report_sql implements module_report $this->sql = " - SELECT log.usrid, log.user , d.final as getter, d.record_id, d.date, s.* - FROM (log_docs as d - INNER JOIN log ON " . $site_filter['sql'] . " - AND log.id = d.log_id - INNER JOIN record ON record.record_id = d.record_id - LEFT JOIN subdef as s ON s.record_id=d.record_id and s.name='document') - WHERE"; + SELECT log.usrid, log.user , d.final as getter, d.record_id, d.date, s.* + FROM (log_docs as d) + INNER JOIN log ON (" . $site_filter['sql'] . " AND log.id = d.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (record.record_id = d.record_id) + LEFT JOIN subdef as s ON (s.record_id=d.record_id and s.name='document') + WHERE"; $this->sql .= $report_filter['sql'] . " AND (d.action = :action)"; @@ -83,15 +83,15 @@ class module_report_sqlaction extends module_report_sql implements module_report $params = array_merge($params, $site_filter['params'], $report_filter['params'], $record_filter['params']); $this->sql = " - SELECT TRIM(" . $this->getTransQuery($this->groupby) . ") - as " . $this->groupby . ", - SUM(1) as nombre - FROM (log_docs as d - INNER JOIN log ON " . $site_filter['sql'] . " - AND log.id = d.log_id - INNER JOIN record ON record.record_id = d.record_id - LEFT JOIN subdef as s ON s.record_id=d.record_id and s.name='document') - WHERE "; + SELECT TRIM(" . $this->getTransQuery($this->groupby) . ") + as " . $this->groupby . ", + SUM(1) as nombre + FROM (log_docs as d) + INNER JOIN log ON (" . $site_filter['sql'] . " AND log.id = d.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (record.record_id = d.record_id) + LEFT JOIN subdef as s ON (s.record_id=d.record_id and s.name='document') + WHERE "; $this->sql .= $report_filter['sql'] . " AND (d.action = :action)"; @@ -122,12 +122,13 @@ class module_report_sqlaction extends module_report_sql implements module_report $sql = " SELECT DISTINCT(" . $this->getTransQuery($field) . ") as val - FROM (log_docs as d - INNER JOIN log ON (" . $site_filter['sql'] . " - AND log.id = d.log_id - AND " . $date_filter['sql'] . ") - INNER JOIN record ON (record.record_id = d.record_id) - LEFT JOIN subdef as s ON (s.record_id=d.record_id AND s.name='document')) + FROM (log_docs as d) + INNER JOIN log ON (" . $site_filter['sql'] . " + AND log.id = d.log_id + AND " . $date_filter['sql'] . ") + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (record.record_id = d.record_id) + LEFT JOIN subdef as s ON (s.record_id=d.record_id AND s.name='document') WHERE "; if ($this->filter->getReportFilter()) { diff --git a/lib/classes/module/report/sqlconnexion.php b/lib/classes/module/report/sqlconnexion.php index 601755ba4c..2432156f10 100644 --- a/lib/classes/module/report/sqlconnexion.php +++ b/lib/classes/module/report/sqlconnexion.php @@ -43,10 +43,10 @@ class module_report_sqlconnexion extends module_report_sql implements module_rep log.fonction, site, sit_session, - coll_list, appli, ip - FROM log"; + FROM log + INNER JOIN log_colls ON (log.id = log_colls.log_id)"; $this->sql .= " WHERE " . $report_filter['sql']; $this->sql .= $this->filter->getOrderFilter() ? : ''; @@ -59,9 +59,10 @@ class module_report_sqlconnexion extends module_report_sql implements module_rep $this->sql .= $this->filter->getLimitFilter() ? : ''; } else { $this->sql = " - SELECT TRIM(" . $this->getTransQuery($this->groupby) . ") - as " . $this->groupby . ", SUM(1) as nb - FROM log "; + SELECT TRIM(" . $this->getTransQuery($this->groupby) . ") + as " . $this->groupby . ", SUM(1) as nb + FROM (log) + INNER JOIN log_colls ON (log.id = log_colls.log_id)"; if ($report_filter['sql']) $this->sql .= " WHERE " . $report_filter['sql']; @@ -83,8 +84,10 @@ class module_report_sqlconnexion extends module_report_sql implements module_rep $report_filter = $this->filter->getReportFilter(); $params = $report_filter['params']; - $sql = 'SELECT DISTINCT(' . $this->getTransQuery($field) . ') as val - FROM log '; + $sql = ' + SELECT DISTINCT(' . $this->getTransQuery($field) . ') as val + FROM (log) + INNER JOIN log_colls ON (log.id = log_colls.log_id)'; if ($report_filter['sql']) $sql .= ' WHERE ' . $report_filter['sql']; diff --git a/lib/classes/module/report/sqldownload.php b/lib/classes/module/report/sqldownload.php index bf0c1d56a2..184127e912 100644 --- a/lib/classes/module/report/sqldownload.php +++ b/lib/classes/module/report/sqldownload.php @@ -52,10 +52,10 @@ class module_report_sqldownload extends module_report_sql implements module_repo log_docs.record_id, log_docs.final, log_docs.comment - FROM (log - INNER JOIN log_docs ON log.id = log_docs.log_id - INNER JOIN record ON log_docs.record_id = record.record_id - ) + FROM (log) + INNER JOIN log_docs ON (log.id = log_docs.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (log_docs.record_id = record.record_id) WHERE "; $this->sql .= $report_filters['sql'] ? : ''; @@ -80,49 +80,44 @@ class module_report_sqldownload extends module_report_sql implements module_repo if ($name == 'record_id' && $this->on == 'DOC') { $this->sql = ' SELECT - TRIM( ' . $field . ' ) AS ' . $name . ', - SUM(1) AS telechargement, - record.coll_id, - log_docs.final, - log_docs.comment, - subdef.size, - subdef.file, - subdef.mime - FROM ( log - INNER JOIN log_docs ON log.id = log_docs.log_id - INNER JOIN record ON log_docs.record_id = record.record_id - INNER JOIN subdef ON (log_docs.record_id = subdef.record_id - AND subdef.name = log_docs.final - ) - ) + TRIM( ' . $field . ' ) AS ' . $name . ', + SUM(1) AS telechargement, + record.coll_id, + log_docs.final, + log_docs.comment, + subdef.size, + subdef.file, + subdef.mime + FROM (log) + INNER JOIN log_docs ON (log.id = log_docs.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (log_docs.record_id = record.record_id) + INNER JOIN subdef ON (log_docs.record_id = subdef.record_id AND subdef.name = log_docs.final) WHERE '; } elseif ($this->on == 'DOC') { $this->sql = ' - SELECT - TRIM(' . $field . ') AS ' . $name . ', - SUM(1) AS telechargement - FROM ( log - INNER JOIN log_docs ON log.id = log_docs.log_id - INNER JOIN record ON log_docs.record_id = record.record_id - INNER JOIN subdef ON ( log_docs.record_id = subdef.record_id - AND subdef.name = log_docs.final - ) - ) - WHERE - '; + SELECT + TRIM(' . $field . ') AS ' . $name . ', + SUM(1) AS telechargement + FROM ( log ) + INNER JOIN log_docs ON (log.id = log_docs.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (log_docs.record_id = record.record_id) + INNER JOIN subdef ON ( log_docs.record_id = subdef.record_id AND subdef.name = log_docs.final) + WHERE'; } else { $this->sql = ' - SELECT - TRIM( ' . $this->getTransQuery($this->groupby) . ') AS ' . $name . ', - SUM(1) AS nombre - FROM ( log - INNER JOIN log_docs ON log.id = log_docs.log_id - INNER JOIN record ON log_docs.record_id = record.record_id - INNER JOIN subdef ON (record.record_id = subdef.record_id AND subdef.name = "document") - ) - WHERE '; + SELECT + TRIM( ' . $this->getTransQuery($this->groupby) . ') AS ' . $name . ', + SUM(1) AS nombre + FROM ( log ) + INNER JOIN log_docs ON (log.id = log_docs.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (log_docs.record_id = record.record_id) + INNER JOIN subdef ON (record.record_id = subdef.record_id AND subdef.name = "document") + WHERE '; } $this->sql .= $report_filters['sql']; @@ -159,10 +154,11 @@ class module_report_sqldownload extends module_report_sql implements module_repo $sql = ' SELECT DISTINCT( ' . $this->getTransQuery($field) . ' ) AS val - FROM (log - INNER JOIN log_docs ON log.id = log_docs.log_id - INNER JOIN record ON log_docs.record_id = record.record_id - INNER JOIN subdef ON log_docs.record_id = subdef.record_id) + FROM (log) + INNER JOIN log_docs ON (log.id = log_docs.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + INNER JOIN record ON (log_docs.record_id = record.record_id) + INNER JOIN subdef ON (log_docs.record_id = subdef.record_id) WHERE '; $sql .= $report_filters['sql']; diff --git a/lib/classes/module/report/sqlfilter.php b/lib/classes/module/report/sqlfilter.php index c95265acea..14d54e056d 100644 --- a/lib/classes/module/report/sqlfilter.php +++ b/lib/classes/module/report/sqlfilter.php @@ -47,10 +47,12 @@ class module_report_sqlfilter { $ret = array('sql' => '', 'params' => array()); $coll_filter = array(); - foreach (explode(',', $list_coll_id) as $val) { - $coll_filter [] = " position('," . phrasea::collFromBas($app, $val) . ",' in concat(',' ,coll_list, ',')) > 0 "; + foreach (array_filter(explode(',', $list_coll_id)) as $val) { + if( false !== $val = phrasea::collFromBas($app, $val)) { + $coll_filter[] = 'log_colls.coll_id = '.phrasea::collFromBas($app, $val); + } } - $ret['sql'] = implode(' OR ', $coll_filter); + $ret['sql'] = ' (' . implode(' OR ', array_unique($coll_filter)) . ') '; return $ret; } @@ -75,7 +77,7 @@ class module_report_sqlfilter $params = array_merge($params, $this->filter['user']['params']); } if ($this->filter['collection']) { - $finalfilter .= '(' . $this->filter['collection']['sql'] . ') AND '; + $finalfilter .= $this->filter['collection']['sql'] . ' AND '; $params = array_merge($params, $this->filter['collection']['params']); } $finalfilter .= ' log.site = :log_site'; @@ -86,7 +88,7 @@ class module_report_sqlfilter public function getGvSitFilter() { $params = array(); - $sql = ''; + $sql = '1'; if ($this->app['phraseanet.registry']->is_set('GV_sit')) { $sql = 'log.site = :log_site_gv_filter'; @@ -190,12 +192,16 @@ class module_report_sqlfilter return; } - $tab = explode(",", $report->getListCollId()); + $tab = array_filter(explode(",", $report->getListCollId())); + if (count($tab) > 0) { foreach ($tab as $val) { - $coll_filter[] = " position('," . phrasea::collFromBas($this->app, $val) . ",' in concat(',' ,coll_list, ',')) > 0 "; + if( false !== $val = phrasea::collFromBas($this->app, $val)) { + $coll_filter[] = 'log_colls.coll_id = '.phrasea::collFromBas($this->app, $val); + } } - $this->filter['collection'] = array('sql' => implode(' OR ', $coll_filter), 'params' => array()); + + $this->filter['collection'] = array('sql' => ' (' . implode(' OR ', array_unique($coll_filter)) . ') ', 'params' => array()); } return; diff --git a/lib/classes/module/report/sqlquestion.php b/lib/classes/module/report/sqlquestion.php index 6b44c70ecc..f6fdc1c05b 100644 --- a/lib/classes/module/report/sqlquestion.php +++ b/lib/classes/module/report/sqlquestion.php @@ -33,21 +33,19 @@ class module_report_sqlquestion extends module_report_sql implements module_repo $this->params = $params; if ($this->groupby == false) { - $this->sql = - " - SELECT - log_search.date ddate, - search, - usrid, - user, - pays, - societe, - activite, - fonction - FROM `log_search` - INNER JOIN log - ON log.id = log_search.log_id - "; + $this->sql =" + SELECT + log_search.date ddate, + search, + usrid, + user, + pays, + societe, + activite, + fonction + FROM (`log_search`) + INNER JOIN log ON (log.id = log_search.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id)"; $this->sql .= " WHERE " . $report_filter['sql']; @@ -61,13 +59,13 @@ class module_report_sqlquestion extends module_report_sql implements module_repo $this->sql .= $this->filter->getLimitFilter() ? : ''; } else { $this->sql = " - SELECT - TRIM(" . $this->getTransQuery($this->groupby) . ") as " . $this->groupby . ", - SUM(1) as nb - FROM `log_search` - INNER JOIN log - ON log.id = log_search.log_id - "; + SELECT + TRIM(" . $this->getTransQuery($this->groupby) . ") as " . $this->groupby . ", + SUM(1) as nb + FROM (`log_search`) + INNER JOIN log ON (log.id = log_search.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) + "; $this->sql .= " WHERE " . $report_filter['sql']; $this->sql .= " GROUP BY " . $this->groupby; @@ -90,9 +88,9 @@ class module_report_sqlquestion extends module_report_sql implements module_repo $sql = " SELECT DISTINCT(" . $this->getTransQuery($field) . ") as val - FROM `log_search` - INNER JOIN log - ON log.id = log_search.log_id + FROM (`log_search`) + INNER JOIN log ON (log.id = log_search.log_id) + INNER JOIN log_colls ON (log.id = log_colls.log_id) "; if ($report_filter['sql']) diff --git a/lib/classes/patch/380a3.class.php b/lib/classes/patch/380a3.class.php new file mode 100644 index 0000000000..60bc739d18 --- /dev/null +++ b/lib/classes/patch/380a3.class.php @@ -0,0 +1,120 @@ +release; + } + + public function require_all_upgrades() + { + return true; + } + + /** + * + * @return Array + */ + public function concern() + { + return $this->concern; + } + + public function apply(base $databox, Application $app) + { + $conn = $databox->get_connection(); + // Count total rows from `log` table to process + $stmt = $conn->prepare(' + SELECT COUNT(l.id) as nb_row + FROM log l + LEFT JOIN log_colls lc ON (lc.log_id = l.id) + WHERE (lc.log_id IS NULL)'); + $stmt->execute(); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + $stmt->closeCursor(); + unset($stmt); + + $remainingRowsToProcess = (int) $row['nb_row']; + $failedRows = array(); + + do { + // Fetch all missing rows from `log_colls` table + $stmt = $conn->prepare('SELECT l.id, l.coll_list, lc.* FROM log l LEFT JOIN log_colls lc ON (lc.log_id = l.id) WHERE (lc.log_id IS NULL)'); + $stmt->execute(); + $rs = $stmt->fetchAll(\PDO::FETCH_ASSOC); + $stmt->closeCursor(); + unset($stmt); + + $sql = 'INSERT INTO log_colls (log_id, coll_id) VALUES (:log_id, :coll_id)'; + $stmt = $conn->prepare($sql); + + foreach ($rs as $row) { + // Clean fetched coll ids + $collIds = array_filter(array_map(function($collId) { + return (int) $collId; + }, explode(',', (string) $row['coll_list'])), function($collId) { + return $collId > 0; + }); + // Start mysql transaction to avoid case where only a part of coll ids are inserted in `log_colls` + $conn->beginTransaction(); + try { + // For each collection id insert a new row + foreach ($collIds as $collId) { + $stmt->execute(array( + ':log_id' => (int) $row['id'], + ':coll_id' => $collId + )); + $stmt->closeCursor(); + } + } catch (\Exception $e) { + // Rollback if something failed + $failedRows[] = $row['id']; + $conn->rollBack(); + // Go to next row + continue; + } + // Once all collection ids inserted commit + $conn->commit(); + $remainingRowsToProcess--; + } + } while (count($failedRows) !== $remainingRowsToProcess); + + unset($conn, $stmt); + + return count($failedRows) === 0; + } +} diff --git a/lib/conf.d/bases_structure.xml b/lib/conf.d/bases_structure.xml index a1f8102ec2..92e5c7e58b 100644 --- a/lib/conf.d/bases_structure.xml +++ b/lib/conf.d/bases_structure.xml @@ -5123,16 +5123,6 @@ - - coll_list - text - - - - - - - nav varchar(64) @@ -5272,6 +5262,46 @@ InnoDB + + + + + id + int(11) unsigned + + auto_increment + + + + + log_id + int(11) unsigned + + + + + + + coll_id + int(11) unsigned + + + + + + + + + PRIMARY + PRIMARY + + id + + + + InnoDB +
+ diff --git a/tests/classes/report/reportTest.php b/tests/classes/report/reportTest.php index 2e55173fd6..cd35cf7eea 100644 --- a/tests/classes/report/reportTest.php +++ b/tests/classes/report/reportTest.php @@ -168,7 +168,6 @@ class reportTest extends PhraseanetPHPUnitAuthenticatedAbstract log.fonction, site, sit_session, - coll_list, appli, ip FROM log ');