Пример #1
0
 /**
  * @param string $nameFormat Localized name format string
  * @param array  $nameParts  Parts array
  *
  * @throws \LogicException
  * @return string
  */
 private function buildExpression($nameFormat, array $nameParts)
 {
     $parts = [];
     preg_match_all('/%(\\w+)%([^%]*)/', $nameFormat, $matches);
     if (!empty($matches[0])) {
         foreach ($matches[0] as $idx => $match) {
             $key = $matches[1][$idx];
             $prependSeparator = isset($matches[2], $matches[2][$idx]) ? $matches[2][$idx] : '';
             $lowerCaseKey = strtolower($key);
             if (isset($nameParts[$lowerCaseKey])) {
                 $value = $nameParts[$lowerCaseKey];
                 if ($key !== $lowerCaseKey) {
                     $value = sprintf('UPPER(%s)', $nameParts[$lowerCaseKey]);
                 }
                 $parts[] = $value;
                 if (strlen($prependSeparator) !== 0) {
                     $parts[] = sprintf("'%s'", $prependSeparator);
                 }
             }
         }
     } else {
         throw new \LogicException('Unexpected name format given');
     }
     return QueryUtils::buildConcatExpr($parts);
 }
Пример #2
0
 /**
  * Returns an DQL expression the filter should be applied to
  *
  * @param int $comparisonType
  *
  * @return string
  */
 protected function getFieldExpr($comparisonType)
 {
     $dataName = array_map('trim', preg_split('/,/', $this->get(FilterUtility::DATA_NAME_KEY), -1, PREG_SPLIT_NO_EMPTY));
     switch ($comparisonType) {
         case TextFilterType::TYPE_CONTAINS:
         case TextFilterType::TYPE_NOT_CONTAINS:
             // CONTAINS and NOT CONTAINS should search in all field
             return QueryUtils::buildConcatExpr($dataName);
         default:
             // other comparisons should work only for the first column
             return reset($dataName);
     }
 }
Пример #3
0
 /**
  * @dataProvider concatExprProvider
  *
  * @param string[] $parts
  * @param string   $expectedExpr
  */
 public function testBuildConcatExpr($parts, $expectedExpr)
 {
     $this->assertEquals($expectedExpr, QueryUtils::buildConcatExpr($parts));
 }
Пример #4
0
 /**
  * @param string[] $parts
  * @param string   $prefix
  * @param string[] $separators
  *
  * @return string
  */
 protected function buildConcatExpression($parts, $prefix, $separators)
 {
     $count = count($parts);
     if ($count > 1 || !empty($prefix) && $count === 1) {
         $items = [];
         if (!empty($prefix)) {
             $items[] = sprintf('\'%s\'', $prefix);
         }
         for ($i = 0; $i < $count; $i++) {
             if (empty($separators[$i])) {
                 $items[] = sprintf('CASE WHEN NULLIF(%1$s, \'\') IS NULL THEN \'\' ELSE %1$s END', $parts[$i]);
             } else {
                 $items[] = sprintf('CASE WHEN NULLIF(%1$s, \'\') IS NULL THEN \'\' ELSE CONCAT(%1$s, \'%2$s\') END', $parts[$i], $separators[$i]);
             }
         }
         return QueryUtils::buildConcatExpr($items);
     } elseif ($count === 1) {
         return reset($parts);
     } else {
         return '';
     }
 }
 /**
  * Get dql entity search title
  *
  * @param $entityClass
  * @param $alias
  *
  * @return string
  */
 protected function getNameDQL($entityClass, $alias)
 {
     $fields = $this->mapper->getEntityMapParameter($entityClass, 'title_fields');
     if ($fields) {
         $titleParts = [];
         foreach ($fields as $field) {
             $titleParts[] = $alias . '.' . $field;
             $titleParts[] = '\' \'';
         }
         return QueryUtils::buildConcatExpr($titleParts);
     }
     return false;
 }