From 7a4a83e6d62f13a5a73af13a6e7f1cfe54254f0e Mon Sep 17 00:00:00 2001
From: Chris Hallberg <crhallberg@gmail.com>
Date: Mon, 27 Aug 2012 14:32:49 -0400
Subject: [PATCH] Statistics viewing is working.

---
 .../src/VuFind/Controller/AdminController.php |  39 ++++---
 .../VuFind/src/VuFind/Db/Table/UserStats.php  |  67 ++++++-----
 .../src/VuFind/Db/Table/UserStatsFields.php   | 110 +++++++++---------
 .../VuFind/src/VuFind/Statistics/Record.php   |   3 +-
 .../VuFind/src/VuFind/Statistics/Search.php   |   3 +-
 5 files changed, 121 insertions(+), 101 deletions(-)

diff --git a/module/VuFind/src/VuFind/Controller/AdminController.php b/module/VuFind/src/VuFind/Controller/AdminController.php
index e4ce8810d15..7f1e79dd200 100644
--- a/module/VuFind/src/VuFind/Controller/AdminController.php
+++ b/module/VuFind/src/VuFind/Controller/AdminController.php
@@ -28,7 +28,8 @@
 namespace VuFind\Controller;
 use VuFind\Config\Reader as ConfigReader, VuFind\Db\Table\Search as SearchTable,
     VuFind\Exception\Forbidden as ForbiddenException,
-    VuFind\Http\Client as HttpClient, Zend\Mvc\MvcEvent;
+    VuFind\Http\Client as HttpClient, Zend\Mvc\MvcEvent,
+    VuFind\Statistics\AbstractBase as Statistics;
 
 /**
  * Class controls VuFind administration.
@@ -147,46 +148,47 @@ class AdminController extends AbstractBase
      */
     public function statisticsAction()
     {
-        /* TODO
+        $view = $this->createViewModel();
+        //todo
         $config = ConfigReader::getConfig();
         $statsFilled = array(
             'search' => false,
             'record' => false
         );
         // Search statistics
-        $search = new VF_Statistics_Search();
-        $this->view->searchesBySource
+        $search = new \VuFind\Statistics\Search();
+        $view->searchesBySource
             = $config->Statistics->searchesBySource
             ?: false;
         $searchSummary = $search->getStatsSummary(
             $config, 7, $config->Statistics->searchesBySource
         );
-        $this->view->topSearches = isset($searchSummary['top'])
+        $view->topSearches = isset($searchSummary['top'])
             ? $searchSummary['top'] : null;
-        $this->view->emptySearches = isset($searchSummary['empty'])
+        $view->emptySearches = isset($searchSummary['empty'])
             ? $searchSummary['empty'] : null;
-        $this->view->totalSearches = isset($searchSummary['total'])
+        $view->totalSearches = isset($searchSummary['total'])
             ? $searchSummary['total'] : null;
 
         // Record statistics
-        $records = new VF_Statistics_Record();
-        $this->view->recordsBySource = $config->Statistics->recordsBySource ?: false;
+        $records = new \VuFind\Statistics\Record();
+        $view->recordsBySource = $config->Statistics->recordsBySource ?: false;
         $recordSummary = $records->getStatsSummary(
             $config, 5, $config->Statistics->recordsBySource
         );
-        $this->view->topRecords = isset($recordSummary['top'])
+        $view->topRecords = isset($recordSummary['top'])
             ? $recordSummary['top'] : null;
-        $this->view->totalRecordViews = isset($recordSummary['total'])
+        $view->totalRecordViews = isset($recordSummary['total'])
             ? $recordSummary['total'] : null;
 
         // Browser statistics
-        $this->view->currentBrowser = VF_Statistics::getBrowser(
+        $view->currentBrowser = Statistics::getBrowser(
             $this->getRequest()->getServer('HTTP_USER_AGENT')
         );
 
         // Look for universal statistics recorder
         $matchFound = false;
-        foreach (VF_Statistics::getDriversForSource(null) as $currentDriver) {
+        foreach (Statistics::getDriversForSource(null) as $currentDriver) {
             $browserStats = $currentDriver->getBrowserStats(false, 5);
             if (!empty($browserStats)) {
                 $matchFound = true;
@@ -196,7 +198,7 @@ class AdminController extends AbstractBase
 
         // If no full coverage mode found, take the first valid source
         if (!$matchFound) {
-            $drivers = VF_Statistics::getDriversForSource(null, true);
+            $drivers = Statistics::getDriversForSource(null, true);
             foreach ($drivers as $currentDriver) {
                 $browserStats = $currentDriver->getBrowserStats(false, 5);
                 if (!empty($browserStats)) {
@@ -208,12 +210,13 @@ class AdminController extends AbstractBase
 
         // Initialize browser/version data in view based on what we found above:
         if ($matchFound) {
-            $this->view->browserStats = $browserStats;
-            $this->view->topVersions = $currentDriver->getBrowserStats(true, 5);
+            $view->browserStats = $browserStats->toArray();
+            $view->topVersions = $currentDriver->getBrowserStats(true, 5);
         } else {
-            $this->view->browserStats = $this->view->topVersions = null;
+            $view->browserStats = $view->topVersions = null;
         }
-         */
+        
+        return $view;
     }
 
     /**
diff --git a/module/VuFind/src/VuFind/Db/Table/UserStats.php b/module/VuFind/src/VuFind/Db/Table/UserStats.php
index 136b047ec21..e53ac0699c1 100644
--- a/module/VuFind/src/VuFind/Db/Table/UserStats.php
+++ b/module/VuFind/src/VuFind/Db/Table/UserStats.php
@@ -27,6 +27,8 @@
  */
 namespace VuFind\Db\Table;
 
+use Zend\Db\Sql\Expression;
+
 /**
  * Table Definition for user statistics
  *
@@ -57,32 +59,43 @@ class UserStats extends Gateway
      */
     public function getBrowserStats($withVersions = false, $limit = 5)
     {
-        /* TODO
-        $select = $this->select();
-        if ($withVersions) {
-            $select->from(
-                array($this->_name),
-                array(
-                    'browserName' => 'CONCAT_WS(" ",browser,browserVersion)',
-                    'count' => 'COUNT(DISTINCT session)'
-                )
-            );
-            $select->group('browserName');
-        } else {
-            $select->from(
-                array($this->_name),
-                array(
-                    'browserName' => 'browser',
-                    'count' => 'COUNT(DISTINCT session)'
-                )
-            );
-            $select->group('browser');
-        }
-        $select->limit($limit);
-        $select->order('count DESC');
-        $stmt = $select->query();
-        $result = $stmt->fetchAll();
-        return $result;
-         */
+        $callback = function($select) use ($withVersions, $limit) {
+            if ($withVersions) {
+                $select->columns(
+                    array(
+                        'browserName' => new Expression(
+                            'CONCAT_WS(" ",?,?)',
+                            array('browser', 'browserVersion'),
+                            array(
+                                Expression::TYPE_IDENTIFIER,
+                                Expression::TYPE_IDENTIFIER
+                            )
+                        ),
+                        'count' => new Expression(
+                            'COUNT(DISTINCT (?))',
+                            array('session'),
+                            array(Expression::TYPE_IDENTIFIER)
+                        )
+                    )
+                );
+                $select->group('browserName');
+            } else {
+                $select->columns(
+                    array(
+                        'browserName' => 'browser',
+                        'count' => new Expression(
+                            'COUNT(DISTINCT (?))',
+                            array('session'),
+                            array(Expression::TYPE_IDENTIFIER)
+                        )
+                    )
+                );
+                $select->group('browser');
+            }
+            $select->limit($limit);
+            $select->order('count DESC');
+        };
+        
+        return $this->select($callback);
     }
 }
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Db/Table/UserStatsFields.php b/module/VuFind/src/VuFind/Db/Table/UserStatsFields.php
index 84e1806959a..ade5407dc2d 100644
--- a/module/VuFind/src/VuFind/Db/Table/UserStatsFields.php
+++ b/module/VuFind/src/VuFind/Db/Table/UserStatsFields.php
@@ -27,6 +27,8 @@
  */
 namespace VuFind\Db\Table;
 
+use Zend\Db\Sql\Expression;
+
 /**
  * Table Definition for statistics
  *
@@ -85,35 +87,31 @@ class UserStatsFields extends Gateway
      */
     public function getFields($fields, $values = array())
     {
-        /* TODO
         if (empty($fields)) {
             return null;
         }
         if (!is_array($fields)) {
             $fields = array($fields);
         }
-        // Build select
-        $select = $this->select()
-            ->setIntegrityCheck(false);
-        $select->from(
-            $this->_name,
-            array($fields[0] => 'value')
-        );
-        $select->where($this->_name.'.field = ?', $fields[0]);
-        for ($i=1;$i<count($fields);$i++) {
-            $select->where('field'.$i.'.field = ?', $fields[$i]);
-            $select->join(
-                array('field'.$i => $this->_name),
-                $this->_name.'.id=field'.$i.'.id',
-                array($fields[$i] => 'field'.$i.'.value')
+        $callback = function($select) use ($fields, $values) {
+            $select->columns(
+                array($fields[0] => 'value')
             );
-        }
-        foreach ($values as $key=>$value) {
-            $select->where($this->_name.'.'.$key.' = ?', $value);
-        }
-        $stmt = $select->query();
-        return $stmt->fetchAll();
-         */
+            $select->where->equalTo('field', $fields[0]);
+            for ($i=1;$i<count($fields);$i++) {
+                $select->where->equalTo('field'.$i.'.field', $fields[$i]);
+                $select->join(
+                    array('field'.$i => 'user_stats_fields'),
+                    'user_stats_fields.id=field'.$i.'.id',
+                    array($fields[$i] => 'field'.$i.'.value')
+                );
+            }
+             foreach ($values as $key=>$value) {
+                $select->where->equalTo($key, $value);
+            }
+        };
+        
+        return $this->select($callback);
     }
 
     /**
@@ -126,22 +124,24 @@ class UserStatsFields extends Gateway
      */
     public function getCount($field, $value = null)
     {
-        /* TODO
-        $select = $this->select();
-        $select->from(
-            array($this->_name),
-            array(
-                'count' => 'COUNT(value)'
-            )
-        );
-        $select->where('field = ?', $field);
-        if ($value != null) {
-            $select->where('value = ?', $value);
-        }
-        $stmt = $select->query();
-        $result = $stmt->fetch();
-        return $result['count'];
-         */
+        // TODO
+        $callback = function($select) use ($field, $value) {
+            $select->columns(
+                array(
+                    'count' => new Expression(
+                        'COUNT(?)',
+                        array('value'),
+                        array(Expression::TYPE_IDENTIFIER)
+                    )
+                )
+            );
+            $select->where->equalTo('field', $field);
+            if ($value != null) {
+                $select->where->equalTo('value', $value);
+            }
+        };
+        
+        return $this->select($callback)->current()->count;
     }
 
     /**
@@ -154,21 +154,24 @@ class UserStatsFields extends Gateway
      */
     public function getTop($field, $number)
     {
-        /* TODO
-        $select = $this->select();
-        $select->from(
-            array($this->_name),
-            array(
-                'value',
-                'count' => 'COUNT(value)'
-            )
-        );
-        $select->limit($number);
-        $select->group('value');
-        $select->order('count DESC');
-        $select->where('field = ?', $field);
-        $stmt = $select->query();
-        $result = $stmt->fetchAll();
+        // TODO
+        $callback = function($select) use ($field, $number) {
+            $select->columns(
+                array(
+                    'value',
+                    'count' => new Expression(
+                        'COUNT(?)',
+                        array('value'),
+                        array(Expression::TYPE_IDENTIFIER)
+                    )
+                )
+            );
+            $select->limit($number);
+            $select->group('value');
+            $select->order('count DESC');
+            $select->where->equalTo('field', $field);
+        };
+        $result = $this->select($callback);
         $top = array();
         $emptyIndex = -1;
         foreach ($result as $row) {
@@ -187,6 +190,5 @@ class UserStatsFields extends Gateway
             );
         }
         return $top;
-         */
     }
 }
\ No newline at end of file
diff --git a/module/VuFind/src/VuFind/Statistics/Record.php b/module/VuFind/src/VuFind/Statistics/Record.php
index a5aaa54fa43..461cc447510 100644
--- a/module/VuFind/src/VuFind/Statistics/Record.php
+++ b/module/VuFind/src/VuFind/Statistics/Record.php
@@ -72,7 +72,8 @@ class Record extends AbstractBase
         foreach ($this->drivers as $driver) {
             $summary = $driver->getFullList('recordId');
             if (!empty($summary)) {
-                $sources = $driver->getFullList('recordSource');
+                $summary = $summary->toArray();
+                $sources = $driver->getFullList('recordSource')->toArray();
                 $hashes = array();
                 // Generate hashes (faster than grouping by looping)
                 for ($i=0;$i<count($summary);$i++) {
diff --git a/module/VuFind/src/VuFind/Statistics/Search.php b/module/VuFind/src/VuFind/Statistics/Search.php
index d6eefca84d8..54ff03abf76 100644
--- a/module/VuFind/src/VuFind/Statistics/Search.php
+++ b/module/VuFind/src/VuFind/Statistics/Search.php
@@ -74,7 +74,8 @@ class Search extends AbstractBase
         foreach ($this->drivers as $driver) {
             $summary = $driver->getFullList('phrase');
             if (!empty($summary)) {
-                $sources = $driver->getFullList('searchSource');
+                $summary = $summary->toArray();
+                $sources = $driver->getFullList('searchSource')->toArray();
                 $hashes = array();
                 // Generate hashes (faster than grouping by looping)
                 for ($i=0;$i<count($summary);$i++) {
-- 
GitLab