示例#1
0
 /**
  * Check subrequests for acl access level
  *
  * @param SelectStatement     $ast
  * @param AclConditionStorage $storage
  * @param                     $permission
  */
 protected function processSubselects(SelectStatement $ast, AclConditionStorage $storage, $permission)
 {
     $conditionalExpression = $ast->whereClause->conditionalExpression;
     if (isset($conditionalExpression->conditionalPrimary)) {
         $conditionalExpression = $conditionalExpression->conditionalPrimary;
     }
     if ($conditionalExpression instanceof ConditionalPrimary) {
         // we have request with only one where condition
         $expression = $conditionalExpression->simpleConditionalExpression;
         if (isset($expression->subselect) && $expression->subselect instanceof Subselect) {
             $subRequestAclStorage = $this->processSubselect($expression->subselect, $permission);
             if (!$subRequestAclStorage->isEmpty()) {
                 $subRequestAclStorage->setFactorId(0);
                 $storage->addSubRequests($subRequestAclStorage);
             }
         }
     } else {
         // we have request with only many where conditions
         $subQueryAcl = [];
         if (isset($conditionalExpression->conditionalFactors)) {
             $factors = $conditionalExpression->conditionalFactors;
         } else {
             $factors = $conditionalExpression->conditionalTerms;
         }
         foreach ($factors as $factorId => $expression) {
             if (isset($expression->simpleConditionalExpression->subselect) && $expression->simpleConditionalExpression->subselect instanceof Subselect) {
                 $subRequestAclStorage = $this->processSubselect($expression->simpleConditionalExpression->subselect, $permission);
                 if (!$subRequestAclStorage->isEmpty()) {
                     $subRequestAclStorage->setFactorId($factorId);
                     $subQueryAcl[] = $subRequestAclStorage;
                 }
             }
         }
         if (!empty($subQueryAcl)) {
             $storage->setSubRequests($subQueryAcl);
         }
     }
 }