Merge pull request #17150 from civicrm/5.25
[civicrm-core.git] / Civi / Api4 / Generic / DAOGetAction.php
index c7472969f48b4a0683b34f30f1c0e7aeef364969..ab7d85b966d3ab1802b2b0dd2219a95f54b34854 100644 (file)
 
 namespace Civi\Api4\Generic;
 
+use Civi\Api4\Query\Api4SelectQuery;
+
 /**
  * Retrieve $ENTITIES based on criteria specified in the `where` parameter.
  *
  * Use the `select` param to determine which fields are returned, defaults to `[*]`.
  *
  * Perform joins on other related entities using a dot notation.
+ *
+ * @method $this setHaving(array $clauses)
+ * @method array getHaving()
  */
 class DAOGetAction extends AbstractGetAction {
   use Traits\DAOActionTrait;
@@ -42,10 +47,79 @@ class DAOGetAction extends AbstractGetAction {
    */
   protected $select = [];
 
+  /**
+   * Field(s) by which to group the results.
+   *
+   * @var array
+   */
+  protected $groupBy = [];
+
+  /**
+   * Clause for filtering results after grouping and filters are applied.
+   *
+   * Each expression should correspond to an item from the SELECT array.
+   *
+   * @var array
+   */
+  protected $having = [];
+
   public function _run(Result $result) {
     $this->setDefaultWhereClause();
     $this->expandSelectClauseWildcards();
     $result->exchangeArray($this->getObjects());
   }
 
+  /**
+   * @return array|int
+   */
+  protected function getObjects() {
+    $query = new Api4SelectQuery($this);
+
+    $result = $query->run();
+    if (is_array($result)) {
+      \CRM_Utils_API_HTMLInputCoder::singleton()->decodeRows($result);
+    }
+    return $result;
+  }
+
+  /**
+   * @return array
+   */
+  public function getGroupBy(): array {
+    return $this->groupBy;
+  }
+
+  /**
+   * @param array $groupBy
+   * @return $this
+   */
+  public function setGroupBy(array $groupBy) {
+    $this->groupBy = $groupBy;
+    return $this;
+  }
+
+  /**
+   * @param string $field
+   * @return $this
+   */
+  public function addGroupBy(string $field) {
+    $this->groupBy[] = $field;
+    return $this;
+  }
+
+  /**
+   * @param string $expr
+   * @param string $op
+   * @param mixed $value
+   * @return $this
+   * @throws \API_Exception
+   */
+  public function addHaving(string $expr, string $op, $value = NULL) {
+    if (!in_array($op, \CRM_Core_DAO::acceptedSQLOperators())) {
+      throw new \API_Exception('Unsupported operator');
+    }
+    $this->having[] = [$expr, $op, $value];
+    return $this;
+  }
+
 }