From 2ec8416574c5061eec5ae9468605e3155ad50eee Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Mon, 25 Nov 2019 11:10:16 +0100
Subject: [PATCH] Fixed bug with aggregate field

---
 CRM/Dataprocessor/BAO/DataProcessor.php       |  3 ---
 .../DateFieldOutputHandler.php                |  7 +++++++
 .../RawFieldOutputHandler.php                 |  7 +++++++
 .../Source/AbstractCivicrmEntitySource.php    | 19 +++++++------------
 4 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/CRM/Dataprocessor/BAO/DataProcessor.php b/CRM/Dataprocessor/BAO/DataProcessor.php
index 31b4e6bb..af7bf19d 100644
--- a/CRM/Dataprocessor/BAO/DataProcessor.php
+++ b/CRM/Dataprocessor/BAO/DataProcessor.php
@@ -98,9 +98,6 @@ class CRM_Dataprocessor_BAO_DataProcessor extends CRM_Dataprocessor_DAO_DataProc
         try {
           $outputHandler->initialize($field['name'], $field['title'], $field['configuration']);
           $dataProcessorClass->addOutputFieldHandlers($outputHandler);
-          if ($outputHandler instanceof OutputHandlerAggregate && $outputHandler->isAggregateField()) {
-            $dataProcessorClass->getDataFlow()->addAggregateOutputHandler($outputHandler);
-          }
         } catch (\Exception $e) {
           CRM_Core_Session::setStatus($e->getMessage(), E::ts("Invalid field"), 'error');
         }
diff --git a/Civi/DataProcessor/FieldOutputHandler/DateFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/DateFieldOutputHandler.php
index 257027f5..c65a9083 100644
--- a/Civi/DataProcessor/FieldOutputHandler/DateFieldOutputHandler.php
+++ b/Civi/DataProcessor/FieldOutputHandler/DateFieldOutputHandler.php
@@ -41,6 +41,13 @@ class DateFieldOutputHandler extends AbstractSimpleFieldOutputHandler implements
       $this->function = $function;
       $this->inputFieldSpec->setMySqlFunction($availableFunctions[$function]['sql']);
     }
+
+    if ($this->isAggregateField) {
+      $dataFlow = $this->dataSource->ensureField($this->getAggregateFieldSpec());
+      if ($dataFlow) {
+        $dataFlow->addAggregateOutputHandler($this);
+      }
+    }
   }
 
   /**
diff --git a/Civi/DataProcessor/FieldOutputHandler/RawFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/RawFieldOutputHandler.php
index c5e58656..b3f6e668 100644
--- a/Civi/DataProcessor/FieldOutputHandler/RawFieldOutputHandler.php
+++ b/Civi/DataProcessor/FieldOutputHandler/RawFieldOutputHandler.php
@@ -30,6 +30,13 @@ class RawFieldOutputHandler extends AbstractSimpleFieldOutputHandler implements
   public function initialize($alias, $title, $configuration) {
     parent::initialize($alias, $title, $configuration);
     $this->isAggregateField = isset($configuration['is_aggregate']) ? $configuration['is_aggregate'] : false;
+
+    if ($this->isAggregateField) {
+      $dataFlow = $this->dataSource->ensureField($this->getAggregateFieldSpec());
+      if ($dataFlow) {
+        $dataFlow->addAggregateOutputHandler($this);
+      }
+    }
   }
 
   /**
diff --git a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
index db9e1aca..63e4c62d 100644
--- a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
+++ b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
@@ -201,7 +201,7 @@ abstract class AbstractCivicrmEntitySource extends AbstractSource {
   }
 
   /**
-   * Ensure that filter field is accesible in the query
+   * Ensure that filter or aggregate field is accesible in the query
    *
    * @param FieldSpecification $field
    * @return \Civi\DataProcessor\DataFlow\AbstractDataFlow|null
@@ -322,7 +322,6 @@ abstract class AbstractCivicrmEntitySource extends AbstractSource {
    * Ensures a field is in the data source
    *
    * @param \Civi\DataProcessor\DataSpecification\FieldSpecification $fieldSpecification
-   * @return SourceInterface
    * @throws \Exception
    */
   public function ensureFieldInSource(FieldSpecification $fieldSpecification) {
@@ -335,17 +334,13 @@ abstract class AbstractCivicrmEntitySource extends AbstractSource {
           ->getFieldSpecificationByName($fieldSpecification->name);
       }
       if ($originalFieldSpecification && $originalFieldSpecification instanceof CustomFieldSpecification) {
-        $customGroupDataFlow = $this->ensureCustomGroup($originalFieldSpecification->customGroupTableName, $originalFieldSpecification->customGroupName);
-        if (!$customGroupDataFlow->getDataSpecification()
-          ->doesFieldExist($fieldSpecification->alias)) {
-          $customGroupDataFlow->getDataSpecification()
-            ->addFieldSpecification($fieldSpecification->alias, $fieldSpecification);
+        $dataFlow = $this->ensureCustomGroup($originalFieldSpecification->customGroupTableName, $originalFieldSpecification->customGroupName);
+        if (!$dataFlow->getDataSpecification()->doesFieldExist($fieldSpecification->alias)) {
+          $dataFlow->getDataSpecification()->addFieldSpecification($fieldSpecification->alias, $fieldSpecification);
         }
-      }
-      elseif ($originalFieldSpecification) {
-        $entityDataFlow = $this->ensureEntity();
-        $entityDataFlow->getDataSpecification()
-          ->addFieldSpecification($fieldSpecification->alias, $fieldSpecification);
+      } elseif ($originalFieldSpecification) {
+        $dataFlow = $this->ensureEntity();
+        $dataFlow->getDataSpecification()->addFieldSpecification($fieldSpecification->alias, $fieldSpecification);
       }
     } catch (FieldExistsException $e) {
       // Do nothing.
-- 
GitLab