From 64d5405cf4aff54745e426f648b8fb31f370b338 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Tue, 29 Oct 2019 09:27:53 +0100
Subject: [PATCH] first refactor step for issue #16

---
 .../Form/DataProcessorContactSummaryTab.php   |  2 +-
 CRM/Dataprocessor/Utils/DataSourceFields.php  |  8 ++--
 .../DataFlow/MultipleDataFlows/SimpleJoin.php | 24 +++++++-----
 .../DataSpecification/DataSpecification.php   | 38 +++++++++++++++----
 .../AbstractSimpleFieldOutputHandler.php      |  7 +++-
 .../AbstractFieldFilterHandler.php            | 22 ++++++-----
 .../FilterHandler/CaseRoleFilter.php          |  2 +-
 .../FilterHandler/ContactInGroupFilter.php    |  2 +-
 .../FilterHandler/ContactTypeFilter.php       |  2 +-
 .../FilterHandler/ContactWithTagFilter.php    |  2 +-
 .../FilterHandler/MultipleFieldFilter.php     |  6 ++-
 .../PermissionToViewContactFilter.php         |  2 +-
 .../FilterHandler/SimpleSqlFilter.php         |  8 ++--
 .../Source/AbstractCivicrmEntitySource.php    | 18 ++++++---
 Civi/DataProcessor/Source/AbstractSource.php  |  8 ++--
 .../Source/Event/EventSource.php              | 15 +++++---
 Civi/DataProcessor/Source/SourceInterface.php |  4 +-
 17 files changed, 109 insertions(+), 61 deletions(-)

diff --git a/CRM/Contact/Form/DataProcessorContactSummaryTab.php b/CRM/Contact/Form/DataProcessorContactSummaryTab.php
index a36b2f4a..5bb41bc8 100644
--- a/CRM/Contact/Form/DataProcessorContactSummaryTab.php
+++ b/CRM/Contact/Form/DataProcessorContactSummaryTab.php
@@ -138,7 +138,7 @@ class CRM_Contact_Form_DataProcessorContactSummaryTab extends CRM_DataprocessorS
     }
 
     $fieldSpecification->alias = 'contact_summary_tab_contact_id';
-    $dataFlow = $dataSource->ensureField($fieldSpecification->name);
+    $dataFlow = $dataSource->ensureField($fieldSpecification);
     if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
       $whereClause = new SimpleWhereClause($dataFlow->getName(), $fieldSpecification->name, '=', $cid, $fieldSpecification->type);
       $dataFlow->addWhereClause($whereClause);
diff --git a/CRM/Dataprocessor/Utils/DataSourceFields.php b/CRM/Dataprocessor/Utils/DataSourceFields.php
index fc42a888..65f02068 100644
--- a/CRM/Dataprocessor/Utils/DataSourceFields.php
+++ b/CRM/Dataprocessor/Utils/DataSourceFields.php
@@ -46,7 +46,7 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
         $isFieldValid = call_user_func($callback, $field);
       }
       if ($isFieldValid) {
-        $fieldSelect[$namePrefix . $fieldName] = $titlePrefix . $field->title;
+        $fieldSelect[$namePrefix . $field->alias] = $titlePrefix . $field->title;
       }
     }
     return $fieldSelect;
@@ -84,16 +84,16 @@ class CRM_Dataprocessor_Utils_DataSourceFields {
    */
   public static function getAvailableFilterFieldsInDataSource(SourceInterface $dataSource, $titlePrefix='', $namePrefix='', $filterFieldsCallback=null) {
     $fieldSelect = array();
-    foreach($dataSource->getAvailableFilterFields()->getFields() as $fieldName => $field) {
+    foreach($dataSource->getAvailableFilterFields()->getFields() as $field) {
       $isFieldValid = true;
       if ($filterFieldsCallback) {
         $isFieldValid = call_user_func($filterFieldsCallback, $field);
       }
       if ($isFieldValid) {
-        $fieldSelect[$namePrefix . $fieldName] = $titlePrefix . $field->title;
+        $fieldSelect[$namePrefix . $field->alias] = $titlePrefix . $field->title;
       }
     }
     return $fieldSelect;
   }
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/DataFlow/MultipleDataFlows/SimpleJoin.php b/Civi/DataProcessor/DataFlow/MultipleDataFlows/SimpleJoin.php
index 108472b6..1064f61e 100644
--- a/Civi/DataProcessor/DataFlow/MultipleDataFlows/SimpleJoin.php
+++ b/Civi/DataProcessor/DataFlow/MultipleDataFlows/SimpleJoin.php
@@ -261,12 +261,15 @@ class SimpleJoin implements JoinInterface, SqlJoinInterface {
       $this->left_table = $this->left_prefix;
       $this->left_source = $this->dataProcessor->getDataSourceByName($this->left_prefix);
       if ($this->left_source) {
-        $leftTable = $this->left_source->ensureField($this->left_field);
-        if ($leftTable && $leftTable instanceof SqlTableDataFlow) {
-          $this->left_table = $leftTable->getTableAlias();
+        $this->leftFieldSpec = $this->left_source->getAvailableFields()->getFieldSpecificationByAlias($this->left_field);
+        if (!$this->leftFieldSpec) {
+          $this->leftFieldSpec = $this->left_source->getAvailableFields()->getFieldSpecificationByName($this->left_field);
         }
-        $this->leftFieldSpec = $this->left_source->getAvailableFields()->getFieldSpecificationByName($this->left_field);
         if ($this->leftFieldSpec) {
+          $leftTable = $this->left_source->ensureField($this->leftFieldSpec);
+          if ($leftTable && $leftTable instanceof SqlTableDataFlow) {
+            $this->left_table = $leftTable->getTableAlias();
+          }
           $this->left_field_alias = $this->leftFieldSpec->alias;
         }
       }
@@ -275,12 +278,15 @@ class SimpleJoin implements JoinInterface, SqlJoinInterface {
       $this->right_table = $this->right_prefix;
       $this->right_source = $this->dataProcessor->getDataSourceByName($this->right_prefix);
       if ($this->right_source) {
-        $rightTable = $this->right_source->ensureField($this->right_field);
-        if ($rightTable && $rightTable instanceof SqlTableDataFlow) {
-          $this->right_table = $rightTable->getTableAlias();
+        $this->rightFieldSpec = $this->right_source->getAvailableFields()->getFieldSpecificationByAlias($this->right_field);
+        if (!$this->rightFieldSpec) {
+          $this->rightFieldSpec = $this->right_source->getAvailableFields()->getFieldSpecificationByName($this->right_field);
         }
-        $this->rightFieldSpec = $this->right_source->getAvailableFields()->getFieldSpecificationByName($this->right_field);
         if ($this->rightFieldSpec) {
+          $rightTable = $this->right_source->ensureField($this->rightFieldSpec);
+          if ($rightTable && $rightTable instanceof SqlTableDataFlow) {
+            $this->right_table = $rightTable->getTableAlias();
+          }
           $this->right_field_alias = $this->rightFieldSpec->alias;
         }
       }
@@ -402,4 +408,4 @@ class SimpleJoin implements JoinInterface, SqlJoinInterface {
   }
 
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/DataSpecification/DataSpecification.php b/Civi/DataProcessor/DataSpecification/DataSpecification.php
index 88a7b95f..5ec0c846 100644
--- a/Civi/DataProcessor/DataSpecification/DataSpecification.php
+++ b/Civi/DataProcessor/DataSpecification/DataSpecification.php
@@ -29,10 +29,15 @@ class DataSpecification {
    * @throws \Civi\DataProcessor\DataSpecification\FieldExistsException
    */
   public function addFieldSpecification($name, FieldSpecification $field) {
-    if (isset($this->fields[$name])) {
+    if (in_array($field, $this->fields)) {
       throw new FieldExistsException($name);
     }
-    $this->fields[$name] = $field;
+    $this->fields[] = $field;
+
+    /*if (isset($this->fields[$name])) {
+      throw new FieldExistsException($name);
+    }
+    $this->fields[$name] = $field;*/
     return $this;
   }
 
@@ -48,8 +53,10 @@ class DataSpecification {
    * @return \Civi\DataProcessor\DataSpecification\FieldSpecification
    */
   public function getFieldSpecificationByName($name) {
-    if (isset($this->fields[$name])) {
-      return $this->fields[$name];
+    foreach($this->fields as $field) {
+      if ($field->name == $name) {
+        return $field;
+      }
     }
     return null;
   }
@@ -74,8 +81,25 @@ class DataSpecification {
    * @return bool
    */
   public function doesFieldExist($name) {
-    if (isset($this->fields[$name])) {
-      return true;
+    foreach($this->fields as $field) {
+      if ($field->name == $name) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Returns whether a field exists
+   *
+   * @param $alias
+   * @return bool
+   */
+  public function doesAliasExists($alias) {
+    foreach($this->fields as $field) {
+      if ($field->alias == $alias) {
+        return true;
+      }
     }
     return false;
   }
@@ -97,4 +121,4 @@ class DataSpecification {
     return $this;
   }
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/FieldOutputHandler/AbstractSimpleFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/AbstractSimpleFieldOutputHandler.php
index c1cd5fda..9c7aac3d 100644
--- a/Civi/DataProcessor/FieldOutputHandler/AbstractSimpleFieldOutputHandler.php
+++ b/Civi/DataProcessor/FieldOutputHandler/AbstractSimpleFieldOutputHandler.php
@@ -66,7 +66,10 @@ class AbstractSimpleFieldOutputHandler extends AbstractFieldOutputHandler implem
     if (!$this->dataSource) {
       throw new DataSourceNotFoundException(E::ts("Field %1 requires data source '%2' which could not be found. Did you rename or deleted the data source?", array(1=>$title, 2=>$configuration['datasource'])));
     }
-    $this->inputFieldSpec = clone $this->dataSource->getAvailableFields()->getFieldSpecificationByName($configuration['field']);
+    $this->inputFieldSpec = $this->dataSource->getAvailableFields()->getFieldSpecificationByAlias($configuration['field']);
+    if (!$this->inputFieldSpec) {
+      $this->inputFieldSpec = $this->dataSource->getAvailableFields()->getFieldSpecificationByName($configuration['field']);
+    }
     if (!$this->inputFieldSpec) {
       throw new FieldNotFoundException(E::ts("Field %1 requires a field with the name '%2' in the data source '%3'. Did you change the data source type?", array(
         1 => $title,
@@ -74,7 +77,7 @@ class AbstractSimpleFieldOutputHandler extends AbstractFieldOutputHandler implem
         3 => $configuration['datasource']
       )));
     }
-    $this->inputFieldSpec->alias = $alias;
+    $this->inputFieldSpec = clone $this->inputFieldSpec;
     $this->dataSource->ensureFieldInSource($this->inputFieldSpec);
 
     $this->outputFieldSpec = clone $this->inputFieldSpec;
diff --git a/Civi/DataProcessor/FilterHandler/AbstractFieldFilterHandler.php b/Civi/DataProcessor/FilterHandler/AbstractFieldFilterHandler.php
index 6b150c9b..c266246b 100644
--- a/Civi/DataProcessor/FilterHandler/AbstractFieldFilterHandler.php
+++ b/Civi/DataProcessor/FilterHandler/AbstractFieldFilterHandler.php
@@ -18,6 +18,11 @@ abstract class AbstractFieldFilterHandler extends AbstractFilterHandler {
    */
   protected $fieldSpecification;
 
+  /**
+   * @var \Civi\DataProcessor\DataSpecification\FieldSpecification
+   */
+  protected $inputFieldSpecification;
+
   /**
    * @var \Civi\DataProcessor\Source\SourceInterface
    */
@@ -40,21 +45,18 @@ abstract class AbstractFieldFilterHandler extends AbstractFilterHandler {
     if (!$this->dataSource) {
       throw new DataSourceNotFoundException(E::ts("Filter %1 requires data source '%2' which could not be found. Did you rename or deleted the data source?", array(1=>$this->title, 2=>$datasource_name)));
     }
-    if (!$this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($field_name)) {
-      throw new FieldNotFoundException(E::ts("Filter %1 requires a field with the name '%2' in the data source '%3'. Did you change the data source type?", array(
-        1 => $this->title,
-        2 => $field_name,
-        3 => $datasource_name
-      )));
+    $this->inputFieldSpecification = $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByAlias($field_name);
+    if (!$this->inputFieldSpecification) {
+      $this->inputFieldSpecification = $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($field_name);
     }
-    $this->fieldSpecification  =  clone $this->dataSource->getAvailableFilterFields()->getFieldSpecificationByName($field_name);
-    if (!$this->fieldSpecification) {
+    if (!$this->inputFieldSpecification) {
       throw new FieldNotFoundException(E::ts("Filter %1 requires a field with the name '%2' in the data source '%3'. Did you change the data source type?", array(
         1 => $this->title,
         2 => $field_name,
         3 => $datasource_name
       )));
     }
+    $this->fieldSpecification = clone $this->inputFieldSpecification;
     $this->fieldSpecification->alias = $this->alias;
     $this->fieldSpecification->title = $this->title;
   }
@@ -77,7 +79,7 @@ abstract class AbstractFieldFilterHandler extends AbstractFilterHandler {
     if (!$this->isInitialized()) {
       return;
     }
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     if ($dataFlow && $dataFlow instanceof SqlDataFlow && $this->whereClause) {
       $dataFlow->removeWhereClause($this->whereClause);
       unset($this->whereClause);
@@ -92,7 +94,7 @@ abstract class AbstractFieldFilterHandler extends AbstractFilterHandler {
    */
   public function setFilter($filter) {
     $this->resetFilter();
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
       $value = $filter['value'];
       if (!is_array($value)) {
diff --git a/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php b/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php
index eedfab61..914f1553 100644
--- a/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php
+++ b/Civi/DataProcessor/FilterHandler/CaseRoleFilter.php
@@ -58,7 +58,7 @@ class CaseRoleFilter extends AbstractFieldFilterHandler {
   public function setFilter($filter) {
     $this->resetFilter();
 
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     $cids = $filter['value'];
     if (!is_array($cids)) {
       $cids = array($cids);
diff --git a/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php b/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php
index 31c85b2a..f082532a 100644
--- a/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php
+++ b/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php
@@ -49,7 +49,7 @@ class ContactInGroupFilter extends AbstractFieldFilterHandler {
    */
   public function setFilter($filter) {
     $this->resetFilter();
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     $group_ids = $filter['value'];
     if (!is_array($group_ids)) {
       $group_ids = array($group_ids);
diff --git a/Civi/DataProcessor/FilterHandler/ContactTypeFilter.php b/Civi/DataProcessor/FilterHandler/ContactTypeFilter.php
index af4f9906..1dd4a8b2 100644
--- a/Civi/DataProcessor/FilterHandler/ContactTypeFilter.php
+++ b/Civi/DataProcessor/FilterHandler/ContactTypeFilter.php
@@ -33,7 +33,7 @@ class ContactTypeFilter extends AbstractFieldFilterHandler {
    */
   public function setFilter($filter) {
     $this->resetFilter();
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     $contactTypeIds = $filter['value'];
     if (!is_array($contactTypeIds)) {
       $contactTypeIds = explode(",", $contactTypeIds);
diff --git a/Civi/DataProcessor/FilterHandler/ContactWithTagFilter.php b/Civi/DataProcessor/FilterHandler/ContactWithTagFilter.php
index 6148422c..765d0cd8 100644
--- a/Civi/DataProcessor/FilterHandler/ContactWithTagFilter.php
+++ b/Civi/DataProcessor/FilterHandler/ContactWithTagFilter.php
@@ -33,7 +33,7 @@ class ContactWithTagFilter extends AbstractFieldFilterHandler {
    */
   public function setFilter($filter) {
     $this->resetFilter();
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     $tag_ids = $filter['value'];
     if (!is_array($tag_ids)) {
       $tag_ids = array($tag_ids);
diff --git a/Civi/DataProcessor/FilterHandler/MultipleFieldFilter.php b/Civi/DataProcessor/FilterHandler/MultipleFieldFilter.php
index 98c17cd4..876457ef 100644
--- a/Civi/DataProcessor/FilterHandler/MultipleFieldFilter.php
+++ b/Civi/DataProcessor/FilterHandler/MultipleFieldFilter.php
@@ -179,7 +179,11 @@ class MultipleFieldFilter extends AbstractFilterHandler {
     foreach($this->configuration['fields'] as $fieldAndDataSource) {
       list($datasource_name, $field_name) = explode("::", $fieldAndDataSource);
       $dataSource = $this->data_processor->getDataSourceByName($datasource_name);
-      $dataFlow = $dataSource->ensureField($field_name);
+      $fieldSpec = $dataSource->getAvailableFields()->getFieldSpecificationByAlias($field_name);
+      if (!$fieldSpec) {
+        $fieldSpec = $dataSource->getAvailableFields()->getFieldSpecificationByName($field_name);
+      }
+      $dataFlow = $dataSource->ensureField($fieldSpec);
       if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
         $clauses[] = new SqlDataFlow\SimpleWhereClause($dataFlow->getName(), $field_name, $filterParams['op'], $filterParams['value'], $this->fieldSpecification->type);
       }
diff --git a/Civi/DataProcessor/FilterHandler/PermissionToViewContactFilter.php b/Civi/DataProcessor/FilterHandler/PermissionToViewContactFilter.php
index 581e9e47..144332c2 100644
--- a/Civi/DataProcessor/FilterHandler/PermissionToViewContactFilter.php
+++ b/Civi/DataProcessor/FilterHandler/PermissionToViewContactFilter.php
@@ -42,7 +42,7 @@ class PermissionToViewContactFilter extends AbstractFieldFilterHandler {
    */
   public function setFilter($filter) {
     $this->resetFilter();
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification);
     $where = $this->getAclWhereClause();
     $contactTableAlias = 'civicrm_contact_'.$this->fieldSpecification->alias;
     $where = str_replace(["`contact_a`.", "contact_a."], "`{$contactTableAlias}`.", $where);
diff --git a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php
index e2539e51..7fd84c14 100644
--- a/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php
+++ b/Civi/DataProcessor/FilterHandler/SimpleSqlFilter.php
@@ -34,12 +34,12 @@ class SimpleSqlFilter extends AbstractFieldFilterHandler {
    */
   public function setFilter($filter) {
     $this->resetFilter();
-    $dataFlow  = $this->dataSource->ensureField($this->fieldSpecification->name);
+    $dataFlow  = $this->dataSource->ensureField($this->inputFieldSpecification);
     if ($dataFlow && $dataFlow instanceof SqlDataFlow) {
       if ($this->isMultiValueField()) {
-        $this->whereClause = new SqlDataFlow\MultiValueFieldWhereClause($dataFlow->getName(), $this->fieldSpecification->name, $filter['op'], $filter['value'], $this->fieldSpecification->type);
+        $this->whereClause = new SqlDataFlow\MultiValueFieldWhereClause($dataFlow->getName(), $this->inputFieldSpecification->name, $filter['op'], $filter['value'], $this->inputFieldSpecification->type);
       } else {
-        $this->whereClause = new SqlDataFlow\SimpleWhereClause($dataFlow->getName(), $this->fieldSpecification->name, $filter['op'], $filter['value'], $this->fieldSpecification->type);
+        $this->whereClause = new SqlDataFlow\SimpleWhereClause($dataFlow->getName(), $this->inputFieldSpecification->name, $filter['op'], $filter['value'], $this->inputFieldSpecification->type);
       }
       $dataFlow->addWhereClause($this->whereClause);
     }
@@ -115,4 +115,4 @@ class SimpleSqlFilter extends AbstractFieldFilterHandler {
   }
 
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
index 8f327361..1d600573 100644
--- a/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
+++ b/Civi/DataProcessor/Source/AbstractCivicrmEntitySource.php
@@ -198,13 +198,19 @@ abstract class AbstractCivicrmEntitySource extends AbstractSource {
   /**
    * Ensure that filter field is accesible in the query
    *
-   * @param String $fieldName
+   * @param FieldSpecification $field
    * @return \Civi\DataProcessor\DataFlow\AbstractDataFlow|null
    * @throws \Exception
    */
-  public function ensureField($fieldName) {
-    if ($this->getAvailableFilterFields()->doesFieldExist($fieldName)) {
-      $spec = $this->getAvailableFilterFields()->getFieldSpecificationByName($fieldName);
+  public function ensureField(FieldSpecification $field) {
+    if ($this->getAvailableFilterFields()->doesAliasExists($field->alias)) {
+      $spec = $this->getAvailableFilterFields()->getFieldSpecificationByAlias($field->alias);
+      if ($spec instanceof CustomFieldSpecification) {
+        return $this->ensureCustomGroup($spec->customGroupTableName, $spec->customGroupName);
+      }
+      return $this->ensureEntity();
+    } elseif ($this->getAvailableFilterFields()->doesFieldExist($field->name)) {
+      $spec = $this->getAvailableFilterFields()->getFieldSpecificationByName($field->name);
       if ($spec instanceof CustomFieldSpecification) {
         return $this->ensureCustomGroup($spec->customGroupTableName, $spec->customGroupName);
       }
@@ -316,8 +322,8 @@ abstract class AbstractCivicrmEntitySource extends AbstractSource {
    */
   public function ensureFieldInSource(FieldSpecification $fieldSpecification) {
     try {
-      if ($this->getAvailableFields()->doesFieldExist($fieldSpecification->name)) {
-        $originalFieldSpecification = $this->getAvailableFields()->getFieldSpecificationByName($fieldSpecification->name);
+      if ($this->getAvailableFields()->doesAliasExists($fieldSpecification->alias)) {
+        $originalFieldSpecification = $this->getAvailableFields()->getFieldSpecificationByAlias($fieldSpecification->alias);
         if ($originalFieldSpecification instanceof CustomFieldSpecification) {
           $customGroupDataFlow = $this->ensureCustomGroup($originalFieldSpecification->customGroupTableName, $originalFieldSpecification->customGroupName);
           if (!$customGroupDataFlow->getDataSpecification()
diff --git a/Civi/DataProcessor/Source/AbstractSource.php b/Civi/DataProcessor/Source/AbstractSource.php
index 4bdb71b0..0182c2dd 100644
--- a/Civi/DataProcessor/Source/AbstractSource.php
+++ b/Civi/DataProcessor/Source/AbstractSource.php
@@ -127,15 +127,15 @@ abstract class AbstractSource implements SourceInterface {
   /**
    * Ensure that filter field is accesible in the query
    *
-   * @param String $fieldName
+   * @param FieldSpecification $field
    * @return \Civi\DataProcessor\DataFlow\AbstractDataFlow|null
    * @throws \Exception
    */
-  public function ensureField($fieldName) {
-    $field = $this->getAvailableFields()->getFieldSpecificationByName($fieldName);
+  public function ensureField(FieldSpecification $field) {
+    $field = $this->getAvailableFields()->getFieldSpecificationByAlias($field->alias);
     if ($field) {
       $this->dataFlow->getDataSpecification()
-        ->addFieldSpecification($fieldName, $field);
+        ->addFieldSpecification($field->name, $field);
     }
     return $this->dataFlow;
   }
diff --git a/Civi/DataProcessor/Source/Event/EventSource.php b/Civi/DataProcessor/Source/Event/EventSource.php
index 523f9745..31048dfd 100644
--- a/Civi/DataProcessor/Source/Event/EventSource.php
+++ b/Civi/DataProcessor/Source/Event/EventSource.php
@@ -82,19 +82,22 @@ class EventSource extends AbstractCivicrmEntitySource {
   /**
    * Ensure that filter field is accesible in the query
    *
-   * @param String $fieldName
+   * @param FieldSpecification $field
    * @return \Civi\DataProcessor\DataFlow\AbstractDataFlow|null
    * @throws \Exception
    */
-  public function ensureField($fieldName) {
-    if ($this->getAvailableFilterFields()->doesFieldExist($fieldName)) {
-      $spec = $this->getAvailableFilterFields()->getFieldSpecificationByName($fieldName);
+  public function ensureField(FieldSpecification $field) {
+    if ($this->getAvailableFilterFields()->doesAliasExists($field->alias) || $this->getAvailableFilterFields()->doesFieldExist($field->name)) {
+      $spec = $this->getAvailableFilterFields()->getFieldSpecificationByAlias($field->alias);
+      if (!$spec) {
+        $spec = $this->getAvailableFilterFields()->getFieldSpecificationByName($field->name);
+      }
       if (stripos($spec->alias, $this->getSourceName().'_locblock_') === 0) {
         $this->ensureEntity();
         return $this->locBlockDataFlow;
       }
     }
-    return parent::ensureField($fieldName);
+    return parent::ensureField($field);
   }
 
   /**
@@ -113,4 +116,4 @@ class EventSource extends AbstractCivicrmEntitySource {
     }
   }
 
-}
\ No newline at end of file
+}
diff --git a/Civi/DataProcessor/Source/SourceInterface.php b/Civi/DataProcessor/Source/SourceInterface.php
index e8a8e663..66846a0f 100644
--- a/Civi/DataProcessor/Source/SourceInterface.php
+++ b/Civi/DataProcessor/Source/SourceInterface.php
@@ -71,11 +71,11 @@ interface SourceInterface {
   /**
    * Ensure that filter field is accesible in the query
    *
-   * @param String $fieldName
+   * @param FieldSpecification $field
    * @return \Civi\DataProcessor\DataFlow\AbstractDataFlow|null
    * @throws \Exception
    */
-  public function ensureField($fieldName);
+  public function ensureField(FieldSpecification $field);
 
   /**
    * Ensures a field is in the data source
-- 
GitLab