134 lines
5.3 KiB
PHP
134 lines
5.3 KiB
PHP
<?
|
|
|
|
class Where {
|
|
const AND = 1;
|
|
const OR = 2;
|
|
const IN = 3;
|
|
const BETWEEN = 4;
|
|
const STRING = 5;
|
|
const IN_QUERY = 6;
|
|
const OPERATOR = 7;
|
|
const NOT = 8;
|
|
const IN_QUERY_EXECUTE = 9;
|
|
const IS_COLUMN_NULL = 10;
|
|
const MATCH = 11;
|
|
const OPERATOR_FORCE = 12;
|
|
|
|
static function _between($column,$x,$y):array { return [self::BETWEEN,$column,$x,$y]; }
|
|
static function _and(array $array):array { return [self::AND,$array]; }
|
|
static function _or(array $array):array { return [self::OR,$array]; }
|
|
static function _not(array $array):array { return [self::NOT,$array]; }
|
|
static function _in($column,array $array):array { return [self::IN,$column,$array]; }
|
|
static function _inQuery($column,array $q):array { return [self::IN_QUERY,$column,$q]; }
|
|
static function _inQueryExecute($column,array $q):array { return [self::IN_QUERY_EXECUTE,$column,$q]; }
|
|
static function _string(string $x):array { return [self::STRING,$x]; }
|
|
static function _operator(string $column,string $operator,$value):array { return [self::OPERATOR,$column,$operator,$value]; }
|
|
static function _isColumnNull(string $column):array { return [self::IS_COLUMN_NULL,$column,]; }
|
|
static function _match(array $columns,string $search ):array { return [self::MATCH,$columns,$search]; }
|
|
static function _operatorForce(string $column,string $operator,$value):array { return [self::OPERATOR_FORCE,$column,$operator,$value]; }
|
|
|
|
private $data = [];
|
|
|
|
public function __construct(array $array) {
|
|
$this->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 '<Br><br>'.(new Query($v[2])).'<br>',microtime(true)-$start,'<br><br>';$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;
|
|
}
|
|
|
|
}
|