Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00017 final class InExpression implements LogicalObject, MappableObject
00018 {
00019 const IN = 'IN';
00020 const NOT_IN = 'NOT IN';
00021
00022 private $left = null;
00023 private $right = null;
00024 private $logic = null;
00025
00026 public function __construct($left, $right, $logic)
00027 {
00028 Assert::isTrue(
00029 ($right instanceof Query)
00030 || ($right instanceof Criteria)
00031 || ($right instanceof MappableObject)
00032 || is_array($right)
00033 );
00034
00035 Assert::isTrue(
00036 ($logic == self::IN)
00037 || ($logic == self::NOT_IN)
00038 );
00039
00040 $this->left = $left;
00041 $this->right = $right;
00042 $this->logic = $logic;
00043 }
00044
00048 public function toMapped(ProtoDAO $dao, JoinCapableQuery $query)
00049 {
00050 if (is_array($this->right)) {
00051 $right = array();
00052 foreach ($this->right as $atom) {
00053 $right[] = $dao->guessAtom($atom, $query);
00054 }
00055 } elseif ($this->right instanceof MappableObject)
00056 $right = $this->right->toMapped($dao, $query);
00057 else
00058 $right = $this->right;
00059
00060 return new self(
00061 $dao->guessAtom($this->left, $query),
00062 $right,
00063 $this->logic
00064 );
00065 }
00066
00067 public function toDialectString(Dialect $dialect)
00068 {
00069 $string =
00070 '('
00071 .$dialect->toFieldString($this->left)
00072 .' '.$this->logic
00073 .' ';
00074
00075 $right = $this->right;
00076
00077 if ($right instanceof DialectString) {
00078
00079 $string .= '('.$right->toDialectString($dialect).')';
00080
00081 } elseif (is_array($right)) {
00082
00083 $string .= SQLArray::create($right)->
00084 toDialectString($dialect);
00085
00086 } else
00087 throw new WrongArgumentException(
00088 'sql select or array accepted by '.$this->logic
00089 );
00090
00091 $string .= ')';
00092
00093 return $string;
00094 }
00095
00096 public function toBoolean(Form $form)
00097 {
00098 $left = $form->toFormValue($this->left);
00099 $right = $this->right;
00100
00101 $both =
00102 (null !== $left)
00103 && (null !== $right);
00104
00105 switch ($this->logic) {
00106
00107 case self::IN:
00108 return $both && (in_array($left, $right));
00109
00110 case self::NOT_IN:
00111 return $both && (!in_array($left, $right));
00112
00113 default:
00114
00115 throw new UnsupportedMethodException(
00116 "'{$this->logic}' doesn't supported"
00117 );
00118 }
00119 }
00120 }
00121 ?>