| @@ -23,94 +23,99 @@ class CustomJsonOrderFilter extends AbstractFilter | |||||
| if (!is_array($orderData) || !isset($orderData['active']) || !isset($orderData['direction'])) { | if (!is_array($orderData) || !isset($orderData['active']) || !isset($orderData['direction'])) { | ||||
| return; | return; | ||||
| } | } | ||||
| $field = $orderData['active']; | |||||
| $direction = strtoupper($orderData['direction']) === 'DESC' ? 'DESC' : 'ASC'; | $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]; | $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) { | if ($isNegation) { | ||||
| $conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName); | |||||
| $subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName)); | |||||
| } else { | } 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 { | } else { | ||||
| $queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction); | |||||
| $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction); | |||||
| } | } | ||||
| } else { | } else { | ||||
| $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction); | $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction); | ||||