public function loadObjects(PhabricatorObjectQuery $object_query, array $phids) { static $queries; if ($queries === null) { $objects = id(new PhutilClassMapQuery())->setAncestorClass('PhabricatorApplicationTransactionQuery')->execute(); $queries = array(); foreach ($objects as $object) { $type = $object->getTemplateApplicationTransaction()->getApplicationTransactionType(); $queries[$type] = $object; } } $phid_subtypes = array(); foreach ($phids as $phid) { $subtype = phid_get_subtype($phid); if ($subtype) { $phid_subtypes[$subtype][] = $phid; } } $results = array(); foreach ($phid_subtypes as $subtype => $subtype_phids) { $query = idx($queries, $subtype); if (!$query) { continue; } $xaction_query = id(clone $query)->setViewer($object_query->getViewer())->setParentQuery($object_query)->withPHIDs($subtype_phids); if (!$xaction_query->canViewerUseQueryApplication()) { $object_query->addPolicyFilteredPHIDs(array_fuse($subtype_phids)); continue; } $xactions = $xaction_query->execute(); $results += mpull($xactions, null, 'getPHID'); } return $results; }
/** * Load the transactions to be published. */ private function loadTransactions(PhabricatorApplicationTransactionInterface $object) { $data = $this->getTaskData(); $xaction_phids = idx($data, 'xactionPHIDs'); if (!$xaction_phids) { throw new PhabricatorWorkerPermanentFailureException(pht('Task has no transaction PHIDs!')); } $viewer = PhabricatorUser::getOmnipotentUser(); $type = phid_get_subtype(head($xaction_phids)); $xactions = $this->buildTransactionQuery($type)->setViewer($viewer)->withPHIDs($xaction_phids)->needComments(true)->execute(); $xactions = mpull($xactions, null, 'getPHID'); $missing = array_diff($xaction_phids, array_keys($xactions)); if ($missing) { throw new PhabricatorWorkerPermanentFailureException(pht('Unable to load transactions: %s.', implode(', ', $missing))); } return array_select_keys($xactions, $xaction_phids); }