public function __construct($name, $value, $params)
 {
     Charcoal_ParamTrait::validateString(1, $name);
     Charcoal_ParamTrait::validateString(2, $value);
     Charcoal_ParamTrait::validateVector(3, $params);
     $this->name = us($name);
     $this->value = us($value);
     $this->params = uv($params);
 }
 /**
  * Constructor
  */
 public function __construct($page_info, $where = NULL, $params = NULL, $order_by = NULL, $group_by = NULL)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_DBPageInfo', $page_info);
     Charcoal_ParamTrait::validateString(2, $where, TRUE);
     Charcoal_ParamTrait::validateVector(2, $params, TRUE);
     Charcoal_ParamTrait::validateString(3, $order_by, TRUE);
     Charcoal_ParamTrait::validateString(4, $group_by, TRUE);
     $this->page_info = $page_info;
     $page = $page_info->getPage();
     $page_size = $page_info->getPageSize();
     $page = ui($page);
     $page_size = ui($page_size);
     $limit = $page_size;
     $offset = ($page - 1) * $page_size;
     parent::__construct($where, $params, $order_by, $limit, $offset, $group_by);
 }
 /**
  *    real implementation of Charcoal_SmartGateway::insertAll()
  *
  * @param Charcoal_String|string $comment                comment text
  * @param string|Charcoal_QueryTarget $query_target      description about target model, alias, or joins
  * @param array|Charcoal_Vector $data_set                array of array or DTO value to insert
  *
  * @return integer count of affected rows
  */
 public function insertAll($comment, $query_target, $data_set)
 {
     Charcoal_ParamTrait::validateString(1, $comment, TRUE);
     Charcoal_ParamTrait::validateIsA(2, 'Charcoal_QueryTarget', $query_target);
     Charcoal_ParamTrait::validateVector(3, $data_set);
     $model = $this->getModel($query_target->getModelName());
     $alias = $query_target->getAlias();
     list($sql, $params) = $this->sql_builder->buildBulkInsertSQL($model, $alias, $data_set);
     $sql = !empty($comment) ? $this->sql_builder->prependComment($sql, $comment) : $sql;
     $this->data_source->prepareExecute($sql, $params);
     return $this->data_source->numRows();
 }
 /**
  *    Generate RDBMS-specific SQL for MIN/MAX/SUM/COUNT/AVG
  *
  *    @param Charcoal_ITableModel $model        table model object related with th query
  *    @param string $alias                      table model alias which is specified by $model
  *    @param int $aggregate_func                specify aggregate function which is defined in Charcoal_EnumSQLAggregateFunc
  *    @param Charcoal_SQLCriteria $criteria     criteria which should be used in WHERE clause
  *    @param array $joins                       list of join(list of Charcoal_QueryJoin object)
  *    @param array $fields                      list of fields which will be returned in query result
  *
  *    @return string                            SQL
  */
 public function buildAggregateSQL($model, $alias, $aggregate_func, $criteria, $joins, $fields = NULL)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_ITableModel', $model);
     Charcoal_ParamTrait::validateString(2, $alias, TRUE);
     Charcoal_ParamTrait::validateInteger(3, $aggregate_func);
     Charcoal_ParamTrait::validateIsA(4, 'Charcoal_SQLCriteria', $criteria);
     Charcoal_ParamTrait::validateVector(5, $joins);
     Charcoal_ParamTrait::validateVector(6, $fields, TRUE);
     $table_name = $model->getTableName();
     /** @var int $aggregate_func */
     $aggregate_func = ui($aggregate_func);
     $aggregate_func_map = array(Charcoal_EnumSQLAggregateFunc::FUNC_MIN => 'MIN', Charcoal_EnumSQLAggregateFunc::FUNC_MAX => 'MAX', Charcoal_EnumSQLAggregateFunc::FUNC_SUM => 'SUM', Charcoal_EnumSQLAggregateFunc::FUNC_COUNT => 'COUNT', Charcoal_EnumSQLAggregateFunc::FUNC_AVG => 'AVG');
     $func = $aggregate_func_map[$aggregate_func];
     $fields = v($fields)->join(",");
     $sql = "SELECT {$func}({$fields}) FROM " . us($table_name);
     if ($alias && !empty($alias)) {
         $sql .= ' AS ' . $alias;
     }
     foreach ($joins as $join) {
         /** @var Charcoal_QueryJoin $join */
         $join_type = $join->getJoinType();
         $join_model_name = $join->getModelName();
         $join_alias = $join->getAlias();
         $join_cond = $join->getCondition();
         $join_model = $this->getSandbox()->createObject($join_model_name, 'table_model');
         /** @var Charcoal_ITableModel $join_model */
         /** @var Charcoal_String $join_alias */
         /** @var Charcoal_String $join_cond */
         switch ($join_type) {
             case Charcoal_EnumSQLJoinType::INNER_JOIN:
                 $sql .= ' INNER JOIN ' . $join_model->getTableName();
                 break;
             case Charcoal_EnumSQLJoinType::LEFT_JOIN:
                 $sql .= ' LEFT JOIN ' . $join_model->getTableName();
                 break;
             case Charcoal_EnumSQLJoinType::RIGHT_JOIN:
                 $sql .= ' RIGHT JOIN ' . $join_model->getTableName();
                 break;
         }
         if ($join_alias && !$join_alias->isEmpty()) {
             $sql .= ' AS ' . $join_alias;
         }
         if ($join_cond && !$join_cond->isEmpty()) {
             $sql .= ' ON ' . $join_cond;
         }
     }
     $where_clause = $criteria->getWhere();
     $limit = $criteria->getLimit();
     $offset = $criteria->getOffset();
     $group_by = $criteria->getGroupBy();
     if (!empty($where_clause)) {
         $sql .= ' WHERE ' . $where_clause;
     }
     if (!empty($limit)) {
         $sql .= ' LIMIT ' . $limit;
     }
     if (!empty($offset)) {
         $sql .= ' OFFSET ' . $offset;
     }
     if (!empty($group_by)) {
         $sql .= ' GROUP BY ' . $group_by;
     }
     return $sql;
 }
 /**
  *  Add multiple parameters
  *
  *  @param Charcoal_Vector|array $params        array data to add
  */
 public function addParams($params)
 {
     Charcoal_ParamTrait::validateVector(1, $params);
     if ($this->params) {
         $this->params = array_merge($this->params, $params);
     } else {
         $this->params = uv($params);
     }
 }