From 7dae749f71fb75625ad2ed6f52f695c53e0def51 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Mon, 17 Jun 2019 15:34:55 +0200
Subject: [PATCH] fixed minor bugs

---
 CRM/Dataprocessor/Utils/DataSourceFields.php  | 20 +++++++++----------
 Civi/DataProcessor/DataFlow/SqlDataFlow.php   |  8 ++------
 .../CountFieldSpecification.php               |  2 +-
 Civi/DataProcessor/Output/Api.php             |  1 +
 4 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/CRM/Dataprocessor/Utils/DataSourceFields.php b/CRM/Dataprocessor/Utils/DataSourceFields.php
index 5bd7efa6..fc42a888 100644
--- a/CRM/Dataprocessor/Utils/DataSourceFields.php
+++ b/CRM/Dataprocessor/Utils/DataSourceFields.php
@@ -17,12 +17,12 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
    * @return array
    * @throws \Exception
    */
-  public static function getAvailableFieldsInDataSources($dataProcessorId, $filterFieldsCallback=null) {
+  public static function getAvailableFieldsInDataSources($dataProcessorId, $callback=null) {
     $dataProcessor = civicrm_api3('DataProcessor', 'getsingle', array('id' => $dataProcessorId));
     $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
     $fieldSelect = array();
     foreach($dataProcessorClass->getDataSources() as $dataSource) {
-      $fieldSelect = array_merge($fieldSelect, self::getAvailableFieldsInDataSource($dataSource, $dataSource->getSourceTitle().' :: ', $dataSource->getSourceName().'::', $filterFieldsCallback));
+      $fieldSelect = array_merge($fieldSelect, self::getAvailableFieldsInDataSource($dataSource, $dataSource->getSourceTitle().' :: ', $dataSource->getSourceName().'::', $callback));
     }
     return $fieldSelect;
   }
@@ -38,15 +38,15 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
    * @return array
    * @throws \Exception
    */
-  public static function getAvailableFieldsInDataSource(SourceInterface $dataSource, $titlePrefix='', $namePrefix='', $filterFieldsCallback=null) {
+  public static function getAvailableFieldsInDataSource(SourceInterface $dataSource, $titlePrefix='', $namePrefix='', $callback=null) {
     $fieldSelect = array();
-    foreach($dataSource->getAvailableFields()->getFields() as $field) {
+    foreach($dataSource->getAvailableFields()->getFields() as $fieldName => $field) {
       $isFieldValid = true;
-      if ($filterFieldsCallback) {
-        $isFieldValid = call_user_func($filterFieldsCallback, $field);
+      if ($callback) {
+        $isFieldValid = call_user_func($callback, $field);
       }
       if ($isFieldValid) {
-        $fieldSelect[$namePrefix . $field->name] = $titlePrefix . $field->title;
+        $fieldSelect[$namePrefix . $fieldName] = $titlePrefix . $field->title;
       }
     }
     return $fieldSelect;
@@ -66,7 +66,7 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
     $dataProcessorClass = \CRM_Dataprocessor_BAO_DataProcessor::dataProcessorToClass($dataProcessor);
     $fieldSelect = array();
     foreach($dataProcessorClass->getDataSources() as $dataSource) {
-      $fieldSelect = array_merge($fieldSelect, self::getAvailableFieldsInDataSource($dataSource, $dataSource->getSourceTitle().' :: ', $dataSource->getSourceName().'::', $filterFieldsCallback));
+      $fieldSelect = array_merge($fieldSelect, self::getAvailableFilterFieldsInDataSource($dataSource, $dataSource->getSourceTitle().' :: ', $dataSource->getSourceName().'::', $filterFieldsCallback));
     }
     return $fieldSelect;
   }
@@ -84,13 +84,13 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
    */
   public static function getAvailableFilterFieldsInDataSource(SourceInterface $dataSource, $titlePrefix='', $namePrefix='', $filterFieldsCallback=null) {
     $fieldSelect = array();
-    foreach($dataSource->getAvailableFilterFields()->getFields() as $field) {
+    foreach($dataSource->getAvailableFilterFields()->getFields() as $fieldName => $field) {
       $isFieldValid = true;
       if ($filterFieldsCallback) {
         $isFieldValid = call_user_func($filterFieldsCallback, $field);
       }
       if ($isFieldValid) {
-        $fieldSelect[$namePrefix . $field->name] = $titlePrefix . $field->title;
+        $fieldSelect[$namePrefix . $fieldName] = $titlePrefix . $field->title;
       }
     }
     return $fieldSelect;
diff --git a/Civi/DataProcessor/DataFlow/SqlDataFlow.php b/Civi/DataProcessor/DataFlow/SqlDataFlow.php
index 95a9f24b..f5142df0 100644
--- a/Civi/DataProcessor/DataFlow/SqlDataFlow.php
+++ b/Civi/DataProcessor/DataFlow/SqlDataFlow.php
@@ -84,12 +84,8 @@ abstract class SqlDataFlow extends AbstractDataFlow {
       $this->sqlCountStatements[] = $countSql;
       $countDao = \CRM_Core_DAO::executeQuery($countSql);
       $this->count = 0;
-      if (count($this->getFieldsForGroupByStatement()) > 0) {
-        $this->count = $countDao->N;
-      } else {
-        while ($countDao->fetch()) {
-          $this->count = $this->count + $countDao->count;
-        }
+      while ($countDao->fetch()) {
+        $this->count = $this->count + $countDao->count;
       }
 
       // Build Limit and Offset.
diff --git a/Civi/DataProcessor/DataSpecification/CountFieldSpecification.php b/Civi/DataProcessor/DataSpecification/CountFieldSpecification.php
index c75ed757..47d06604 100644
--- a/Civi/DataProcessor/DataSpecification/CountFieldSpecification.php
+++ b/Civi/DataProcessor/DataSpecification/CountFieldSpecification.php
@@ -16,7 +16,7 @@ class CountFieldSpecification extends FieldSpecification {
    * @return string
    */
   public function getSqlSelectStatement($table_alias) {
-    return "COUNT(`{$table_alias}`.`{$this->name}`) AS `{$this->alias}`";
+    return "COUNT(DISTINCT `{$table_alias}`.`{$this->name}`) AS `{$this->alias}`";
   }
 
 }
\ No newline at end of file
diff --git a/Civi/DataProcessor/Output/Api.php b/Civi/DataProcessor/Output/Api.php
index 6aec2973..9817db18 100644
--- a/Civi/DataProcessor/Output/Api.php
+++ b/Civi/DataProcessor/Output/Api.php
@@ -386,6 +386,7 @@ class Api implements OutputInterface, API_ProviderInterface, EventSubscriberInte
       if (isset($params['debug']) && $params['debug']) {
         $return['debug_info'] = $dataProcessorClass->getDataFlow()->getDebugInformation();
       }
+
       return $return;
     }
   }
-- 
GitLab