/** * @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); }
/** * 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); } }
/** * @dataProvider concatExprProvider * * @param string[] $parts * @param string $expectedExpr */ public function testBuildConcatExpr($parts, $expectedExpr) { $this->assertEquals($expectedExpr, QueryUtils::buildConcatExpr($parts)); }
/** * @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; }