Example #1
0
 /**
  * @param \Doctrine\ORM\QueryBuilder $q
  * @param array                      $args
  *
  * @return void
  */
 protected function buildWhereClause(&$q, array $args)
 {
     $filter = array_key_exists('filter', $args) ? $args['filter'] : '';
     $filterHelper = new SearchStringHelper();
     $string = '';
     if (!empty($filter)) {
         if (is_array($filter)) {
             if (!empty($filter['force'])) {
                 if (is_array($filter['force'])) {
                     //defined columns with keys of column, expr, value
                     $forceParameters = array();
                     $forceExpressions = $q->expr()->andX();
                     foreach ($filter['force'] as $f) {
                         if ($f instanceof Query\Expr || $f instanceof CompositeExpression) {
                             $expr = $f;
                             if (isset($expr->parameters)) {
                                 $forceParameters = $expr->parameters;
                                 unset($expr->parameters);
                             }
                         } elseif (is_array($f)) {
                             list($expr, $parameters) = $this->getFilterExpr($q, $f);
                             $forceExpressions->add($expr);
                             if (!empty($parameters) && is_array($parameters)) {
                                 $forceParameters = array_merge($forceParameters, $parameters);
                             }
                         } else {
                             //string so parse as advanced search
                             $parsed = $filterHelper->parseSearchString($f);
                             list($expr, $parameters) = $this->addAdvancedSearchWhereClause($q, $parsed);
                             $forceExpressions->add($expr);
                             if (!empty($parameters) && is_array($parameters)) {
                                 $forceParameters = array_merge($forceParameters, $parameters);
                             }
                         }
                     }
                 } else {
                     //string so parse as advanced search
                     $parsed = $filterHelper->parseSearchString($filter['force']);
                     list($forceExpressions, $forceParameters) = $this->addAdvancedSearchWhereClause($q, $parsed);
                 }
             }
             if (!empty($filter['string'])) {
                 $string = $filter['string'];
             }
         } else {
             $string = $filter;
         }
         //parse the filter if set
         if (!empty($string) || !empty($forceExpressions)) {
             if (!empty($string)) {
                 //remove wildcards passed by user
                 if (strpos($string, '%') !== false) {
                     $string = str_replace('%', '', $string);
                 }
                 $filter = $filterHelper->parseSearchString($string);
                 list($expressions, $parameters) = $this->addAdvancedSearchWhereClause($q, $filter);
                 if (!empty($forceExpressions)) {
                     $expressions->add($forceExpressions);
                     $parameters = array_merge($parameters, $forceParameters);
                 }
             } elseif (!empty($forceExpressions)) {
                 //We do not have a user search but have some required filters
                 $expressions = $forceExpressions;
                 $parameters = $forceParameters;
             }
             $filterCount = $expressions instanceof \Countable ? count($expressions) : count($expressions->getParts());
             if (!empty($filterCount)) {
                 $q->andWhere($expressions);
                 foreach ($parameters as $k => $v) {
                     if ($v === true || $v === false) {
                         $q->setParameter($k, $v, 'boolean');
                     } else {
                         $q->setParameter($k, $v);
                     }
                 }
             }
         }
     }
 }
Example #2
0
 /**
  * @param \Doctrine\ORM\QueryBuilder $q
  * @param array                      $args
  */
 protected function buildWhereClause(&$q, array $args)
 {
     $filter = array_key_exists('filter', $args) ? $args['filter'] : '';
     $filterHelper = new SearchStringHelper();
     $advancedFilters = new \stdClass();
     $advancedFilters->root = [];
     $advancedFilters->commands = [];
     // Reset advanced filter commands to be used in search query building
     $this->advancedFilterCommands = [];
     $advancedFilterStrings = [];
     $queryParameters = [];
     $queryExpression = $q->expr()->andX();
     if (!empty($filter)) {
         if (is_array($filter)) {
             if (!empty($filter['force'])) {
                 if (is_array($filter['force'])) {
                     //defined columns with keys of column, expr, value
                     foreach ($filter['force'] as $f) {
                         if ($f instanceof Query\Expr || $f instanceof CompositeExpression) {
                             $queryExpression->add($f);
                             if (isset($f->parameters) && is_array($f->parameters)) {
                                 $queryParameters = array_merge($queryParameters, $f->parameters);
                                 unset($f->parameters);
                             }
                         } elseif (is_array($f)) {
                             list($expr, $parameters) = $this->getFilterExpr($q, $f);
                             $queryExpression->add($expr);
                             if (is_array($parameters)) {
                                 $queryParameters = array_merge($queryParameters, $parameters);
                             }
                         } else {
                             //string so parse as advanced search
                             $advancedFilterStrings[] = $f;
                         }
                     }
                 } else {
                     //string so parse as advanced search
                     $advancedFilterStrings[] = $filter['force'];
                 }
             }
             if (!empty($filter['string'])) {
                 $advancedFilterStrings[] = $filter['string'];
             }
         } else {
             $advancedFilterStrings[] = $filter;
         }
         if (!empty($advancedFilterStrings)) {
             foreach ($advancedFilterStrings as $parseString) {
                 $parsed = $filterHelper->parseString($parseString);
                 $advancedFilters->root = array_merge($advancedFilters->root, $parsed->root);
                 $filterHelper->mergeCommands($advancedFilters, $parsed->commands);
             }
             $this->advancedFilterCommands = $advancedFilters->commands;
             list($expr, $parameters) = $this->addAdvancedSearchWhereClause($q, $advancedFilters);
             $queryExpression->add($expr);
             if (is_array($parameters)) {
                 $queryParameters = array_merge($queryParameters, $parameters);
             }
         }
         //parse the filter if set
         if ($queryExpression->count()) {
             $q->andWhere($queryExpression);
             foreach ($queryParameters as $k => $v) {
                 if ($v === true || $v === false) {
                     $q->setParameter($k, $v, 'boolean');
                 } else {
                     $q->setParameter($k, $v);
                 }
             }
         }
     }
 }