diff --git a/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php b/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php index e326dea254..1c472dc474 100644 --- a/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php @@ -63,10 +63,16 @@ final class PhabricatorProjectLogicalViewerDatasource $phids = mpull($projects, 'getPHID'); $results = array(); - foreach ($phids as $phid) { + if ($phids) { + foreach ($phids as $phid) { + $results[] = new PhabricatorQueryConstraint( + PhabricatorQueryConstraint::OPERATOR_OR, + $phid); + } + } else { $results[] = new PhabricatorQueryConstraint( - PhabricatorQueryConstraint::OPERATOR_OR, - $phid); + PhabricatorQueryConstraint::OPERATOR_EMPTY, + null); } return $results; diff --git a/src/infrastructure/query/constraint/PhabricatorQueryConstraint.php b/src/infrastructure/query/constraint/PhabricatorQueryConstraint.php index 5b5702673b..74b3830676 100644 --- a/src/infrastructure/query/constraint/PhabricatorQueryConstraint.php +++ b/src/infrastructure/query/constraint/PhabricatorQueryConstraint.php @@ -7,6 +7,7 @@ final class PhabricatorQueryConstraint extends Phobject { const OPERATOR_NOT = 'not'; const OPERATOR_NULL = 'null'; const OPERATOR_ANCESTOR = 'ancestor'; + const OPERATOR_EMPTY = 'empty'; private $operator; private $value; diff --git a/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php b/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php index 9996f03ae0..1892e53e7c 100644 --- a/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php +++ b/src/infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php @@ -1872,6 +1872,16 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery return $this; } + foreach ($this->edgeLogicConstraints as $type => $constraints) { + foreach ($constraints as $operator => $list) { + switch ($operator) { + case PhabricatorQueryConstraint::OPERATOR_EMPTY: + throw new PhabricatorEmptyQueryException( + pht('This query specifies an empty constraint.')); + } + } + } + // This should probably be more modular, eventually, but we only do // project-based edge logic today.