Metadata fix in activity search
authoreileen <emcnaughton@wikimedia.org>
Fri, 21 Aug 2020 05:20:58 +0000 (17:20 +1200)
committereileen <emcnaughton@wikimedia.org>
Fri, 21 Aug 2020 05:20:58 +0000 (17:20 +1200)
This fixes it such that even if the pseudofield (activity_type) has a 'type' the 'type'
from the 'real field' is used in the WHERE query. This mostly prevents a test fail per

https://github.com/civicrm/civicrm-core/pull/18147

if we improve the metadata. It's a bit of a non-fail fail - ie we are checking the where
clause has activity_type_id = 3 vs '3' and my testing has not shown a performance difference
but we don't want the test to be changed to the less good version

CRM/Activity/BAO/Query.php
CRM/Contact/BAO/Query.php

index 20dd823853c06cb64948ad0acfe03f51c391d9be..d432467e8d40c2ad7f176fff366af0aace58cb45 100644 (file)
@@ -189,7 +189,7 @@ class CRM_Activity_BAO_Query {
         // We no longer expect "subject" as a specific criteria (as of CRM-19447),
         // but we still use activity_subject in Activity.Get API
       case 'activity_subject':
-        $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($fieldSpec['where'], $op, $value, CRM_Utils_Type::typeToString($fieldSpec['type']));
+        $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($fieldSpec['where'], $op, $value, $query->getDataTypeForRealField($name));
         $query->_qill[$grouping][]  = $query->getQillForField($fieldSpec['is_pseudofield_for'] ?? $fieldSpec['name'], $value, $op, $fieldSpec);
         break;
 
index 6f8c8fc893baf5d299bcfbb137558e7f7db23cbc..3fe9a97fc22241580994ed26bd2d46541be9cbb4 100644 (file)
@@ -6941,6 +6941,17 @@ AND   displayRelType.is_active = 1
     return $field;
   }
 
+  /**
+   * Get the field datatype, using the type in the database rather than the pseudofield, if a pseudofield.
+   *
+   * @param string $fieldName
+   *
+   * @return string
+   */
+  public function getDataTypeForRealField($fieldName) {
+    return CRM_Utils_Type::typeToString($this->getMetadataForRealField($fieldName)['type']);
+  }
+
   /**
    * If we have a field that is better rendered via the pseudoconstant handled them here.
    *