diff --git a/src/applications/legalpad/query/LegalpadDocumentQuery.php b/src/applications/legalpad/query/LegalpadDocumentQuery.php index cca501c1eb..264bf3e018 100644 --- a/src/applications/legalpad/query/LegalpadDocumentQuery.php +++ b/src/applications/legalpad/query/LegalpadDocumentQuery.php @@ -9,7 +9,7 @@ final class LegalpadDocumentQuery private $ids; private $phids; private $creatorPHIDs; - private $contributorPHIDs; // TODO - T3479 + private $contributorPHIDs; private $dateCreatedAfter; private $dateCreatedBefore; @@ -62,8 +62,9 @@ final class LegalpadDocumentQuery $data = queryfx_all( $conn_r, - 'SELECT legalpad_document.* FROM %T legalpad_document %Q %Q %Q', + 'SELECT d.* FROM %T d %Q %Q %Q %Q', $table->getTableName(), + $this->buildJoinClause($conn_r), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); @@ -89,6 +90,18 @@ final class LegalpadDocumentQuery return $documents; } + private function buildJoinClause($conn_r) { + $joins = array(); + + if ($this->contributorPHIDs) { + $joins[] = qsprintf( + $conn_r, + 'JOIN edge e ON e.src = d.phid'); + } + + return implode(' ', $joins); + } + protected function buildWhereClause($conn_r) { $where = array(); @@ -97,38 +110,46 @@ final class LegalpadDocumentQuery if ($this->ids) { $where[] = qsprintf( $conn_r, - 'id IN (%Ld)', + 'd.id IN (%Ld)', $this->ids); } if ($this->phids) { $where[] = qsprintf( $conn_r, - 'phid IN (%Ls)', + 'd.phid IN (%Ls)', $this->phids); } if ($this->creatorPHIDs) { $where[] = qsprintf( $conn_r, - 'creatorPHID IN (%Ls)', + 'd.creatorPHID IN (%Ls)', $this->creatorPHIDs); } if ($this->dateCreatedAfter) { $where[] = qsprintf( $conn_r, - 'dateCreated >= %d', + 'd.dateCreated >= %d', $this->dateCreatedAfter); } if ($this->dateCreatedBefore) { $where[] = qsprintf( $conn_r, - 'dateCreated <= %d', + 'd.dateCreated <= %d', $this->dateCreatedBefore); } + if ($this->contributorPHIDs) { + $where[] = qsprintf( + $conn_r, + 'e.type = %s AND e.dst IN (%Ls)', + PhabricatorEdgeConfig::TYPE_OBJECT_HAS_CONTRIBUTOR, + $this->contributorPHIDs); + } + return $this->formatWhereClause($where); } diff --git a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php index 1d6a817b22..ae14b8387a 100644 --- a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php +++ b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php @@ -12,6 +12,10 @@ final class LegalpadDocumentSearchEngine 'creatorPHIDs', array_values($request->getArr('creators'))); + $saved->setParameter( + 'contributorPHIDs', + array_values($request->getArr('contributors'))); + $saved->setParameter('createdStart', $request->getStr('createdStart')); $saved->setParameter('createdEnd', $request->getStr('createdEnd')); @@ -22,7 +26,8 @@ final class LegalpadDocumentSearchEngine $query = id(new LegalpadDocumentQuery()) ->needDocumentBodies(true) ->needContributors(true) - ->withCreatorPHIDs($saved->getParameter('creatorPHIDs', array())); + ->withCreatorPHIDs($saved->getParameter('creatorPHIDs', array())) + ->withContributorPHIDs($saved->getParameter('contributorPHIDs', array())); $start = $this->parseDateTime($saved->getParameter('createdStart')); $end = $this->parseDateTime($saved->getParameter('createdEnd')); @@ -41,11 +46,15 @@ final class LegalpadDocumentSearchEngine public function buildSearchForm( AphrontFormView $form, PhabricatorSavedQuery $saved_query) { - $phids = $saved_query->getParameter('creatorPHIDs', array()); + + $creator_phids = $saved_query->getParameter('creatorPHIDs', array()); + $contributor_phids = $saved_query->getParameter( + 'contributorPHIDs', array()); + $phids = array_merge($creator_phids, $contributor_phids); $handles = id(new PhabricatorObjectHandleData($phids)) ->setViewer($this->requireViewer()) ->loadHandles(); - $creator_tokens = mpull($handles, 'getFullName', 'getPHID'); + $tokens = mpull($handles, 'getFullName', 'getPHID'); $form ->appendChild( @@ -53,7 +62,13 @@ final class LegalpadDocumentSearchEngine ->setDatasource('/typeahead/common/users/') ->setName('creators') ->setLabel(pht('Creators')) - ->setValue($creator_tokens)); + ->setValue(array_select_keys($tokens, $creator_phids))) + ->appendChild( + id(new AphrontFormTokenizerControl()) + ->setDatasource('/typeahead/common/users/') + ->setName('contributors') + ->setLabel(pht('Contributors')) + ->setValue(array_select_keys($tokens, $contributor_phids))); $this->buildDateRange( $form,