Path: blob/master/src/applications/harbormaster/query/HarbormasterBuildQuery.php
12256 views
<?php12final class HarbormasterBuildQuery3extends PhabricatorCursorPagedPolicyAwareQuery {45private $ids;6private $phids;7private $buildStatuses;8private $buildablePHIDs;9private $buildPlanPHIDs;10private $initiatorPHIDs;11private $needBuildTargets;12private $autobuilds;1314public function withIDs(array $ids) {15$this->ids = $ids;16return $this;17}1819public function withPHIDs(array $phids) {20$this->phids = $phids;21return $this;22}2324public function withBuildStatuses(array $build_statuses) {25$this->buildStatuses = $build_statuses;26return $this;27}2829public function withBuildablePHIDs(array $buildable_phids) {30$this->buildablePHIDs = $buildable_phids;31return $this;32}3334public function withBuildPlanPHIDs(array $build_plan_phids) {35$this->buildPlanPHIDs = $build_plan_phids;36return $this;37}3839public function withInitiatorPHIDs(array $initiator_phids) {40$this->initiatorPHIDs = $initiator_phids;41return $this;42}4344public function withAutobuilds($with_autobuilds) {45$this->autobuilds = $with_autobuilds;46return $this;47}4849public function needBuildTargets($need_targets) {50$this->needBuildTargets = $need_targets;51return $this;52}5354public function newResultObject() {55return new HarbormasterBuild();56}5758protected function willFilterPage(array $page) {59$buildables = array();6061$buildable_phids = array_filter(mpull($page, 'getBuildablePHID'));62if ($buildable_phids) {63$buildables = id(new PhabricatorObjectQuery())64->setViewer($this->getViewer())65->withPHIDs($buildable_phids)66->setParentQuery($this)67->execute();68$buildables = mpull($buildables, null, 'getPHID');69}7071foreach ($page as $key => $build) {72$buildable_phid = $build->getBuildablePHID();73if (empty($buildables[$buildable_phid])) {74unset($page[$key]);75continue;76}77$build->attachBuildable($buildables[$buildable_phid]);78}7980return $page;81}8283protected function didFilterPage(array $page) {84$plans = array();8586$plan_phids = array_filter(mpull($page, 'getBuildPlanPHID'));87if ($plan_phids) {88$plans = id(new PhabricatorObjectQuery())89->setViewer($this->getViewer())90->withPHIDs($plan_phids)91->setParentQuery($this)92->execute();93$plans = mpull($plans, null, 'getPHID');94}9596foreach ($page as $key => $build) {97$plan_phid = $build->getBuildPlanPHID();98$build->attachBuildPlan(idx($plans, $plan_phid));99}100101$build_phids = mpull($page, 'getPHID');102$messages = id(new HarbormasterBuildMessage())->loadAllWhere(103'receiverPHID IN (%Ls) AND isConsumed = 0 ORDER BY id ASC',104$build_phids);105$messages = mgroup($messages, 'getReceiverPHID');106foreach ($page as $build) {107$unprocessed_messages = idx($messages, $build->getPHID(), array());108$build->attachUnprocessedMessages($unprocessed_messages);109}110111if ($this->needBuildTargets) {112$targets = id(new HarbormasterBuildTargetQuery())113->setViewer($this->getViewer())114->setParentQuery($this)115->withBuildPHIDs($build_phids)116->execute();117118// TODO: Some day, when targets have dependencies, we should toposort119// these. For now, just put them into chronological order.120$targets = array_reverse($targets);121122$targets = mgroup($targets, 'getBuildPHID');123foreach ($page as $build) {124$build_targets = idx($targets, $build->getPHID(), array());125126foreach ($build_targets as $phid => $target) {127if ($target->getBuildGeneration() !== $build->getBuildGeneration()) {128unset($build_targets[$phid]);129}130}131132$build->attachBuildTargets($build_targets);133}134}135136return $page;137}138139protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {140$where = parent::buildWhereClauseParts($conn);141142if ($this->ids !== null) {143$where[] = qsprintf(144$conn,145'b.id IN (%Ld)',146$this->ids);147}148149if ($this->phids !== null) {150$where[] = qsprintf(151$conn,152'b.phid in (%Ls)',153$this->phids);154}155156if ($this->buildStatuses !== null) {157$where[] = qsprintf(158$conn,159'b.buildStatus in (%Ls)',160$this->buildStatuses);161}162163if ($this->buildablePHIDs !== null) {164$where[] = qsprintf(165$conn,166'b.buildablePHID IN (%Ls)',167$this->buildablePHIDs);168}169170if ($this->buildPlanPHIDs !== null) {171$where[] = qsprintf(172$conn,173'b.buildPlanPHID IN (%Ls)',174$this->buildPlanPHIDs);175}176177if ($this->initiatorPHIDs !== null) {178$where[] = qsprintf(179$conn,180'b.initiatorPHID IN (%Ls)',181$this->initiatorPHIDs);182}183184if ($this->autobuilds !== null) {185if ($this->autobuilds) {186$where[] = qsprintf(187$conn,188'p.planAutoKey IS NOT NULL');189} else {190$where[] = qsprintf(191$conn,192'p.planAutoKey IS NULL');193}194}195196return $where;197}198199protected function buildJoinClauseParts(AphrontDatabaseConnection $conn) {200$joins = parent::buildJoinClauseParts($conn);201202if ($this->shouldJoinPlanTable()) {203$joins[] = qsprintf(204$conn,205'JOIN %T p ON b.buildPlanPHID = p.phid',206id(new HarbormasterBuildPlan())->getTableName());207}208209return $joins;210}211212private function shouldJoinPlanTable() {213if ($this->autobuilds !== null) {214return true;215}216217return false;218}219220public function getQueryApplicationClass() {221return 'PhabricatorHarbormasterApplication';222}223224protected function getPrimaryTableAlias() {225return 'b';226}227228}229230231