meraproject/module/core/db/structure/where.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

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;
}
}