data = [$array]; } protected static function parse($a){ $res = ''; if(is_string($a) || is_numeric($a)) return $a; foreach ($a as $v) { switch ($v[0]) { case Where::STRING: $res .= $v[1]; break; case Where::BETWEEN: $res .= Db::quotes($v[1])." BETWEEN '".DB::mq($v[2])."' AND '".DB::mq($v[3])."'"; break; case Where::IN: $res .= Db::quotes($v[1])." IN ('".implode("','",DB::mqa($v[2]))."')"; break; case Where::IN_QUERY_EXECUTE: //$start = microtime(true); $r = \Query::select($v[2])->execute(); $arr = []; while($l = \DB::fetch($r)){ $arr[] = $l[$v[2][Query::SELECT]]; } $arr = array_unique($arr); //echo '

'.(new Query($v[2])).'
',microtime(true)-$start,'

';$start = microtime(true); $res .= DB::quotes($v[1])." IN (".($arr?implode(",",$arr):'null').")"; break; case Where::IN_QUERY: $res .= DB::quotes($v[1])." IN (".\Query::select($v[2]).")"; break; case Where::OPERATOR: $res = Db::quotes($v[1])." ".$v[2]." '".Db::mq($v[3])."'"; break; case Where::MATCH: $cc = []; foreach ($v[1] as $vv){$cc[] = DB::quotes($vv);} $res = 'MATCH ('.implode(",",$cc).") AGAINST ('".Db::mq($v[2])."' IN BOOLEAN MODE)"; break; case Where::IS_COLUMN_NULL: $res = Db::quotes($v[1])." IS NULL"; break; case Where::OPERATOR_FORCE: $res = Db::quotes($v[1])." ".$v[2]." ".$v[3]; break; case Where::NOT: $vals = []; foreach ($v[1] as $vv) { $vals[] = self::parse([$vv]); } $res .= " NOT (".implode($vals).")"; break; case Where::AND: case Where::OR: $type = ''; switch ($v[0]) { case Where::AND:$type = 'AND';break; case Where::OR:$type = 'OR';break; } $vals = []; foreach ($v[1] as $vv) { if($vv) { $vals[] = self::parse([$vv]); } } $res .= "(".implode(" ".$type." ",$vals).")"; break; } } return $res; } protected function toJSONParse($a){ $res = []; foreach ($a as $k=>$v){ switch (get_class($v)){ case 'Where': $v = $v?$v->toJSON():null;break; } if(is_array($v)){ $res[$k] = $this->toJSONParse($v); } else { $res[$k] = $v; } } return $res; } function toJSON(){ $res = self::toJSONParse($this->data[0]); return $res; } public function __toString() { $res = 'WHERE '.self::parse($this->data); return $res; } }