Path: blob/master/src/infrastructure/export/engine/PhabricatorExportEngine.php
12242 views
<?php12final class PhabricatorExportEngine3extends Phobject {45private $viewer;6private $searchEngine;7private $savedQuery;8private $exportFormat;9private $filename;10private $title;1112public function setViewer(PhabricatorUser $viewer) {13$this->viewer = $viewer;14return $this;15}1617public function getViewer() {18return $this->viewer;19}2021public function setSearchEngine(22PhabricatorApplicationSearchEngine $search_engine) {23$this->searchEngine = $search_engine;24return $this;25}2627public function getSearchEngine() {28return $this->searchEngine;29}3031public function setSavedQuery(PhabricatorSavedQuery $saved_query) {32$this->savedQuery = $saved_query;33return $this;34}3536public function getSavedQuery() {37return $this->savedQuery;38}3940public function setExportFormat(41PhabricatorExportFormat $export_format) {42$this->exportFormat = $export_format;43return $this;44}4546public function getExportFormat() {47return $this->exportFormat;48}4950public function setFilename($filename) {51$this->filename = $filename;52return $this;53}5455public function getFilename() {56return $this->filename;57}5859public function setTitle($title) {60$this->title = $title;61return $this;62}6364public function getTitle() {65return $this->title;66}6768public function newBulkJob(AphrontRequest $request) {69$viewer = $this->getViewer();70$engine = $this->getSearchEngine();71$saved_query = $this->getSavedQuery();72$format = $this->getExportFormat();7374$params = array(75'engineClass' => get_class($engine),76'queryKey' => $saved_query->getQueryKey(),77'formatKey' => $format->getExportFormatKey(),78'title' => $this->getTitle(),79'filename' => $this->getFilename(),80);8182$job = PhabricatorWorkerBulkJob::initializeNewJob(83$viewer,84new PhabricatorExportEngineBulkJobType(),85$params);8687// We queue these jobs directly into STATUS_WAITING without requiring88// a confirmation from the user.8990$xactions = array();9192$xactions[] = id(new PhabricatorWorkerBulkJobTransaction())93->setTransactionType(PhabricatorWorkerBulkJobTransaction::TYPE_STATUS)94->setNewValue(PhabricatorWorkerBulkJob::STATUS_WAITING);9596$editor = id(new PhabricatorWorkerBulkJobEditor())97->setActor($viewer)98->setContentSourceFromRequest($request)99->setContinueOnMissingFields(true)100->applyTransactions($job, $xactions);101102return $job;103}104105public function exportFile() {106$viewer = $this->getViewer();107$engine = $this->getSearchEngine();108$saved_query = $this->getSavedQuery();109$format = $this->getExportFormat();110$title = $this->getTitle();111$filename = $this->getFilename();112113$query = $engine->buildQueryFromSavedQuery($saved_query);114115$extension = $format->getFileExtension();116$mime_type = $format->getMIMEContentType();117$filename = $filename.'.'.$extension;118119$format = id(clone $format)120->setViewer($viewer)121->setTitle($title);122123$field_list = $engine->newExportFieldList();124$field_list = mpull($field_list, null, 'getKey');125$format->addHeaders($field_list);126127// Iterate over the query results in large pages so we don't have to hold128// too much stuff in memory.129$page_size = 1000;130$page_cursor = null;131do {132$pager = $engine->newPagerForSavedQuery($saved_query);133$pager->setPageSize($page_size);134135if ($page_cursor !== null) {136$pager->setAfterID($page_cursor);137}138139$objects = $engine->executeQuery($query, $pager);140$objects = array_values($objects);141$page_cursor = $pager->getNextPageID();142143$export_data = $engine->newExport($objects);144for ($ii = 0; $ii < count($objects); $ii++) {145$format->addObject($objects[$ii], $field_list, $export_data[$ii]);146}147} while ($pager->getHasMoreResults());148149$export_result = $format->newFileData();150151// We have all the data in one big string and aren't actually152// streaming it, but pretending that we are allows us to actviate153// the chunk engine and store large files.154$iterator = new ArrayIterator(array($export_result));155156$source = id(new PhabricatorIteratorFileUploadSource())157->setName($filename)158->setViewPolicy(PhabricatorPolicies::POLICY_NOONE)159->setMIMEType($mime_type)160->setRelativeTTL(phutil_units('60 minutes in seconds'))161->setAuthorPHID($viewer->getPHID())162->setIterator($iterator);163164return $source->uploadFile();165}166167}168169170