| @@ -23,94 +23,99 @@ class CustomJsonOrderFilter extends AbstractFilter | |||
| if (!is_array($orderData) || !isset($orderData['active']) || !isset($orderData['direction'])) { | |||
| return; | |||
| } | |||
| $field = $orderData['active']; | |||
| $direction = strtoupper($orderData['direction']) === 'DESC' ? 'DESC' : 'ASC'; | |||
| $listColDefinition = $orderData['listColDefinition']; | |||
| $field = $listColDefinition['field']; | |||
| if (array_key_exists('sortingFieldName', $listColDefinition)) { | |||
| $field = $listColDefinition['sortingFieldName']; | |||
| } | |||
| $sortingSubResource = $listColDefinition['sortingSubResource'] ?? null; | |||
| $countSortSubresource = $listColDefinition['countSortSubresource'] ?? false; | |||
| $countSortSubresourceValue = $listColDefinition['countSortSubresourceValue'] ?? null; | |||
| $countSortSubresourceField = $listColDefinition['countSortSubresourceField'] ?? $field; | |||
| $countSortFilterSubResource = $listColDefinition['countSortFilterSubResource'] ?? null; | |||
| $countSortFilterSubresourceField = $listColDefinition['countSortFilterSubresourceField'] ?? null; | |||
| $countSortFilterSubresourceValue = $listColDefinition['countSortFilterSubresourceValue'] ?? null; | |||
| $rootAlias = $queryBuilder->getRootAliases()[0]; | |||
| if ($sortingSubResource) { | |||
| $subResources = explode('.', $sortingSubResource); | |||
| $currentAlias = $rootAlias; | |||
| foreach ($subResources as $index => $subResource) { | |||
| $joinAlias = $queryNameGenerator->generateJoinAlias($subResource); | |||
| $queryBuilder->leftJoin(sprintf('%s.%s', $currentAlias, $subResource), $joinAlias); | |||
| $currentAlias = $joinAlias; | |||
| if (array_key_exists('listColDefinition', $orderData)) { | |||
| $listColDefinition = $orderData['listColDefinition']; | |||
| $field = $listColDefinition['field']; | |||
| if (array_key_exists('sortingFieldName', $listColDefinition)) { | |||
| $field = $listColDefinition['sortingFieldName']; | |||
| } | |||
| $sortingSubResource = $listColDefinition['sortingSubResource'] ?? null; | |||
| $countSortSubresource = $listColDefinition['countSortSubresource'] ?? false; | |||
| $countSortSubresourceValue = $listColDefinition['countSortSubresourceValue'] ?? null; | |||
| $countSortSubresourceField = $listColDefinition['countSortSubresourceField'] ?? $field; | |||
| $countSortFilterSubResource = $listColDefinition['countSortFilterSubResource'] ?? null; | |||
| $countSortFilterSubresourceField = $listColDefinition['countSortFilterSubresourceField'] ?? null; | |||
| $countSortFilterSubresourceValue = $listColDefinition['countSortFilterSubresourceValue'] ?? null; | |||
| if ($sortingSubResource) { | |||
| $subResources = explode('.', $sortingSubResource); | |||
| $currentAlias = $rootAlias; | |||
| foreach ($subResources as $index => $subResource) { | |||
| $joinAlias = $queryNameGenerator->generateJoinAlias($subResource); | |||
| $queryBuilder->leftJoin(sprintf('%s.%s', $currentAlias, $subResource), $joinAlias); | |||
| $currentAlias = $joinAlias; | |||
| } | |||
| if ($countSortSubresource === true) { | |||
| $countAlias = $queryNameGenerator->generateParameterName('count'); | |||
| $subQuery = $queryBuilder->getEntityManager()->createQueryBuilder() | |||
| ->select('COUNT(sub)') | |||
| ->from($resourceClass, 'main') | |||
| ->join(sprintf('main.%s', $sortingSubResource), 'sub'); | |||
| if ($countSortSubresourceValue !== null && $countSortSubresourceField !== null) { | |||
| $paramName = $queryNameGenerator->generateParameterName($countSortSubresourceField); | |||
| if (is_array($countSortSubresourceValue)) { | |||
| $conditions = []; | |||
| foreach ($countSortSubresourceValue as $index => $value) { | |||
| $isNegation = strpos($value, '!') === 0; | |||
| $actualValue = $isNegation ? substr($value, 1) : $value; | |||
| $individualParamName = $paramName . '_' . $index; | |||
| if ($countSortSubresource === true) { | |||
| $countAlias = $queryNameGenerator->generateParameterName('count'); | |||
| $subQuery = $queryBuilder->getEntityManager()->createQueryBuilder() | |||
| ->select('COUNT(sub)') | |||
| ->from($resourceClass, 'main') | |||
| ->join(sprintf('main.%s', $sortingSubResource), 'sub'); | |||
| if ($countSortSubresourceValue !== null && $countSortSubresourceField !== null) { | |||
| $paramName = $queryNameGenerator->generateParameterName($countSortSubresourceField); | |||
| if (is_array($countSortSubresourceValue)) { | |||
| $conditions = []; | |||
| foreach ($countSortSubresourceValue as $index => $value) { | |||
| $isNegation = strpos($value, '!') === 0; | |||
| $actualValue = $isNegation ? substr($value, 1) : $value; | |||
| $individualParamName = $paramName . '_' . $index; | |||
| if ($isNegation) { | |||
| $conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName); | |||
| } else { | |||
| $conditions[] = sprintf('sub.%s = :%s', $countSortSubresourceField, $individualParamName); | |||
| } | |||
| $subQuery->setParameter($individualParamName, $actualValue); | |||
| } | |||
| $subQuery->andWhere($subQuery->expr()->orX(...$conditions)); | |||
| } else { | |||
| $isNegation = strpos($countSortSubresourceValue, '!') === 0; | |||
| $actualValue = $isNegation ? substr($countSortSubresourceValue, 1) : $countSortSubresourceValue; | |||
| if ($isNegation) { | |||
| $conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName); | |||
| $subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName)); | |||
| } else { | |||
| $conditions[] = sprintf('sub.%s = :%s', $countSortSubresourceField, $individualParamName); | |||
| $subQuery->andWhere(sprintf('sub.%s = :%s', $countSortSubresourceField, $paramName)); | |||
| } | |||
| $subQuery->setParameter($individualParamName, $actualValue); | |||
| } | |||
| $subQuery->andWhere($subQuery->expr()->orX(...$conditions)); | |||
| } else { | |||
| $isNegation = strpos($countSortSubresourceValue, '!') === 0; | |||
| $actualValue = $isNegation ? substr($countSortSubresourceValue, 1) : $countSortSubresourceValue; | |||
| if ($isNegation) { | |||
| $subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName)); | |||
| } else { | |||
| $subQuery->andWhere(sprintf('sub.%s = :%s', $countSortSubresourceField, $paramName)); | |||
| $subQuery->setParameter($paramName, $actualValue); | |||
| } | |||
| $subQuery->setParameter($paramName, $actualValue); | |||
| } | |||
| } | |||
| // Additional filtering on countSortFilterSubResource | |||
| if ($countSortFilterSubResource && $countSortFilterSubresourceField && $countSortFilterSubresourceValue !== null) { | |||
| $filterJoinAlias = $queryNameGenerator->generateJoinAlias($countSortFilterSubResource); | |||
| $filterParamName = $queryNameGenerator->generateParameterName($countSortFilterSubresourceField); | |||
| // Additional filtering on countSortFilterSubResource | |||
| if ($countSortFilterSubResource && $countSortFilterSubresourceField && $countSortFilterSubresourceValue !== null) { | |||
| $filterJoinAlias = $queryNameGenerator->generateJoinAlias($countSortFilterSubResource); | |||
| $filterParamName = $queryNameGenerator->generateParameterName($countSortFilterSubresourceField); | |||
| $subQuery->join(sprintf('sub.%s', $countSortFilterSubResource), $filterJoinAlias) | |||
| ->andWhere(sprintf('%s.%s = :%s OR %s.%s IS NULL', $filterJoinAlias, $countSortFilterSubresourceField, $filterParamName, $filterJoinAlias, $countSortFilterSubresourceField)) | |||
| ->setParameter($filterParamName, $countSortFilterSubresourceValue); | |||
| } | |||
| $subQuery->join(sprintf('sub.%s', $countSortFilterSubResource), $filterJoinAlias) | |||
| ->andWhere(sprintf('%s.%s = :%s OR %s.%s IS NULL', $filterJoinAlias, $countSortFilterSubresourceField, $filterParamName, $filterJoinAlias, $countSortFilterSubresourceField)) | |||
| ->setParameter($filterParamName, $countSortFilterSubresourceValue); | |||
| } | |||
| $subQuery->andWhere($subQuery->expr()->eq('main.id', $rootAlias . '.id')); | |||
| $subQuery->andWhere($subQuery->expr()->eq('main.id', $rootAlias . '.id')); | |||
| $queryBuilder->addSelect(sprintf('(%s) as HIDDEN %s', $subQuery->getDQL(), $countAlias)) | |||
| ->orderBy($countAlias, $direction); | |||
| $queryBuilder->addSelect(sprintf('(%s) as HIDDEN %s', $subQuery->getDQL(), $countAlias)) | |||
| ->orderBy($countAlias, $direction); | |||
| // Bind the parameter for the main query | |||
| foreach ($subQuery->getParameters() as $parameter) { | |||
| $queryBuilder->setParameter($parameter->getName(), $parameter->getValue(), $parameter->getType()); | |||
| // Bind the parameter for the main query | |||
| foreach ($subQuery->getParameters() as $parameter) { | |||
| $queryBuilder->setParameter($parameter->getName(), $parameter->getValue(), $parameter->getType()); | |||
| } | |||
| } else { | |||
| $queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction); | |||
| } | |||
| } else { | |||
| $queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction); | |||
| $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction); | |||
| } | |||
| } else { | |||
| $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction); | |||