|
|
@@ -76,7 +76,29 @@ class SqlQueryWhereBuilder {
|
|
|
DBG::_('DBG_DS_OGC', '>2', "\nlog loop({$idxLog}) '{$log}' \$sqlValuesStack", $sqlValuesStack, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
}
|
|
|
break;
|
|
|
- case 'close_block_and':
|
|
|
+ case 'close_block_and': {
|
|
|
+ $blockType = substr($log, 12);// 'and', 'or'
|
|
|
+ if (empty($sqlBlocksStack)) throw new Exception("parse sql query failed - blocks stack is empty");
|
|
|
+ $stackBlockType = array_pop($sqlBlocksStack);
|
|
|
+ if ($blockType != $stackBlockType) throw new Exception("parse sql query failed - expected stop '{$blockType}', given '{$stackBlockType}'");
|
|
|
+
|
|
|
+ // parse to string and add to parent value stack
|
|
|
+ $stackValue = array_pop($sqlValuesStack);
|
|
|
+ if (!is_array($stackValue)) throw new Exception("parse sql query failed - stack value is not array");
|
|
|
+ if (empty($stackValue)) throw new Exception("parse sql query failed - stack value is empty");
|
|
|
+ $sqlFromStack = true;
|
|
|
+ foreach ($stackValue as $bool) {
|
|
|
+ if (!is_scalar($bool) && ($bool == true or $bool == false)) throw new Exception("parse query failed - expected bool values in block or");
|
|
|
+ if (!$bool) $sqlFromStack = false;
|
|
|
+ }
|
|
|
+ $parentStackValue = array_pop($sqlValuesStack);
|
|
|
+ if (!is_array($parentStackValue)) throw new Exception("parse sql query failed - parent stack value is not array");
|
|
|
+ array_push($parentStackValue, $sqlFromStack);
|
|
|
+ array_push($sqlValuesStack, $parentStackValue);
|
|
|
+ DBG::_('DBG_DS_OGC', '>2', "\nlog loop({$idxLog}) '{$log}' \$sqlBlocksStack", $sqlBlocksStack, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
+ DBG::_('DBG_DS_OGC', '>2', "\nlog loop({$idxLog}) '{$log}' \$sqlValuesStack", $sqlValuesStack, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
+ }
|
|
|
+ break;
|
|
|
case 'close_block_or': {
|
|
|
$blockType = substr($log, 12);// 'and', 'or'
|
|
|
if (empty($sqlBlocksStack)) throw new Exception("parse sql query failed - blocks stack is empty");
|
|
|
@@ -128,7 +150,13 @@ class SqlQueryWhereBuilder {
|
|
|
switch ($log[2]) {
|
|
|
case '=': {
|
|
|
$sqlFromStack = ($lowerItem[$fieldName] == $log[3]);
|
|
|
- DBG::_('DBG_DS_OGC', '>2', "\nlog loop({$idxLog}) '{$log[0]}' comparison({$lowerItem[$fieldName]} == {$log[3]}) \$sqlFromStack", $sqlFromStack, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
+ DBG::_('DBG_DS_OGC', '>2', "\nlog loop({$idxLog}) '{$log[0]}' comparison({$lowerItem[$fieldName]} == {$log[3]}) \$sqlFromStack(".($sqlFromStack ? 'true' : 'false').")", null, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 'like': {
|
|
|
+ $pattern = str_replace('%', '(.*)', $log[3]);
|
|
|
+ $sqlFromStack = (bool)preg_match("/^{$pattern}\$/i", $lowerItem[$fieldName]);
|
|
|
+ DBG::_('DBG_DS_OGC', '>2', "\nlog loop({$idxLog}) '{$log[0]}' comparison(preg_match('/^{$pattern}\$/i', '{$lowerItem[$fieldName]}')) \$sqlFromStack(".($sqlFromStack ? 'true' : 'false').")", null, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
break;
|
|
|
}
|
|
|
default: throw new Exception("compaison sign '{$log[2]}' not defined");
|