X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fplfilter.php;h=609c1cc576d4817e3392d8bdbef7dc0c145afd7e;hb=1623168586bac6073585130fc2aa864345463ac6;hp=5c23d1c0798c3520e1df9cc095d14aa6c79a3dc4;hpb=7e001f68b7928d80ccf32b8a8bca55d304476d3e;p=platal.git diff --git a/classes/plfilter.php b/classes/plfilter.php index 5c23d1c..609c1cc 100644 --- a/classes/plfilter.php +++ b/classes/plfilter.php @@ -1,6 +1,6 @@ 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 /** 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 +abstract class PlFilterOrder implements PlExportable { protected $desc = false; public function __construct($desc = false) @@ -166,6 +62,20 @@ abstract class PlFilterOrder $this->_tokens = null; } + protected function buildExport($type) + { + $export = array('type' => $type); + if ($this->desc) { + $export['order'] = 'desc'; + } + return $export; + } + + public function export() + { + throw new Exception("This instance is not exportable"); + } + public function toggleDesc() { $this->desc = !$this->desc; @@ -176,7 +86,7 @@ abstract class PlFilterOrder $this->desc = $desc; } - public function buildSort(PlFilter &$pf) + public function buildSort(PlFilter $pf) { $sel = $this->getSortTokens($pf); $this->_tokens = $sel; @@ -192,10 +102,10 @@ abstract class PlFilterOrder } /** This function must return the tokens to use for ordering - * @param &$pf The PlFilter whose results must be ordered + * @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); + abstract protected function getSortTokens(PlFilter $pf); } // }}} @@ -209,7 +119,7 @@ abstract class PlFilterGroupableOrder extends PlFilterOrder * the returned token will be used to group the values. * It will always be called AFTER getSortTokens(). */ - public function getGroupToken(PlFilter &$pf) + public function getGroupToken(PlFilter $pf) { return $this->_tokens; } @@ -227,7 +137,7 @@ class PFO_Random extends PlFilterOrder $this->seed = $seed; } - protected function getSortTokens(PlFilter &$pf) + protected function getSortTokens(PlFilter $pf) { if ($this->seed == null) { return 'RAND()'; @@ -235,16 +145,24 @@ 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'; - public function buildCondition(PlFilter &$pf); + public function buildCondition(PlFilter $pf); } // }}} @@ -253,16 +171,21 @@ abstract class PFC_OneChild implements PlFilterCondition { protected $child; - public function __construct(&$child = null) + public function __construct($child = null) { if (!is_null($child) && ($child instanceof PlFilterCondition)) { $this->setChild($child); } } - public function setChild(PlFilterCondition &$cond) + public function setChild(PlFilterCondition $cond) { - $this->child =& $cond; + $this->child = $cond; + } + + public function export() + { + return array('child' => $this->child->export()); } } // }}} @@ -279,16 +202,16 @@ abstract class PFC_NChildren implements PlFilterCondition public function addChildren(array $conds) { - foreach ($conds as &$cond) { + foreach ($conds as $cond) { if (!is_null($cond) && ($cond instanceof PlFilterCondition)) { $this->addChild($cond); } } } - public function addChild(PlFilterCondition &$cond) + public function addChild(PlFilterCondition $cond) { - $this->children[] =& $cond; + $this->children[] = $cond; } protected function catConds(array $cond, $op, $fallback) @@ -301,33 +224,52 @@ 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); + } } // }}} // {{{ class PFC_True class PFC_True implements PlFilterCondition { - public function buildCondition(PlFilter &$uf) + public function buildCondition(PlFilter $uf) { return self::COND_TRUE; } + + public function export() + { + return array('type' => 'true'); + } } // }}} // {{{ class PFC_False class PFC_False implements PlFilterCondition { - public function buildCondition(PlFilter &$uf) + public function buildCondition(PlFilter $uf) { return self::COND_FALSE; } + + public function export() + { + return array('type' => 'false'); + } } // }}} // {{{ class PFC_Not class PFC_Not extends PFC_OneChild { - public function buildCondition(PlFilter &$uf) + public function buildCondition(PlFilter $uf) { $val = $this->child->buildCondition($uf); if ($val == self::COND_TRUE) { @@ -338,20 +280,27 @@ class PFC_Not extends PFC_OneChild return 'NOT (' . $val . ')'; } } + + public function export() + { + $export = parent::export(); + $export['type'] = 'not'; + return $export; + } } // }}} // {{{ class PFC_And class PFC_And extends PFC_NChildren { - public function buildCondition(PlFilter &$uf) + public function buildCondition(PlFilter $uf) { if (empty($this->children)) { return self::COND_FALSE; } else { $true = self::COND_FALSE; $conds = array(); - foreach ($this->children as &$child) { + foreach ($this->children as $child) { $val = $child->buildCondition($uf); if ($val == self::COND_TRUE) { $true = self::COND_TRUE; @@ -364,20 +313,26 @@ class PFC_And extends PFC_NChildren return $this->catConds($conds, 'AND', $true); } } + + public function export() { + $export = parent::export(); + $export['type'] = 'and'; + return $export; + } } // }}} // {{{ class PFC_Or class PFC_Or extends PFC_NChildren { - public function buildCondition(PlFilter &$uf) + public function buildCondition(PlFilter $uf) { if (empty($this->children)) { return self::COND_TRUE; } else { $true = self::COND_TRUE; $conds = array(); - foreach ($this->children as &$child) { + foreach ($this->children as $child) { $val = $child->buildCondition($uf); if ($val == self::COND_TRUE) { return self::COND_TRUE; @@ -390,11 +345,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 @@ -402,9 +363,9 @@ abstract class PlFilter */ public abstract function filter(array $objects, $limit = null); - public abstract function setCondition(PlFilterCondition &$cond); + public abstract function setCondition(PlFilterCondition $cond); - public abstract function addSort(PlFilterOrder &$sort); + public abstract function addSort(PlFilterOrder $sort); public abstract function getTotalCount(); @@ -423,6 +384,14 @@ abstract class PlFilter */ public abstract function get($limit = null); + /** Get ids, selecting only those within a limit + * @param $limit The portion of the matching objects to select + */ + public function getIds($limit = null) + { + return $this->get($limit); + } + /** PRIVATE FUNCTIONS */