|
|
@@ -27,6 +27,7 @@ class AclQueryBuilder {
|
|
|
public $_fromPrefix;
|
|
|
public $_joinPrefix;
|
|
|
public $_joinParams;
|
|
|
+ public $_joinType;
|
|
|
public $isInstances;
|
|
|
public $isNotInstances;
|
|
|
public $_hasSelectRemoteFields;
|
|
|
@@ -43,6 +44,7 @@ class AclQueryBuilder {
|
|
|
$this->_fromPrefix = 't'; // prefix for this->from - default 't'
|
|
|
$this->_joinPrefix = []; // prefix => from (Acl | tableName)
|
|
|
$this->_joinParams = []; // prefx => params
|
|
|
+ $this->_joinType = []; // prefix => ( 'join' | 'left join' )
|
|
|
$this->isInstances = [];
|
|
|
$this->isNotInstances = [];
|
|
|
|
|
|
@@ -99,28 +101,31 @@ class AclQueryBuilder {
|
|
|
}
|
|
|
public function _generateWhereMain($where) { // @returns string
|
|
|
if (is_string($where)) return $where; // whereRaw
|
|
|
- list($fieldName, $comparisonSign, $value) = $where;
|
|
|
+ list($prefixedFieldName, $comparisonSign, $value) = $where;
|
|
|
// $sqlFieldName = $fieldName; // TODO: getSqlFieldName // TODO: get sql field name with table prefix from join list to replace "{$this->_fromPrefix}.{$sqlFieldName}" below
|
|
|
+ $prefixedFieldName = (false === strpos($prefixedFieldName, '.')) ? "{$this->_fromPrefix}.{$prefixedFieldName}" : $prefixedFieldName;
|
|
|
+ list($prefix, $fieldName) = explode('.', $prefixedFieldName);
|
|
|
+ $sqlPrefix = $this->getPDO()->identifierQuote($prefix);
|
|
|
$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 'is not null': return "{$sqlPrefix}.{$sqlFieldName} is not null";
|
|
|
+ case 'is null': return "{$sqlPrefix}.{$sqlFieldName} is null";
|
|
|
+ case 'Intersects': return "Intersects(GeomFromText('{$value}'), {$sqlPrefix}.{$sqlFieldName})=1";
|
|
|
+ case 'GeometryType': return "GeometryType({$sqlPrefix}.{$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({$sqlPrefix}.{$sqlFieldName}), 0) < UNIX_TIMESTAMP()
|
|
|
+ and {$sqlPrefix}.{$sqlFieldName} != ''
|
|
|
+ and {$sqlPrefix}.{$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({$sqlPrefix}.{$sqlFieldName}), 0) < UNIX_TIMESTAMP()+3600
|
|
|
+ and COALESCE(UNIX_TIMESTAMP({$sqlPrefix}.{$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} " . $this->getPDO()->quote($value);
|
|
|
+ case 'UNIX_TIMESTAMP_GREATER_THAN': return " COALESCE(UNIX_TIMESTAMP({$sqlPrefix}.{$sqlFieldName}), 0) > '{$value}' ";
|
|
|
+ case 'UNIX_TIMESTAMP_LESS_THAN': return " COALESCE(UNIX_TIMESTAMP({$sqlPrefix}.{$sqlFieldName}), 0) < '{$value}' ";
|
|
|
+ default: return "{$sqlPrefix}.{$sqlFieldName} {$comparisonSign} " . $this->getPDO()->quote($value);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
@@ -191,10 +196,19 @@ class AclQueryBuilder {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public function join($join, $prefix, $params) {
|
|
|
+ public function join($remoteTableName, $prefix, $params) {
|
|
|
+ if (array_key_exists($prefix, $this->_joinPrefix)) throw new Exception("Prefix already used!");
|
|
|
+ $this->_joinPrefix[$prefix] = $remoteTableName;
|
|
|
+ $this->_joinParams[$prefix] = $params;
|
|
|
+ $this->_joinType[$prefix] = 'join';
|
|
|
+ return $this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function leftJoin($remoteTableName, $prefix, $params) {
|
|
|
if (array_key_exists($prefix, $this->_joinPrefix)) throw new Exception("Prefix already used!");
|
|
|
- $this->_joinPrefix[$prefix] = $join;
|
|
|
+ $this->_joinPrefix[$prefix] = $remoteTableName;
|
|
|
$this->_joinParams[$prefix] = $params;
|
|
|
+ $this->_joinType[$prefix] = 'left join';
|
|
|
return $this;
|
|
|
}
|
|
|
|
|
|
@@ -336,7 +350,7 @@ class AclQueryBuilder {
|
|
|
|
|
|
foreach ($this->_joinPrefix as $prefix => $join) {
|
|
|
$joinName = $this->_getTableName($join);
|
|
|
- $sqlJoin[] = " join `{$joinName}` {$prefix} on(" . $this->_parseJoinParams($this->_joinParams[$prefix]) . ") ";
|
|
|
+ $sqlJoin[] = " {$this->_joinType[$prefix]} `{$joinName}` {$prefix} on(" . $this->_parseJoinParams($this->_joinParams[$prefix]) . ") ";
|
|
|
}
|
|
|
|
|
|
$sqlJoin = (!empty($sqlJoin)) ? implode("\n\t", $sqlJoin) : "";
|