From 07300af3f4cf39d6660b8cc9eb53b8ca0ac5e84f Mon Sep 17 00:00:00 2001 From: Nicolas Le Goff Date: Wed, 7 Nov 2012 13:01:09 +0100 Subject: [PATCH] Modify collections filter & add JOIN on log_colls table Create entries in log_colls table Fix SQL issue Fix SQL issues Update version Add patch Remove debug output Fix CS Fic CS Add table schema Fix Cs Update patch Update patch Update patch Update patch Update patch delete all coll_list call Fix logger issue Fix log_colls table structure definition Rename patch Fix SQL Issues Fix patch Fix test Fix tests --- lib/classes/Session/Logger.php | 25 +++- lib/classes/module/report/activity.php | 132 ++++++++++-------- lib/classes/module/report/connexion.php | 17 +-- lib/classes/module/report/dashboard/group.php | 2 +- lib/classes/module/report/download.php | 16 +-- lib/classes/module/report/nav.php | 3 +- lib/classes/module/report/question.php | 1 - lib/classes/module/report/sqlaction.php | 45 +++--- lib/classes/module/report/sqlconnexion.php | 17 ++- lib/classes/module/report/sqldownload.php | 84 ++++++----- lib/classes/module/report/sqlfilter.php | 22 +-- lib/classes/module/report/sqlquestion.php | 48 +++---- lib/classes/patch/380a3.class.php | 120 ++++++++++++++++ lib/conf.d/bases_structure.xml | 50 +++++-- tests/classes/report/reportTest.php | 1 - 15 files changed, 373 insertions(+), 210 deletions(-) create mode 100644 lib/classes/patch/380a3.class.php 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 ');