Changeset View
Changeset View
Standalone View
Standalone View
src/applications/fact/storage/PhabricatorFactDimension.php
<?php | <?php | ||||
abstract class PhabricatorFactDimension extends PhabricatorFactDAO { | abstract class PhabricatorFactDimension extends PhabricatorFactDAO { | ||||
abstract protected function getDimensionColumnName(); | abstract protected function getDimensionColumnName(); | ||||
final public function newDimensionID($key) { | final public function newDimensionID($key, $create = false) { | ||||
$map = $this->newDimensionMap(array($key)); | $map = $this->newDimensionMap(array($key), $create); | ||||
return idx($map, $key); | return idx($map, $key); | ||||
} | } | ||||
final public function newDimensionUnmap(array $ids) { | |||||
if (!$ids) { | |||||
return array(); | |||||
} | |||||
$conn = $this->establishConnection('r'); | |||||
$column = $this->getDimensionColumnName(); | |||||
$rows = queryfx_all( | |||||
$conn, | |||||
'SELECT id, %C FROM %T WHERE id IN (%Ld)', | |||||
$column, | |||||
$this->getTableName(), | |||||
$ids); | |||||
$rows = ipull($rows, $column, 'id'); | |||||
return $rows; | |||||
} | |||||
final public function newDimensionMap(array $keys, $create = false) { | final public function newDimensionMap(array $keys, $create = false) { | ||||
if (!$keys) { | if (!$keys) { | ||||
return array(); | return array(); | ||||
} | } | ||||
$conn = $this->establishConnection('r'); | $conn = $this->establishConnection('r'); | ||||
$column = $this->getDimensionColumnName(); | $column = $this->getDimensionColumnName(); | ||||
Show All 27 Lines | final public function newDimensionMap(array $keys, $create = false) { | ||||
$sql = array(); | $sql = array(); | ||||
foreach ($need as $key) { | foreach ($need as $key) { | ||||
$sql[] = qsprintf( | $sql[] = qsprintf( | ||||
$conn, | $conn, | ||||
'(%s)', | '(%s)', | ||||
$key); | $key); | ||||
} | } | ||||
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); | |||||
foreach (PhabricatorLiskDAO::chunkSQL($sql) as $chunk) { | foreach (PhabricatorLiskDAO::chunkSQL($sql) as $chunk) { | ||||
queryfx( | queryfx( | ||||
$conn, | $conn, | ||||
'INSERT IGNORE INTO %T (%C) VALUES %Q', | 'INSERT IGNORE INTO %T (%C) VALUES %Q', | ||||
$this->getTableName(), | $this->getTableName(), | ||||
$column, | $column, | ||||
$chunk); | $chunk); | ||||
} | } | ||||
unset($unguarded); | |||||
$rows = queryfx_all( | $rows = queryfx_all( | ||||
$conn, | $conn, | ||||
'SELECT id, %C FROM %T WHERE %C IN (%Ls)', | 'SELECT id, %C FROM %T WHERE %C IN (%Ls)', | ||||
$column, | $column, | ||||
$this->getTableName(), | $this->getTableName(), | ||||
$column, | $column, | ||||
$need); | $need); | ||||
Show All 19 Lines |