Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00017 final class SQLFunction extends Castable implements MappableObject, Aliased
00018 {
00019 const AGGREGATE_ALL = 1;
00020 const AGGREGATE_DISTINCT = 2;
00021
00022 private $name = null;
00023 private $alias = null;
00024 private $aggregate = null;
00025
00026 private $args = array();
00027
00031 public static function create($name )
00032 {
00033 if (func_num_args() > 1) {
00034 $args = func_get_args();
00035 array_shift($args);
00036 return new SQLFunction($name, $args);
00037 } else
00038 return new SQLFunction($name);
00039 }
00040
00041 public function __construct($name )
00042 {
00043 $this->name = $name;
00044
00045 if (func_num_args() > 1) {
00046 $args = func_get_args();
00047
00048 if (is_array($args[1]))
00049 $this->args = $args[1];
00050 else {
00051 array_shift($args);
00052 $this->args = $args;
00053 }
00054 }
00055 }
00056
00057 public function getAlias()
00058 {
00059 return $this->alias;
00060 }
00061
00062 public function getName()
00063 {
00064 return $this->name;
00065 }
00066
00070 public function setAlias($alias)
00071 {
00072 $this->alias = $alias;
00073
00074 return $this;
00075 }
00076
00080 public function setAggregateAll()
00081 {
00082 $this->aggregate = self::AGGREGATE_ALL;
00083
00084 return $this;
00085 }
00086
00090 public function setAggregateDistinct()
00091 {
00092 $this->aggregate = self::AGGREGATE_DISTINCT;
00093
00094 return $this;
00095 }
00096
00100 public function toMapped(ProtoDAO $dao, JoinCapableQuery $query)
00101 {
00102 $mapped = array();
00103
00104 $mapped[] = $this->name;
00105
00106 foreach ($this->args as $arg) {
00107 if ($arg instanceof MappableObject)
00108 $mapped[] = $arg->toMapped($dao, $query);
00109 else
00110 $mapped[] = $dao->guessAtom($arg, $query);
00111 }
00112
00113 $sqlFunction = call_user_func_array(array('self', 'create'), $mapped);
00114
00115 $sqlFunction->aggregate = $this->aggregate;
00116
00117 $sqlFunction->castTo($this->cast);
00118
00119 return $sqlFunction;
00120 }
00121
00122 public function toDialectString(Dialect $dialect)
00123 {
00124 $args = array();
00125
00126 if ($this->args) {
00127 foreach ($this->args as $arg)
00128 if ($arg instanceof DBValue)
00129 $args[] = $arg->toDialectString($dialect);
00130
00131 elseif ($arg === '*') {
00132 Assert::isTrue(
00133 (strtolower($this->name) === 'count')
00134 || defined('__I_HATE_MY_KARMA__'),
00135
00136 'do not want to use "*" with '.$this->args[0]
00137 );
00138
00139 $args[] = $dialect->quoteValue($arg);
00140 } elseif ($arg instanceof SelectQuery)
00141 $args[] = '('.$dialect->fieldToString($arg).')';
00142 else
00143 $args[] = $dialect->fieldToString($arg);
00144 }
00145
00146 $out = $this->name.'(';
00147
00148 if ($this->aggregate == self::AGGREGATE_ALL) {
00149 $out .= 'ALL ';
00150 } elseif ($this->aggregate == self::AGGREGATE_DISTINCT) {
00151 $out .= 'DISTINCT ';
00152 }
00153
00154 $out .= ($args == array() ? null : implode(', ', $args)).')';
00155
00156 $out =
00157 $this->cast
00158 ? $dialect->toCasted($out, $this->cast)
00159 : $out;
00160
00161 return
00162 $this->alias
00163 ? $out.' AS '.$dialect->quoteTable($this->alias)
00164 : $out;
00165 }
00166 }
00167 ?>