Quellcode durchsuchen

added support for ogc:PropertyIsLike in Access Group and Owner

Piotr Labudda vor 9 Jahren
Ursprung
Commit
a39c01cf49
2 geänderte Dateien mit 45 neuen und 2 gelöschten Zeilen
  1. 15 0
      SE/se-lib/Schema/AccessOwnerStorageAcl.php
  2. 30 2
      SE/se-lib/SqlQueryWhereBuilder.php

+ 15 - 0
SE/se-lib/Schema/AccessOwnerStorageAcl.php

@@ -1,6 +1,7 @@
 <?php
 
 Lib::loadClass('Core_AclBase');
+Lib::loadClass('ParseOgcFilter');
 
 class Schema_AccessOwnerStorageAcl extends Core_AclBase {
 
@@ -36,6 +37,20 @@ class Schema_AccessOwnerStorageAcl extends Core_AclBase {
       where u.A_STATUS = 'NORMAL'
         and u.ADM_TECH_WORKER != 'NO'
     ", $key = 'id');
+
+    if ($pk = V::get('primaryKey', '', $params, 'int')) {// [primaryKey] => 2948
+      if (!array_key_exists($pk, $items)) return array();
+      $items = array($pk => $items[$pk]);
+    }
+    if (!empty($params['ogc:Filter'])) {
+      $parser = new ParseOgcFilter();
+      $parser->loadOgcFilter($params['ogc:Filter']);
+      $queryWhereBuilder = $parser->convertToSqlQueryWhereBuilder();
+      DBG::_('DBG_DS', '>2', "ogc:Filter \$queryWhereBuilder", $queryWhereBuilder, __CLASS__, __FUNCTION__, __LINE__);
+      if($DBG>2){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems \$items:";print_r($items);echo "\n";}
+      $items = array_filter($items, array($queryWhereBuilder, 'filterRawArray'));
+    }
+
     if($DBG>2){echo 'C.'.get_class($this).' L.' . __LINE__ . " getItems \$items:";print_r($items);echo "\n";}
     return $items;
   }

+ 30 - 2
SE/se-lib/SqlQueryWhereBuilder.php

@@ -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");