From: Raphaël Barrois Date: Tue, 19 Jan 2010 21:39:08 +0000 (+0100) Subject: Add PlFilter, PFC, PFO X-Git-Tag: core/1.1.0~95 X-Git-Url: http://git.polytechnique.org/?a=commitdiff_plain;h=285fb262c9740106026de6d456d85c7b652046ec;p=platal.git Add PlFilter, PFC, PFO Signed-off-by: Raphaël Barrois --- diff --git a/classes/plfilter.php b/classes/plfilter.php new file mode 100644 index 0000000..6cdeb70 --- /dev/null +++ b/classes/plfilter.php @@ -0,0 +1,101 @@ +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 condiftion() + { + return $this->condition; + } +} + +abstract class PlFilter +{ + public abstract function filter(array $objects, $count = null, $offset = null); + + public abstract function setCondition(PlFilterCondition &$cond); + + public abstract function addSort(PlFilterOrder &$sort); + + private function replaceJoinMetas($cond, $key) + { + return str_replace(array('$ME'), array($key), $cond); + } + + private function formatJoin(array $joins) + { + $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 (' . $this->replaceJoinMetas($join->condition(), $key) . ')'; + } + $str .= "\n"; + } + return $str; + } + + private function buildJoins() + { + $joins = array(); + foreach (self::$joinMethods as $method) { + $joins = array_merge($joins, $this->$method()); + } + return $this->formatJoin($joins); + } + +} + +?> diff --git a/classes/plfiltercondition.php b/classes/plfiltercondition.php new file mode 100644 index 0000000..91545e9 --- /dev/null +++ b/classes/plfiltercondition.php @@ -0,0 +1,172 @@ +setChild($child); + } + } + + public function setChild(PlFilterCondition &$cond) + { + $this->child =& $cond; + } +} +// }}} + +// {{{ class PFC_NChildren +abstract class PFC_NChildren implements PlFilterCondition +{ + protected $children = array(); + + public function __construct() + { + $children = func_get_args(); + foreach ($children as &$child) { + if (!is_null($child) && ($child instanceof PlFilterCondition)) { + $this->addChild($child); + } + } + } + + public function addChild(PlFilterCondition &$cond) + { + $this->children[] =& $cond; + } + + protected function catConds(array $cond, $op, $fallback) + { + if (count($cond) == 0) { + return $fallback; + } else if (count($cond) == 1) { + return $cond[0]; + } else { + return '(' . implode(') ' . $op . ' (', $cond) . ')'; + } + } +} +// }}} + +// {{{ class PFC_True +class PFC_True implements PlFilterCondition +{ + public function buildCondition(PlFilter &$uf) + { + return self::COND_TRUE; + } +} +// }}} + +// {{{ class PFC_False +class PFC_False implements PlFilterCondition +{ + public function buildCondition(PlFilter &$uf) + { + return self::COND_FALSE; + } +} +// }}} + +// {{{ class PFC_Not +class PFC_Not extends PFC_OneChild +{ + public function buildCondition(PlFilter &$uf) + { + $val = $this->child->buildCondition($uf); + if ($val == self::COND_TRUE) { + return self::COND_FALSE; + } else if ($val == self::COND_FALSE) { + return self::COND_TRUE; + } else { + return 'NOT (' . $val . ')'; + } + } +} +// }}} + +// {{{ class PFC_And +class PFC_And extends PFC_NChildren +{ + 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) { + $val = $child->buildCondition($uf); + if ($val == self::COND_TRUE) { + $true = self::COND_TRUE; + } else if ($val == self::COND_FALSE) { + return self::COND_FALSE; + } else { + $conds[] = $val; + } + } + return $this->catConds($conds, 'AND', $true); + } + } +} +// }}} + +// {{{ class PFC_Or +class PFC_Or extends PFC_NChildren +{ + 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) { + $val = $child->buildCondition($uf); + if ($val == self::COND_TRUE) { + return self::COND_TRUE; + } else if ($val == self::COND_FALSE) { + $true = self::COND_FALSE; + } else { + $conds[] = $val; + } + } + return $this->catConds($conds, 'OR', $true); + } + } +} +// }}} +?> diff --git a/classes/plfilterorder.php b/classes/plfilterorder.php new file mode 100644 index 0000000..09e5911 --- /dev/null +++ b/classes/plfilterorder.php @@ -0,0 +1,47 @@ +desc = $desc; + } + + public function buildSort(PlFilter &$pf) + { + $sel = $this->getSortTokens($pf); + if (!is_array($sel)) { + $sel = array($sel); + } + if ($this->desc) { + foreach ($sel as $k => $s) { + $sel[$k] = $s . ' DESC'; + } + } + return $sel; + } + + abstract protected function getSortTokens(PlFilter &$pf); +} + +?>