From d0dba57facf099b75a9bdf972e0bd45a0f29145e Mon Sep 17 00:00:00 2001
From: sgiehl <stefan@piwik.org>
Date: Sun, 20 Nov 2016 20:23:22 +0100
Subject: [PATCH] Respect new shouldRunWithoutVisits method of plugin archivers
 in CronArchiver

---
 core/ArchiveProcessor/Loader.php              |  2 +-
 core/ArchiveProcessor/PluginsArchiver.php     | 20 +++++++++++++++++--
 core/CronArchive.php                          |  7 +++++--
 core/Plugin/Archiver.php                      |  2 +-
 .../ArchiveProcessor/PluginsArchiverTest.php  |  2 +-
 .../Integration/ArchiveWithNoVisitsTest.php   |  2 +-
 6 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/core/ArchiveProcessor/Loader.php b/core/ArchiveProcessor/Loader.php
index 4079f6923f..e6c5015aab 100644
--- a/core/ArchiveProcessor/Loader.php
+++ b/core/ArchiveProcessor/Loader.php
@@ -73,7 +73,7 @@ class Loader
         list($visits, $visitsConverted) = $this->prepareCoreMetricsArchive($visits, $visitsConverted);
         list($idArchive, $visits) = $this->prepareAllPluginsArchive($visits, $visitsConverted);
 
-        if ($this->isThereSomeVisits($visits)) {
+        if ($this->isThereSomeVisits($visits) || PluginsArchiver::doesAnyPluginArchiveWithoutVisits()) {
             return $idArchive;
         }
         return false;
diff --git a/core/ArchiveProcessor/PluginsArchiver.php b/core/ArchiveProcessor/PluginsArchiver.php
index ae0198b58b..bcfeb9cc8b 100644
--- a/core/ArchiveProcessor/PluginsArchiver.php
+++ b/core/ArchiveProcessor/PluginsArchiver.php
@@ -101,7 +101,7 @@ class PluginsArchiver
 
         $this->archiveProcessor->setNumberOfVisits($visits, $visitsConverted);
 
-        $archivers = $this->getPluginArchivers();
+        $archivers = static::getPluginArchivers();
 
         foreach ($archivers as $pluginName => $archiverClass) {
             // We clean up below all tables created during this function call (and recursive calls)
@@ -166,12 +166,28 @@ class PluginsArchiver
         return $this->archiveWriter->getIdArchive();
     }
 
+    /**
+     * Returns if any plugin archiver archives without visits
+     */
+    public static function doesAnyPluginArchiveWithoutVisits()
+    {
+        $archivers = static::getPluginArchivers();
+
+        foreach ($archivers as $pluginName => $archiverClass) {
+            if ($archiverClass::shouldRunWithoutVisits()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     /**
      * Loads Archiver class from any plugin that defines one.
      *
      * @return \Piwik\Plugin\Archiver[]
      */
-    protected function getPluginArchivers()
+    protected static function getPluginArchivers()
     {
         if (empty(static::$archivers)) {
             $pluginNames = \Piwik\Plugin\Manager::getInstance()->getActivatedPlugins();
diff --git a/core/CronArchive.php b/core/CronArchive.php
index bac5aabcda..cc8a1de71c 100644
--- a/core/CronArchive.php
+++ b/core/CronArchive.php
@@ -9,6 +9,7 @@
 namespace Piwik;
 
 use Exception;
+use Piwik\ArchiveProcessor\PluginsArchiver;
 use Piwik\ArchiveProcessor\Rules;
 use Piwik\Archiver\Request;
 use Piwik\Container\StaticContainer;
@@ -816,9 +817,11 @@ class CronArchive
         $this->requests++;
         $this->processed++;
 
+        $shouldArchiveWithoutVisits = PluginsArchiver::doesAnyPluginArchiveWithoutVisits();
+
         // If there is no visit today and we don't need to process this website, we can skip remaining archives
         if (
-            0 == $visitsToday
+            0 == $visitsToday && !$shouldArchiveWithoutVisits
             && !$shouldArchivePeriods
         ) {
             $this->logger->info("Skipped website id $idSite, no visit today, " . $timerWebsite->__toString());
@@ -827,7 +830,7 @@ class CronArchive
             return false;
         }
 
-        if (0 == $visitsLastDays
+        if (0 == $visitsLastDays && !$shouldArchiveWithoutVisits
             && !$shouldArchivePeriods
             && $this->shouldArchiveAllSites
         ) {
diff --git a/core/Plugin/Archiver.php b/core/Plugin/Archiver.php
index c9a083c809..366ffbc325 100644
--- a/core/Plugin/Archiver.php
+++ b/core/Plugin/Archiver.php
@@ -147,7 +147,7 @@ abstract class Archiver
      *
      * @return bool
      */
-    public function shouldRunWithoutVisits()
+    public static function shouldRunWithoutVisits()
     {
         return false;
     }
diff --git a/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php b/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php
index eaadfefe45..3c22fd934c 100644
--- a/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php
+++ b/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php
@@ -37,7 +37,7 @@ class CustomArchiver extends Archiver
 
 class CustomPluginsArchiver extends PluginsArchiver
 {
-    protected function getPluginArchivers()
+    protected static function getPluginArchivers()
     {
         return array(
             'MyPluginName' => 'Piwik\Tests\Integration\Archive\CustomArchiver'
diff --git a/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php b/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php
index fcc86c9ba6..e0f9157de0 100644
--- a/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php
+++ b/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php
@@ -32,7 +32,7 @@ class ArchiveWithNoVisitsTest_MockArchiver extends Archiver
         self::$methodsCalled[] = 'aggregateMultipleReports';
     }
 
-    public function shouldRunWithoutVisits()
+    public static function shouldRunWithoutVisits()
     {
         return self::$runWithoutVisits;
     }
-- 
GitLab