protected function buildQuery($identifier, CriteriaList $reference_filter_list)
 {
     $affected_relatives = [];
     if (!empty($reference_filter_list)) {
         // prevent circular self reference loading
         $filter_criteria_list = new CriteriaList();
         $filter_criteria_list->push(new AttributeCriteria('identifier', new Equals($identifier, true)));
         $filter_criteria_list->push($reference_filter_list);
         $this->getQueryService()->scroll(new CriteriaQuery(new CriteriaList(), $filter_criteria_list, new CriteriaList(), 0, $this->config->get('batch_size', 1000)), function (ProjectionInterface $projection) use(&$affected_relatives) {
             // @note if there are many affected relatives this could consume memory
             $affected_relatives[] = $projection;
         });
     }
     return new ProjectionMap($affected_relatives);
 }
예제 #2
0
 public function asQuery()
 {
     $filter_criteria = [];
     if ($this->hasFilter()) {
         foreach ($this->getFilter() as $attribute_path => $value) {
             if (!is_string($value)) {
                 throw new RuntimeError('Only strings are supported as filter values at the moment.');
             }
             if (!preg_match_all('#(?<criteria>\\w+)\\((?<value>.+)\\)(?:,|$)#U', $value, $matches, PREG_SET_ORDER)) {
                 $matches = explode(',', $value);
                 foreach ($matches as $match) {
                     $filter_criteria[] = $this->buildAttributeFilterFor($attribute_path, $match);
                 }
             } else {
                 foreach ($matches as $match) {
                     switch ($match['criteria']) {
                         case 'range':
                             $filter_criteria[] = $this->buildRangeFilterFor($attribute_path, $match['value']);
                             break;
                         case 'spatial':
                             $filter_criteria[] = $this->buildSpatialFilterFor($attribute_path, $match['value']);
                             break;
                         case 'match':
                             $filter_criteria[] = $this->buildMatchFilterFor($attribute_path, $match['value']);
                             break;
                         default:
                             // better fallback for regex gone wrong
                             $filter_criteria = [];
                             $filter_criteria[] = $this->buildAttributeFilterFor($attribute_path, $value);
                             //throw new RuntimeError('Unsupported query criteria: ' . $match['criteria']);
                     }
                 }
             }
         }
     }
     $filter_criteria_list = new CriteriaList($filter_criteria);
     $search_criteria_list = new CriteriaList();
     if ($this->hasSearch()) {
         $search_criteria_list->push(new SearchCriteria($this->getSearch()));
     }
     $sort_criteria_list = new CriteriaList();
     if ($this->hasSort()) {
         $sort_string = $this->getSort();
         $sort = [];
         $sort_fields = explode(',', $sort_string);
         foreach ($sort_fields as $sort_field) {
             if (!preg_match('/^([\\w\\.]+):(asc|desc)$/u', $sort_field)) {
                 throw new RuntimeError('The sort value has a wrong format. Should be: field1:asc,field2:desc');
             }
             list($attribute_path, $direction) = explode(':', $sort_field);
             $sort_criteria_list->push(new SortCriteria($attribute_path, $direction));
         }
     }
     return new CriteriaQuery($search_criteria_list, $filter_criteria_list, $sort_criteria_list, $this->getOffset(), $this->getLimit());
 }