diff --git a/resources/sql/autopatches/20170419.thread.03.touched.sql b/resources/sql/autopatches/20170419.thread.03.touched.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20170419.thread.03.touched.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_participant + DROP dateTouched; diff --git a/src/applications/conpherence/editor/ConpherenceEditor.php b/src/applications/conpherence/editor/ConpherenceEditor.php --- a/src/applications/conpherence/editor/ConpherenceEditor.php +++ b/src/applications/conpherence/editor/ConpherenceEditor.php @@ -181,7 +181,6 @@ id(new ConpherenceParticipant()) ->setConpherencePHID($object->getPHID()) ->setParticipantPHID($phid) - ->setDateTouched(time()) ->setSeenMessageCount($message_count) ->save(); $object->attachParticipants($participants); @@ -248,7 +247,6 @@ id(new ConpherenceParticipant()) ->setConpherencePHID($object->getPHID()) ->setParticipantPHID($phid) - ->setDateTouched(time()) ->setSeenMessageCount($message_count) ->save(); } @@ -282,10 +280,8 @@ $participant->setSeenMessageCount( $object->getMessageCount() - $message_count); } - $participant->setDateTouched($time); } else { $participant->setSeenMessageCount($object->getMessageCount()); - $participant->setDateTouched($time); } $participant->save(); } diff --git a/src/applications/conpherence/query/ConpherenceParticipantQuery.php b/src/applications/conpherence/query/ConpherenceParticipantQuery.php --- a/src/applications/conpherence/query/ConpherenceParticipantQuery.php +++ b/src/applications/conpherence/query/ConpherenceParticipantQuery.php @@ -1,128 +1,65 @@ withParticipantPHIDs(array($my_phid)) - * ->execute(); - * - * - Q: What are the next set of conpherences as I scroll up (more recent) or - * down (less recent) this list of conpherences? - * - A: - * - * id(new ConpherenceParticipantQuery()) - * ->withParticipantPHIDs(array($my_phid)) - * ->withParticipantCursor($top_participant) - * ->setOrder(ConpherenceParticipantQuery::ORDER_NEWER) - * ->execute(); - * - * -or- - * - * id(new ConpherenceParticipantQuery()) - * ->withParticipantPHIDs(array($my_phid)) - * ->withParticipantCursor($bottom_participant) - * ->setOrder(ConpherenceParticipantQuery::ORDER_OLDER) - * ->execute(); - * - * For counts of read, un-read, or all conpherences by participant, see - * @{class:ConpherenceParticipantCountQuery}. - */ final class ConpherenceParticipantQuery extends PhabricatorOffsetPagedQuery { - const LIMIT = 100; - const ORDER_NEWER = 'newer'; - const ORDER_OLDER = 'older'; - private $participantPHIDs; - private $participantCursor; - private $order = self::ORDER_OLDER; public function withParticipantPHIDs(array $phids) { $this->participantPHIDs = $phids; return $this; } - public function withParticipantCursor(ConpherenceParticipant $participant) { - $this->participantCursor = $participant; - return $this; - } - - public function setOrder($order) { - $this->order = $order; - return $this; - } - public function execute() { $table = new ConpherenceParticipant(); - $conn_r = $table->establishConnection('r'); + $thread = new ConpherenceThread(); + + $conn = $table->establishConnection('r'); $data = queryfx_all( - $conn_r, - 'SELECT * FROM %T participant %Q %Q %Q', + $conn, + 'SELECT * FROM %T participant JOIN %T thread + ON participant.conpherencePHID = thread.phid %Q %Q %Q', $table->getTableName(), - $this->buildWhereClause($conn_r), - $this->buildOrderClause($conn_r), - $this->buildLimitClause($conn_r)); + $thread->getTableName(), + $this->buildWhereClause($conn), + $this->buildOrderClause($conn), + $this->buildLimitClause($conn)); $participants = $table->loadAllFromArray($data); - $participants = mpull($participants, null, 'getConpherencePHID'); - - if ($this->order == self::ORDER_NEWER) { - $participants = array_reverse($participants); + // TODO: Fix this, it's bogus. + if ('garbage') { + if (count($this->participantPHIDs) !== 1) { + throw new Exception( + pht( + 'This query only works when querying for exactly one participant '. + 'PHID!')); + } + // This will throw results away if we aren't doing a query for exactly + // one participant PHID. + $participants = mpull($participants, null, 'getConpherencePHID'); } return $participants; } - protected function buildWhereClause(AphrontDatabaseConnection $conn_r) { + protected function buildWhereClause(AphrontDatabaseConnection $conn) { $where = array(); - if ($this->participantPHIDs) { + if ($this->participantPHIDs !== null) { $where[] = qsprintf( - $conn_r, + $conn, 'participantPHID IN (%Ls)', $this->participantPHIDs); } - if ($this->participantCursor) { - $date_touched = $this->participantCursor->getDateTouched(); - $id = $this->participantCursor->getID(); - if ($this->order == self::ORDER_OLDER) { - $compare_date = '<'; - $compare_id = '<='; - } else { - $compare_date = '>'; - $compare_id = '>='; - } - $where[] = qsprintf( - $conn_r, - '(dateTouched %Q %d OR (dateTouched = %d AND id %Q %d))', - $compare_date, - $date_touched, - $date_touched, - $compare_id, - $id); - } - return $this->formatWhereClause($where); } - private function buildOrderClause(AphrontDatabaseConnection $conn_r) { - $order_word = ($this->order == self::ORDER_OLDER) ? 'DESC' : 'ASC'; - // if these are different direction we won't get as efficient a query - // see http://dev.mysql.com/doc/refman/5.5/en/order-by-optimization.html - $order = qsprintf( - $conn_r, - 'ORDER BY dateTouched %Q, id %Q', - $order_word, - $order_word); - - return $order; + private function buildOrderClause(AphrontDatabaseConnection $conn) { + return qsprintf( + $conn, + 'ORDER BY thread.dateModified DESC, thread.id DESC, participant.id DESC'); } } diff --git a/src/applications/conpherence/storage/ConpherenceParticipant.php b/src/applications/conpherence/storage/ConpherenceParticipant.php --- a/src/applications/conpherence/storage/ConpherenceParticipant.php +++ b/src/applications/conpherence/storage/ConpherenceParticipant.php @@ -5,7 +5,6 @@ protected $participantPHID; protected $conpherencePHID; protected $seenMessageCount; - protected $dateTouched; protected $settings = array(); protected function getConfiguration() { @@ -14,7 +13,6 @@ 'settings' => self::SERIALIZATION_JSON, ), self::CONFIG_COLUMN_SCHEMA => array( - 'dateTouched' => 'epoch', 'seenMessageCount' => 'uint64', ), self::CONFIG_KEY_SCHEMA => array( @@ -22,9 +20,6 @@ 'columns' => array('conpherencePHID', 'participantPHID'), 'unique' => true, ), - 'participationIndex' => array( - 'columns' => array('participantPHID', 'dateTouched', 'id'), - ), 'key_thread' => array( 'columns' => array('participantPHID', 'conpherencePHID'), ),