query = $query; return $this; } public function rewriteColumn($column, ?string $relation = null): ?AliasedExpression { if (! $this->isSelectableColumn($column)) { return null; } $resolver = $this->query->getResolver(); if ($relation !== null) { $serviceTableAlias = $resolver->getAlias($resolver->resolveRelation($relation)->getTarget()); $column = $resolver->qualifyColumnAlias($column, $serviceTableAlias); } else { $serviceTableAlias = $resolver->getAlias($this->query->getModel()); } $subQueryModel = new DependencyEdge(); $subQuery = (new Query()) ->setDb($this->query->getDb()) ->setModel($subQueryModel) ->columns([new Expression('1')]) ->utilize('from') ->limit(1) ->filter(Filter::equal('state.failed', 'y')); $subQueryResolver = $subQuery->getResolver()->setAliasPrefix('hpp_'); $subQueryTarget = $subQueryResolver->resolveRelation($subQueryModel->getTableName() . '.from')->getTarget(); $targetForeignKey = $subQueryResolver->qualifyColumn( 'service_id', $subQueryResolver->getAlias($subQueryTarget) ); $subQuery->getSelectBase() ->where("$targetForeignKey = {$resolver->qualifyColumn('id', $serviceTableAlias)}"); [$select, $values] = $this->query->getDb() ->getQueryBuilder() ->assembleSelect($subQuery->assembleSelect()); return new AliasedExpression( $this->query->getDb()->quoteIdentifier([$column]), "($select)", null, ...$values ); } public function isSelectableColumn(string $name): bool { return $name === 'has_problematic_parent'; } public function rewriteColumnDefinition(ColumnDefinition $def, string $relation): void { } public function rewriteCondition(Filter\Condition $condition, $relation = null) { $column = substr($condition->getColumn(), strlen($relation ?? '')); if ($this->isSelectableColumn($column)) { throw new InvalidColumnException($column, $this->query->getModel()); } } }