diff --git a/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php b/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php index 96a66ff75f5e195dadef0cf43c702f9430632935..81fa6565a234f9168b2aa13c18733401e9646e03 100644 --- a/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php +++ b/Civi/DataProcessor/FilterHandler/ContactInGroupFilter.php @@ -54,6 +54,12 @@ class ContactInGroupFilter extends AbstractFieldFilterHandler { if (!is_array($group_ids)) { $group_ids = array($group_ids); } + + // If the groups are smartgroups (saved searches) they may be out of date. + // This triggers a check (and rebuild if necessary). + \CRM_Contact_BAO_GroupContactCache::check($group_ids); + + // Look in the group contact table $groupTableAlias = 'civicrm_group_contact_'.$this->inputFieldSpecification->alias; $groupFilters = array( new SqlDataFlow\SimpleWhereClause($groupTableAlias, 'status', '=', 'Added'), @@ -68,11 +74,40 @@ class ContactInGroupFilter extends AbstractFieldFilterHandler { $groupFilters, $dataFlow->getName(), $this->inputFieldSpecification->name, - 'IN' + $filter['op'] + ); + $whereClauses[] = $this->whereClause; + } + + // Now look in the smartgroup group contact table + $groupTableAlias = 'civicrm_group_contact_cache_'.$this->inputFieldSpecification->alias; + $groupFilters = array( + new SqlDataFlow\SimpleWhereClause($groupTableAlias, 'group_id', 'IN', $group_ids), + ); + + if ($dataFlow && $dataFlow instanceof SqlDataFlow) { + $this->whereClause = new SqlDataFlow\InTableWhereClause( + 'contact_id', + 'civicrm_group_contact_cache', + $groupTableAlias, + $groupFilters, + $dataFlow->getName(), + $this->inputFieldSpecification->name, + $filter['op'] ); - $dataFlow->addWhereClause($this->whereClause); + $whereClauses[] = $this->whereClause; + } + switch ($filter['op']) { + case 'IN': + $this->whereClause = new SqlDataFlow\OrClause($whereClauses); + break; + + case 'NOT IN': + $this->whereClause = new SqlDataFlow\AndClause($whereClauses); + break; } + $dataFlow->addWhereClause($this->whereClause); } /**