X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fplfilter.php;h=1a6d52587ec28a3537c8ac7a018667fb992a3f6c;hb=c504af53e5b3e13f19039f1ab03cd16279ce4967;hp=c4787326493c28208ea5e82c47bfc75b952308a7;hpb=857a2b960d47c1ef4990e6ed55bad2ed40681f66;p=platal.git diff --git a/classes/plfilter.php b/classes/plfilter.php index c478732..1a6d525 100644 --- a/classes/plfilter.php +++ b/classes/plfilter.php @@ -47,122 +47,24 @@ class PlLimit } // }}} -// {{{ class PlSqlJoin -class PlSqlJoin -{ - private $mode; - private $table; - private $condition; - - const MODE_LEFT = 'LEFT'; - const MODE_RIGHT = 'RIGHT'; - const MODE_INNER = 'INNER'; - - private function __construct($mode, $params) - { - $table = array_shift($params); - $condition = call_user_func_array(array('XDB', 'format'), $params); - if ($mode != self::MODE_LEFT && $mode != self::MODE_RIGHT && $mode != self::MODE_INNER) { - Platal::page()->kill("Join mode error: unknown mode $mode"); - return; - } - $this->mode = $mode; - $this->table = $table; - $this->condition = $condition; - } - - public function mode() - { - return $this->mode; - } - - public function table() - { - return $this->table; - } - - public function condition() - { - return $this->condition; - } - - /** Replace all "metas" in the condition with their translation. - * $ME always becomes the alias of the table - * @param $key The name the joined table will have in the final query - * @param $joinMetas An array of meta => conversion to apply to the condition - */ - public function replaceJoinMetas($key, $joinMetas = array()) - { - $joinMetas['$ME'] = $key; - return str_replace(array_keys($joinMetas), $joinMetas, $this->condition); - } - - /** Create a join command from an array of PlSqlJoin - * @param $joins The list of 'join' to convert into an SQL query - * @param $joinMetas An array of ('$META' => 'conversion') to apply to the joins. - */ - public static function formatJoins(array $joins, array $joinMetas) - { - $str = ''; - foreach ($joins as $key => $join) { - if (!($join instanceof PlSqlJoin)) { - Platal::page()->kill("Error: not a join: $join"); - } - $mode = $join->mode(); - $table = $join->table(); - $str .= ' ' . $mode . ' JOIN ' . $table . ' AS ' . $key; - if ($join->condition() != null) { - $str .= ' ON (' . $join->replaceJoinMetas($key, $joinMetas) . ')'; - } - $str .= "\n"; - } - return $str; - } - - /** Build a left join - * @param table The name of the table. - * @param condition The condition of the jointure - */ - public static function left() - { - $params = func_get_args(); - return new PlSqlJoin(self::MODE_LEFT, $params); - } - - /** Build a right join - * @param table The name of the table. - * @param condition The condition of the jointure - */ - public static function right() - { - $params = func_get_args(); - return new PlSqlJoin(self::MODE_RIGHT, $params); - } - - /** Build a inner join - * @param table The name of the table. - * @param condition The condition of the jointure - */ - public static function inner() - { - $params = func_get_args(); - return new PlSqlJoin(self::MODE_INNER, $params); - } -} -// }}} - // {{{ class PlFilterOrder -abstract class PlFilterOrder +/** Base class for ordering results of a query. + * Parameters for the ordering must be given to the constructor ($desc for a + * descending order). + * The getSortTokens function is used to get actual ordering part of the query. + */ +abstract class PlFilterOrder implements PlExportable { protected $desc = false; public function __construct($desc = false) { $this->desc = $desc; + $this->_tokens = null; } public function toggleDesc() { - $this->desc = !$desc; + $this->desc = !$this->desc; } public function setDescending($desc = true) @@ -173,6 +75,7 @@ abstract class PlFilterOrder public function buildSort(PlFilter &$pf) { $sel = $this->getSortTokens($pf); + $this->_tokens = $sel; if (!is_array($sel)) { $sel = array($sel); } @@ -184,10 +87,31 @@ abstract class PlFilterOrder return $sel; } + /** This function must return the tokens to use for ordering + * @param &$pf The PlFilter whose results must be ordered + * @return The name of the field to use for ordering results + */ abstract protected function getSortTokens(PlFilter &$pf); } // }}} +// {{{ class PlFilterGroupableOrder +/** Extension of a PlFilterOrder, for orders where the value on which ordering + * is done could be used for grouping results (promo, country, ...) + */ +abstract class PlFilterGroupableOrder extends PlFilterOrder +{ + /** This function will be called when trying to retrieve groups; + * the returned token will be used to group the values. + * It will always be called AFTER getSortTokens(). + */ + public function getGroupToken(PlFilter &$pf) + { + return $this->_tokens; + } +} +// }}} + // {{{ class PFO_Random class PFO_Random extends PlFilterOrder { @@ -207,11 +131,19 @@ class PFO_Random extends PlFilterOrder return XDB::format('RAND({?})', $this->seed); } } + + public function export() + { + $export = array('type' => 'random',); + if ($this->seed !== null) + $export['seed'] = $this->seed; + return $export; + } } // }}} // {{{ interface PlFilterCondition -interface PlFilterCondition +interface PlFilterCondition extends PlExportable { const COND_TRUE = 'TRUE'; const COND_FALSE = 'FALSE'; @@ -236,6 +168,11 @@ abstract class PFC_OneChild implements PlFilterCondition { $this->child =& $cond; } + + public function export() + { + return array('child' => $child->export()); + } } // }}} @@ -246,10 +183,14 @@ abstract class PFC_NChildren implements PlFilterCondition public function __construct() { - $children = func_get_args(); - foreach ($children as &$child) { - if (!is_null($child) && ($child instanceof PlFilterCondition)) { - $this->addChild($child); + $this->addChildren(pl_flatten(func_get_args())); + } + + public function addChildren(array $conds) + { + foreach ($conds as &$cond) { + if (!is_null($cond) && ($cond instanceof PlFilterCondition)) { + $this->addChild($cond); } } } @@ -269,6 +210,14 @@ abstract class PFC_NChildren implements PlFilterCondition return '(' . implode(') ' . $op . ' (', $cond) . ')'; } } + + public function export() + { + $export = array(); + foreach ($this->children as $child) + $export[] = $child->export(); + return array('children' => $export); + } } // }}} @@ -279,6 +228,11 @@ class PFC_True implements PlFilterCondition { return self::COND_TRUE; } + + public function export() + { + return array('type' => 'true'); + } } // }}} @@ -289,6 +243,11 @@ class PFC_False implements PlFilterCondition { return self::COND_FALSE; } + + public function export() + { + return array('type' => 'false'); + } } // }}} @@ -306,6 +265,13 @@ class PFC_Not extends PFC_OneChild return 'NOT (' . $val . ')'; } } + + public function export() + { + $export = parent::export(); + $export['type'] = 'not'; + return $export; + } } // }}} @@ -332,6 +298,12 @@ class PFC_And extends PFC_NChildren return $this->catConds($conds, 'AND', $true); } } + + public function export() { + $export = parent::export(); + $export['type'] = 'and'; + return $export; + } } // }}} @@ -358,11 +330,17 @@ class PFC_Or extends PFC_NChildren return $this->catConds($conds, 'OR', $true); } } + + public function export() { + $export = parent::export(); + $export['type'] = 'or'; + return $export; + } } // }}} // {{{ class PlFilter -abstract class PlFilter +abstract class PlFilter implements PlExportable { /** Filters objects matching the PlFilter * @param $objects The objects to filter @@ -376,6 +354,16 @@ abstract class PlFilter public abstract function getTotalCount(); + /** Whether this PlFilter can return grouped results through + * $this->getGroups(); + */ + public abstract function hasGroups(); + + /** Used to retrieve value/amount resulting from grouping by the first + * given order. + */ + public abstract function getGroups(); + /** Get objects, selecting only those within a limit * @param $limit The portion of the matching objects to select */