|
|
@@ -99,26 +99,27 @@ class AclQueryBuilder {
|
|
|
public function _generateWhereMain($where) { // @returns string
|
|
|
if (is_string($where)) return $where; // whereRaw
|
|
|
list($fieldName, $comparisonSign, $value) = $where;
|
|
|
- $sqlFieldName = $fieldName; // TODO: getSqlFieldName // TODO: get sql field name with table prefix from join list to replace "{$this->_fromPrefix}.{$sqlFieldName}" below
|
|
|
+ // $sqlFieldName = $fieldName; // TODO: getSqlFieldName // TODO: get sql field name with table prefix from join list to replace "{$this->_fromPrefix}.{$sqlFieldName}" below
|
|
|
+ $sqlFieldName = $this->getPDO()->identifierQuote($fieldName);
|
|
|
switch ($comparisonSign) {
|
|
|
case 'is not null': return "{$this->_fromPrefix}.{$sqlFieldName} is not null";
|
|
|
case 'is null': return "{$this->_fromPrefix}.{$sqlFieldName} is null";
|
|
|
- case 'Intersects': return "Intersects(GeomFromText('{$value}'), {$this->_fromPrefix}.`{$sqlFieldName}`)=1";
|
|
|
- case 'GeometryType': return "GeometryType({$this->_fromPrefix}.`{$sqlFieldName}`)='{$value}'";
|
|
|
+ case 'Intersects': return "Intersects(GeomFromText('{$value}'), {$this->_fromPrefix}.{$sqlFieldName})=1";
|
|
|
+ case 'GeometryType': return "GeometryType({$this->_fromPrefix}.{$sqlFieldName})='{$value}'";
|
|
|
case 'or': return $this->_generateWhereBlock($where);
|
|
|
case 'and': return $this->_generateWhereBlock($where);
|
|
|
case 'UNIX_TIMESTAMP_LESS_THAN_NOW': return "
|
|
|
- COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) < UNIX_TIMESTAMP()
|
|
|
- and {$this->_fromPrefix}.`{$sqlFieldName}` != ''
|
|
|
- and {$this->_fromPrefix}.`{$sqlFieldName}` != '0000-00-00 00:00:00'
|
|
|
+ COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) < UNIX_TIMESTAMP()
|
|
|
+ and {$this->_fromPrefix}.{$sqlFieldName} != ''
|
|
|
+ and {$this->_fromPrefix}.{$sqlFieldName} != '0000-00-00 00:00:00'
|
|
|
";
|
|
|
case 'UNIX_TIMESTAMP_NOW_3600': return "
|
|
|
- COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) < UNIX_TIMESTAMP()+3600
|
|
|
- and COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) > UNIX_TIMESTAMP()-3600
|
|
|
+ COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) < UNIX_TIMESTAMP()+3600
|
|
|
+ and COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) > UNIX_TIMESTAMP()-3600
|
|
|
";
|
|
|
- case 'UNIX_TIMESTAMP_GREATER_THAN': return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) > '{$value}' ";
|
|
|
- case 'UNIX_TIMESTAMP_LESS_THAN': return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.`{$sqlFieldName}`), 0) < '{$value}' ";
|
|
|
- default: return "{$this->_fromPrefix}.{$sqlFieldName} {$comparisonSign} " . DB::getPDO()->quote($value);
|
|
|
+ case 'UNIX_TIMESTAMP_GREATER_THAN': return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) > '{$value}' ";
|
|
|
+ case 'UNIX_TIMESTAMP_LESS_THAN': return " COALESCE(UNIX_TIMESTAMP({$this->_fromPrefix}.{$sqlFieldName}), 0) < '{$value}' ";
|
|
|
+ default: return "{$this->_fromPrefix}.{$sqlFieldName} {$comparisonSign} " . $this->getPDO()->quote($value);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
@@ -179,7 +180,7 @@ class AclQueryBuilder {
|
|
|
}
|
|
|
if (is_string($select)) {
|
|
|
// TODO: only real table field
|
|
|
- // TODO: if geometry type then `AsWKT(t.`{$fieldName}`) as {$fieldName}`
|
|
|
+ // TODO: if geometry type then `AsWKT(t.{$sqlFieldName}) as {$fieldName}`
|
|
|
try {
|
|
|
return $this->parseSelectFieldValueToSql($select, $this->_fromPrefix);
|
|
|
} catch (Exception $e) {
|
|
|
@@ -201,7 +202,7 @@ class AclQueryBuilder {
|
|
|
$this->orderBy = [];
|
|
|
if (!$orderBy) return $this;
|
|
|
// ID A,COL_X D,COL_Y A,...
|
|
|
- if (false !== strpos($orderBy, '+')) $orderBy = str_replace('+', ' ', $orderBy);
|
|
|
+ if (false !== strpos($orderBy, '+')) $orderBy = str_replace('+', ' ', $orderBy);
|
|
|
$sortByEx = array_map('trim', explode(',', $orderBy));
|
|
|
$sortByEx = array_filter($sortByEx, ['V', 'filterNotEmpty']);
|
|
|
foreach ($sortByEx as $sortPart) {
|
|
|
@@ -228,7 +229,8 @@ class AclQueryBuilder {
|
|
|
if (empty($this->orderBy)) return '';
|
|
|
$sortByList = [];
|
|
|
foreach ($this->orderBy as $orderBy) {
|
|
|
- $sortByList[] = "t.`{$orderBy[0]}` {$orderBy[1]}";
|
|
|
+ $sqlOrderByField = $this->getPDO()->identifierQuote($orderBy[0]);
|
|
|
+ $sortByList[] = "t.{$sqlOrderByField} {$orderBy[1]}";
|
|
|
}
|
|
|
return (!empty($sortByList))
|
|
|
? "order by " . implode(", ", $sortByList)
|
|
|
@@ -270,27 +272,32 @@ class AclQueryBuilder {
|
|
|
return $this->fetchAll();
|
|
|
}
|
|
|
|
|
|
+ public function getPDO() {
|
|
|
+ $idDatabase = $this->from->getDB();
|
|
|
+ return DB::getPDO($idDatabase);
|
|
|
+ }
|
|
|
+
|
|
|
public function fetchAll() {
|
|
|
$sql = $this->generateSql();
|
|
|
DBG::log((array)$this, 'array', "AclQueryBuilder::fetchAll");
|
|
|
- return DB::getPDO()->fetchAll($sql);
|
|
|
+ return $this->getPDO()->fetchAll($sql);
|
|
|
}
|
|
|
|
|
|
public function fetchTotal() {
|
|
|
$sql = $this->generateSql("count(*) as cnt");
|
|
|
- return DB::getPDO()->fetchValue($sql);
|
|
|
+ return $this->getPDO()->fetchValue($sql);
|
|
|
}
|
|
|
|
|
|
public function fetchValue() {
|
|
|
$sql = $this->generateSql();
|
|
|
DBG::log(['sql'=>$sql,'this'=>(array)$this], 'array', "AclQueryBuilder::fetchValue");
|
|
|
- return DB::getPDO()->fetchValue($sql);
|
|
|
+ return $this->getPDO()->fetchValue($sql);
|
|
|
}
|
|
|
|
|
|
public function fetchFirst() {
|
|
|
$sql = $this->generateSql();
|
|
|
DBG::log(['sql'=>$sql,'this'=>(array)$this], 'array', "AclQueryBuilder::fetchFirst");
|
|
|
- return DB::getPDO()->fetchFirst($sql);
|
|
|
+ return $this->getPDO()->fetchFirst($sql);
|
|
|
}
|
|
|
|
|
|
public function generateSql($select = null) {
|
|
|
@@ -376,9 +383,12 @@ class AclQueryBuilder {
|
|
|
}
|
|
|
|
|
|
$sqlOrderBy = $this->generateOrderBySql();
|
|
|
+ $sqlTableName = (is_object($this->from) && method_exists($this->from, 'getSqlTableFrom'))
|
|
|
+ ? $this->from->getSqlTableFrom()
|
|
|
+ : $this->getPDO()->tableNameQuote( $tableName );
|
|
|
return "
|
|
|
select {$sqlSelect}
|
|
|
- from `{$tableName}` {$this->_fromPrefix}
|
|
|
+ from {$sqlTableName} {$this->_fromPrefix}
|
|
|
{$sqlJoin}
|
|
|
{$sqlWhere}
|
|
|
{$sqlOrderBy}
|
|
|
@@ -394,24 +404,25 @@ class AclQueryBuilder {
|
|
|
|
|
|
$fieldType = $this->from->getXsdFieldType($fieldName);
|
|
|
@list($typePrefix, $typeName, $retTypeName) = explode(':', $fieldType);
|
|
|
+ $sqlFieldName = $this->getPDO()->identifierQuote($fieldName);
|
|
|
switch ($typePrefix) {
|
|
|
case 'xsd': {
|
|
|
switch ($typeName) {
|
|
|
- case 'base64Binary': return "IF({$prefix}.`{$fieldName}` is not null, 1, 0) as `{$fieldName}`";
|
|
|
- default: return "{$prefix}.`{$fieldName}`";
|
|
|
+ case 'base64Binary': return "IF({$prefix}.{$sqlFieldName} is not null, 1, 0) as {$sqlFieldName}";
|
|
|
+ default: return "{$prefix}.{$sqlFieldName}";
|
|
|
}
|
|
|
}
|
|
|
// 'gml:PolygonPropertyType':
|
|
|
// 'gml:PointPropertyType':
|
|
|
// 'gml:LineStringPropertyType':
|
|
|
// 'gml:GeometryPropertyType':
|
|
|
- case 'gml': return "AsWKT({$prefix}.`{$fieldName}`) as `{$fieldName}`";
|
|
|
+ case 'gml': return "AsWKT({$prefix}.{$sqlFieldName}) as {$sqlFieldName}";
|
|
|
case 'p5': {
|
|
|
switch ($typeName) {
|
|
|
- case 'price': return "{$prefix}.`{$fieldName}`";
|
|
|
- case 'enum': return "{$prefix}.`{$fieldName}`"; // TODO: check if local or remote
|
|
|
- case 'www_link': return "{$prefix}.`{$fieldName}`"; // TODO: check if local or remote?
|
|
|
- case 'string': return "{$prefix}.`{$fieldName}`"; // TODO: check if local or remote?
|
|
|
+ case 'price': return "{$prefix}.{$sqlFieldName}";
|
|
|
+ case 'enum': return "{$prefix}.{$sqlFieldName}"; // TODO: check if local or remote
|
|
|
+ case 'www_link': return "{$prefix}.{$sqlFieldName}"; // TODO: check if local or remote?
|
|
|
+ case 'string': return "{$prefix}.{$sqlFieldName}"; // TODO: check if local or remote?
|
|
|
default: throw new Exception("Not implemented field type in select '{$fieldType}' (field: '{$fieldName}')");
|
|
|
}
|
|
|
}
|