Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Utilize native filter meta data instead of properties #16

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 14 additions & 24 deletions src/Compat/FilterProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,14 @@ public static function apply(Filter\Rule $filter, Query $query)
protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $query)
{
if ($filter instanceof Filter\Condition) {
$column = $filter->getColumn();
if (isset($filter->relationCol)) {
$column = $filter->relationCol;
}

$resolver = $query->getResolver();
$baseTable = $query->getModel()->getTableName();
$column = $resolver->qualifyPath($column, $baseTable);
$column = $resolver->qualifyPath(
$filter->metaData()->get('columnName', $filter->getColumn()),
$baseTable
);

$filter->columnPath = $column;
$filter->metaData()->set('columnPath', $column);

list($relationPath, $columnName) = preg_split('/\.(?=[^.]+$)/', $column);

Expand All @@ -90,8 +88,8 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu
// Prepare filter as if it were final to allow full control for rewrite filter behaviors
$filter->setValue($subjectBehaviors->persistProperty($filter->getValue(), $columnName));
$filter->setColumn($resolver->getAlias($subject) . '.' . $columnName);
$filter->relationCol = $columnName;
$filter->relationPath = $path;
$filter->metaData()->set('columnName', $columnName);
$filter->metaData()->set('relationPath', $path);

$rewrittenFilter = $subjectBehaviors->rewriteCondition($filter, $path . '.');
if ($rewrittenFilter !== null) {
Expand All @@ -116,21 +114,15 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu
}

// We optimize only single expressions
if (isset($child->relationPath) && $child instanceof Filter\Condition) {
$relationPath = $child->relationPath;
if ($child instanceof Filter\Condition) {
$relationPath = $child->metaData()->get('relationPath');
if (
$relationPath !== $query->getModel()->getTableName()
$relationPath !== null
&& $relationPath !== $query->getModel()->getTableName()
&& ! isset($query->getWith()[$relationPath])
) {
if (! $query->getResolver()->isDistinctRelation($relationPath)) {
if (isset($child->original)) {
$column = $child->original->columnPath;
$child = $child->original;
} else {
$column = $child->getColumn();
}

$subQueryFilters[get_class($child)][$column][] = $child;
$subQueryFilters[get_class($child)][$child->getColumn()][] = $child;
}
}
}
Expand All @@ -139,7 +131,7 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu
foreach ($subQueryFilters as $conditionClass => $filterCombinations) {
foreach ($filterCombinations as $column => $filters) {
// The relation path must be the same for all entries
$relationPath = $filters[0]->relationPath;
$relationPath = $filters[0]->metaData()->get('relationPath');

// In case the parent query also selects the relation we may not require a subquery.
// Otherwise we form a cartesian product and get unwanted results back.
Expand Down Expand Up @@ -186,9 +178,7 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu
// Unequal comparisons must be negated since the sub-query is an inverse of the outer one
if ($child instanceof Filter\Condition) {
$negation = Filter::equal($child->getColumn(), $child->getValue());
$negation->relationCol = $child->relationCol;
$negation->columnPath = $child->columnPath;
$negation->relationPath = $child->relationPath;
$negation->metaData()->merge($child->metaData());
$filters[$i] = $negation;
} else {
$filters[$i] = Filter::none($child);
Expand Down