Path: blob/master/src/applications/fact/storage/PhabricatorFactDimension.php
12256 views
<?php12abstract class PhabricatorFactDimension extends PhabricatorFactDAO {34abstract protected function getDimensionColumnName();56final public function newDimensionID($key, $create = false) {7$map = $this->newDimensionMap(array($key), $create);8return idx($map, $key);9}1011final public function newDimensionUnmap(array $ids) {12if (!$ids) {13return array();14}1516$conn = $this->establishConnection('r');17$column = $this->getDimensionColumnName();1819$rows = queryfx_all(20$conn,21'SELECT id, %C FROM %T WHERE id IN (%Ld)',22$column,23$this->getTableName(),24$ids);25$rows = ipull($rows, $column, 'id');2627return $rows;28}2930final public function newDimensionMap(array $keys, $create = false) {31if (!$keys) {32return array();33}3435$conn = $this->establishConnection('r');36$column = $this->getDimensionColumnName();3738$rows = queryfx_all(39$conn,40'SELECT id, %C FROM %T WHERE %C IN (%Ls)',41$column,42$this->getTableName(),43$column,44$keys);45$rows = ipull($rows, 'id', $column);4647$map = array();48$need = array();49foreach ($keys as $key) {50if (isset($rows[$key])) {51$map[$key] = (int)$rows[$key];52} else {53$need[] = $key;54}55}5657if (!$need) {58return $map;59}6061if (!$create) {62return $map;63}6465$sql = array();66foreach ($need as $key) {67$sql[] = qsprintf(68$conn,69'(%s)',70$key);71}7273$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();74foreach (PhabricatorLiskDAO::chunkSQL($sql) as $chunk) {75queryfx(76$conn,77'INSERT IGNORE INTO %T (%C) VALUES %LQ',78$this->getTableName(),79$column,80$chunk);81}82unset($unguarded);8384$rows = queryfx_all(85$conn,86'SELECT id, %C FROM %T WHERE %C IN (%Ls)',87$column,88$this->getTableName(),89$column,90$need);91$rows = ipull($rows, 'id', $column);9293foreach ($need as $key) {94if (isset($rows[$key])) {95$map[$key] = (int)$rows[$key];96} else {97throw new Exception(98pht(99'Failed to load or generate dimension ID ("%s") for dimension '.100'key "%s".',101get_class($this),102$key));103}104}105106return $map;107}108109}110111112