<?php
/**
 * @author Jaap Jansma <jaap.jansma@civicoop.org>
 * @license AGPL-3.0
 */

namespace Civi\DataProcessor\DataSpecification;

interface SqlFieldSpecification {

  /**
   * Returns the select statement for this field.
   * E.g. COUNT(civicrm_contact.id) AS contact_id_count
   *
   * @param bool $isCountQuery
   * @param String $table_alias
   * @return String
   */
  public function getSqlSelectStatement($table_alias, bool $isCountQuery = false);

  /**
   * Returns the group by statement for this field.
   * E.g. civicrm_contribution.financial_type_id
   * or MONTH(civicrm_contribution.receive_date)
   *
   * @param String $table_alias
   * @return String
   */
  public function getSqlGroupByStatement($table_alias);

  /**
   * Returns the order by statement for this field
   * Often this will be just the field, but for calculations it can
   * be something else
   *
   * @return String
   */
  public function getSqlOrderBy();

  /**
   * Returns the SQL column name for this field.
   * This could be used in join statements
   *
   * @param $table_alias
   * @return string
   */
  public function getSqlColumnName($table_alias);

}
