/**
  * Function that when implemented by a derived
  * class should return an object that can be
  * json encoded and returned to the UI to
  * provide analytical information about the
  * underlying data.
  *
  * @param \Swiftriver\Core\Analytics\AnalyticsRequest $parameters
  * @return \Swiftriver\Core\Analytics\AnalyticsRequest
  */
 public function ProvideAnalytics($request)
 {
     $logger = \Swiftriver\Core\Setup::GetLogger();
     $logger->log("Swiftriver::AnalyticsProviders::SourcesByChannelOverTimeAnalyticsProvider::ProvideAnalytics [Method Invoked]", \PEAR_LOG_DEBUG);
     $parameters = $request->Parameters;
     $yearDay = (int) \date('z');
     $timeLimit = 5;
     if (\is_array($parameters)) {
         if (\key_exists("TimeLimit", $parameters)) {
             $timeLimit = (int) $parameters["TimeLimit"];
         }
     }
     $currentDay = $yearDay;
     $days = "";
     while ($currentDay > 0 && $yearDay - $currentDay < $timeLimit) {
         $days .= "'{$currentDay}',";
         $currentDay = $currentDay - 1;
     }
     $days = \rtrim($days, ',');
     $sql = "SELECT \n                DAYOFYEAR(FROM_UNIXTIME(s.date)) as dayoftheyear,\n                count(s.id) as numberofsources,\n                ch.id as channelId,\n                ch.json as channelJson\n            FROM \n                SC_Sources s JOIN SC_Channels ch ON s.channelId = ch.id\n            WHERE\n                DAYOFYEAR(FROM_UNIXTIME(s.date)) in ({$days})\n            GROUP BY\n                channelId, dayoftheyear";
     try {
         $db = parent::PDOConnection($request);
         if ($db == null) {
             return $request;
         }
         $statement = $db->prepare($sql);
         $result = $statement->execute();
         if ($result == false) {
             $logger->log("Swiftriver::AnalyticsProviders::SourcesByChannelOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);
             $errorCollection = $statement->errorInfo();
             $logger->log("Swiftriver::AnalyticsProviders::SourcesByChannelOverTimeAnalyticsProvider::ProvideAnalytics [" . $errorCollection[2] . "]", \PEAR_LOG_ERR);
             return $request;
         }
         $request->Result = array();
         foreach ($statement->fetchAll() as $row) {
             $entry = array("dayOfTheYear" => $this->DayOfYear2Date($row["dayoftheyear"]), "numberOfSources" => $row["numberofsources"], "channelId" => $row["channelId"]);
             $request->Result[] = $entry;
         }
     } catch (\PDOException $e) {
         $logger->log("Swiftriver::AnalyticsProviders::SourcesByChannelOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);
         $logger->log("Swiftriver::AnalyticsProviders::SourcesByChannelOverTimeAnalyticsProvider::ProvideAnalytics [{$e}]", \PEAR_LOG_ERR);
     }
     $logger->log("Swiftriver::AnalyticsProviders::SourcesByChannelOverTimeAnalyticsProvider::ProvideAnalytics [Method finished]", \PEAR_LOG_DEBUG);
     return $request;
 }
 function mongo_analytics($request)
 {
     $logger = \Swiftriver\Core\Setup::GetLogger();
     $request->Result = null;
     $tag_array = array();
     $limit = 20;
     $parameters = $request->Parameters;
     if (\is_array($parameters)) {
         if (\key_exists("Limit", $parameters)) {
             $limit = (int) $parameters["Limit"];
         }
     }
     $logger->log("Swiftriver::AnalyticsProviders::TotalTagPopularityAnalyticsProvider::ProvideAnalytics [Set limit {$limit}]", \PEAR_LOG_INFO);
     try {
         $db = parent::PDOConnection($request);
         $content_tags = $db->get("content_tags");
         foreach ($content_tags as $content_tag) {
             $tags = $db->get_where('tags', array('id' => $content_tag["tagId"]));
             foreach ($tags as $tag) {
                 if (!\in_array($tag["text"], $tag_array)) {
                     $tag_array[$tag["text"]] = array("tag" => $tag["text"], "count" => 1);
                 } else {
                     $tag_array[$tag["text"]]["count"] += 1;
                 }
             }
         }
     } catch (\MongoException $e) {
         $logger->log("Swiftriver::AnalyticsProviders::TotalTagPopularityAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);
         $logger->log("Swiftriver::AnalyticsProviders::TotalTagPopularityAnalyticsProvider::ProvideAnalytics [{$e}]", \PEAR_LOG_ERR);
     }
     $sorted_tag_array = $this->mongo_array_sort($tag_array, "count");
     $num_items = 1;
     foreach ($sorted_tag_array as $tag_item) {
         if ($num_items > $limit) {
             continue;
         }
         if ($request->Result == null) {
             $request->Result = array();
         }
         $request->Result[] = $tag_item;
         $num_items++;
     }
     return $request;
 }
    /**
     * Function that when implemented by a derived
     * class should return an object that can be
     * json encoded and returned to the UI to
     * provide analytical information about the
     * underlying data.
     *
     * @param \Swiftriver\Core\Analytics\AnalyticsRequest $parameters
     * @return \Swiftriver\Core\Analytics\AnalyticsRequest
     */
    public function ProvideAnalytics($request)
    {
        $logger = \Swiftriver\Core\Setup::GetLogger();

        $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [Method Invoked]", \PEAR_LOG_DEBUG);

        $parameters = $request->Parameters;

        $yearDay = (int) \date('z');

        $timeLimit = 5;

        if(\is_array($parameters))
            if(\key_exists("TimeLimit", $parameters))
                $timeLimit = (int) $parameters["TimeLimit"];

        $currentDay = $yearDay;

        $days = "";

        while (($currentDay > 0) && (($yearDay - $currentDay) < $timeLimit))
        {
            $days .= "'$currentDay',";

            $currentDay = $currentDay - 1;
        }

        $days = \rtrim($days, ',');

        $sql = 
            "SELECT 
                DAYOFYEAR(FROM_UNIXTIME(c.date)) as dayoftheyear,
                count(c.id) as numberofcontentitems,
                ch.id as channelId,
                ch.json as channelJson
            FROM 
                SC_Content c JOIN SC_Sources s ON c.sourceId = s.id
                JOIN SC_Channels ch ON s.channelId = ch.id
            WHERE
                DAYOFYEAR(FROM_UNIXTIME(c.date)) in ($days)
            GROUP BY
                channelId, dayoftheyear";
        
        try
        {
            $db = parent::PDOConnection($request);

            if($db == null)
                return $request;

            $statement = $db->prepare($sql);

            $result = $statement->execute();

            if($result == false)
            {
                $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);

                $errorCollection = $statement->errorInfo();

                $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [" . $errorCollection[2] . "]", \PEAR_LOG_ERR);

                return $request;
            }

            $request->Result = array();
            
            foreach($statement->fetchAll() as $row)
            {
                $channel_name = "";
                $entry_json_decoded = json_decode($row["channelJson"]);

                if(isset($entry_json_decoded->name)) {
                    $channel_name = $entry_json_decoded->name; 
                }

                $entry = array(
                    "dayOfTheYear" => $this->DayOfYear2Date($row["dayoftheyear"]),
                    "numberOfContentItems" => $row["numberofcontentitems"],
                    "channelId" => $row["channelId"],
                    "channelName" => $channel_name);

                $request->Result[] = $entry;
            }
        }
        catch(\PDOException $e)
        {
            $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);

            $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [$e]", \PEAR_LOG_ERR);
        }

        $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [Method finished]", \PEAR_LOG_DEBUG);

        return $request;
    }
 function mongo_analytics($request)
 {
     $logger = \Swiftriver\Core\Setup::GetLogger();
     $parameters = $request->Parameters;
     $yearDay = (int) \date('z');
     $timeLimit = 5;
     if (\is_array($parameters)) {
         if (\key_exists("TimeLimit", $parameters)) {
             $timeLimit = (int) $parameters["TimeLimit"];
         }
     }
     $currentDay = $yearDay;
     $days = array();
     $days[] = $currentDay + 1;
     while ($currentDay > 0 && $yearDay - $currentDay < $timeLimit) {
         $days[] = $currentDay;
         $currentDay = $currentDay - 1;
     }
     $channel_array = array();
     $request->Result = null;
     try {
         $db_content = parent::PDOConnection($request);
         $db_sources = parent::PDOConnection($request);
         $db_channels = parent::PDOConnection($request);
         $db_content->where_in("date_day_of_year", $days);
         $content_items = $db_content->get("content");
         $channel_array = array();
         foreach ($content_items as $content_item) {
             $source_id = $content_item["source"]["id"];
             $source_items = $db_sources->get_where("sources", array("id" => $source_id));
             foreach ($source_items as $source_item) {
                 $channel_id = $source_item["channelId"];
                 if (!\in_array($channel_id, $channel_array)) {
                     $channel_array[$channel_id] = array();
                 }
                 $channels = $db_channels->get_where("channels", array("id" => $channel_id));
                 foreach ($channels as $channel) {
                     if (!\in_array($content_item->date_day_of_year, $channel_array[$channel_id])) {
                         $channel_array[$channel_id][$content_item->date_day_of_year] = array();
                     }
                     $channel_array[$channel_id][$content_item["date_day_of_year"]]["channelId"] = $channel_id;
                     $channel_array[$channel_id][$content_item["date_day_of_year"]]["channelName"] = $channel["name"];
                     if (!\in_array($channel_id, $channel_array[$channel_id][$content_item["date_day_of_year"]]["numberOfContentItems"])) {
                         $channel_array[$channel_id][$content_item["date_day_of_year"]]["numberOfContentItems"] = 1;
                     } else {
                         $channel_array[$channel_id][$content_item["date_day_of_year"]]["numberOfContentItems"] += 1;
                     }
                     $channel_array[$channel_id][$content_item["date_day_of_year"]]["dayOfTheYear"] = $content_item["date_day_of_year"];
                 }
             }
         }
     } catch (\MongoException $e) {
         $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);
         $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [{$e}]", \PEAR_LOG_ERR);
     }
     foreach ($channel_array as $channel_array_item) {
         foreach ($channel_array_item as $channel_array_item_day) {
             if ($request->Result == null) {
                 $request->Result = array();
             }
             $request->Result[] = $channel_array_item_day;
         }
     }
     return $request;
 }
 function mongo_analytics($request)
 {
     $logger = \Swiftriver\Core\Setup::GetLogger();
     $parameters = $request->Parameters;
     $yearDay = (int) \date('z');
     $timeLimit = 5;
     if (\is_array($parameters)) {
         if (\key_exists("TimeLimit", $parameters)) {
             $timeLimit = (int) $parameters["TimeLimit"];
         }
     }
     $date = \strtotime("-{$timeLimit} days");
     $channel_array = array();
     $request->Result = null;
     try {
         $db_content = parent::PDOConnection($request);
         $db_sources = parent::PDOConnection($request);
         $db_channels = parent::PDOConnection($request);
         $db_content->where(array("date" => array('$gte' => $date)));
         $content_items = $db_content->get("content");
         $logger->log("Swiftriver::AnalyticsProviders::TotalContentByChannelAnalyticsProvider::ProvideAnalytics [Selected date: {$date}]", \PEAR_LOG_INFO);
         $logger->log("Swiftriver::AnalyticsProviders::TotalContentByChannelAnalyticsProvider::ProvideAnalytics [" . \count($content_items) . " number of content items retrieved]", \PEAR_LOG_INFO);
         $channel_array = array();
         foreach ($content_items as $content_item) {
             $source_id = $content_item["source"]["id"];
             $source_items = $db_sources->get_where("sources", array("id" => $source_id));
             $logger->log("Swiftriver::AnalyticsProviders::TotalContentByChannelAnalyticsProvider::ProvideAnalytics [" . \count($source_items) . " number of source items retrieved]", \PEAR_LOG_INFO);
             foreach ($source_items as $source_item) {
                 $channel_id = $source_item["channelId"];
                 if (!\in_array($channel_id, $channel_array)) {
                     $channel_array[$channel_id] = array();
                 }
                 $channels = $db_channels->get_where("channels", array("id" => $channel_id));
                 $logger->log("Swiftriver::AnalyticsProviders::TotalContentByChannelAnalyticsProvider::ProvideAnalytics [" . \count($channels) . " number of channels retrieved]", \PEAR_LOG_INFO);
                 foreach ($channels as $channel) {
                     $channel_array[$channel_id]["channelId"] = $channel_id;
                     $channel_array[$channel_id]["channelName"] = $channel["name"];
                     if (!\in_array($channel_id, $channel_array[$channel_id]["numberOfContentItems"])) {
                         $channel_array[$channel_id]["numberOfContentItems"] = 1;
                     } else {
                         $channel_array[$channel_id]["numberOfContentItems"] += 1;
                     }
                     $channel_array[$channel_id]["channelType"] = $content_item["source"]["type"];
                     $channel_array[$channel_id]["channelSubType"] = $content_item["source"]["subType"];
                 }
             }
         }
     } catch (\MongoException $e) {
         $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);
         $logger->log("Swiftriver::AnalyticsProviders::ContentByChannelOverTimeAnalyticsProvider::ProvideAnalytics [{$e}]", \PEAR_LOG_ERR);
     }
     foreach ($channel_array as $channel_array_item) {
         if ($request->Result == null) {
             $request->Result = array();
         }
         $request->Result[] = $channel_array_item;
     }
     return $request;
 }
 private function mongo_analytics($request)
 {
     $logger = \Swiftriver\Core\Setup::GetLogger();
     $request->Result = null;
     try {
         $db = parent::PDOConnection($request);
         $content = $db->get("content");
         $content_date = null;
         $content_statistics = array();
         $array_index = -1;
         $accumulated_total = 0;
         $date = null;
         foreach ($content as $content_item) {
             $timestamp = $content_item["date"];
             $content_item_day_of_year = \date('z', $timestamp);
             if ($content_date != $content_item_day_of_year) {
                 $content_date = $content_item_day_of_year;
                 if ($array_index > -1) {
                     // Add statistics
                     $content_statistics[] = array("date" => $date, "accumulatedtotal" => $accumulated_total);
                 }
                 $accumulated_total = 0;
                 $array_index++;
             } else {
                 $accumulated_total++;
             }
             // Get the date for the new entry
             $date = \date("d-m-Y", $timestamp);
         }
         if ($request->Result == null) {
             $request->Result = array();
         }
         $request->Result[] = $content_statistics;
     } catch (\MongoException $e) {
         $logger->log("Swiftriver::AnalyticsProviders::AccumulatedContentOverTimeAnalyticsProvider::ProvideAnalytics [An exception was thrown]", \PEAR_LOG_ERR);
         $logger->log("Swiftriver::AnalyticsProviders::AccumulatedContentOverTimeAnalyticsProvider::ProvideAnalytics [{$e}]", \PEAR_LOG_ERR);
     }
     return $request;
 }