Load all diff properties in revision view
Summary: We need to load all properties with some prefix in one field. We can't merge them in one property because there will be a race condition for update (we don't have API for load+update+save). Instead of providing API for this and complicating the code even more, just load everything unconditionally. It shouldn't waste much bandwith or memory because we use most of the properties anyway. It also looked overengineered to me. Test Plan: Displayed revision with fields using diff properties. Reviewers: epriestley, royw Reviewed By: royw CC: aran, royw, Korvin Differential Revision: https://secure.phabricator.com/D3676
This commit is contained in:
@@ -82,16 +82,12 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
||||
$repository);
|
||||
}
|
||||
|
||||
list($aux_fields, $props) = $this->loadAuxiliaryFieldsAndProperties(
|
||||
$revision,
|
||||
$target,
|
||||
$target_manual,
|
||||
array(
|
||||
'local:commits',
|
||||
'arc:lint',
|
||||
'arc:unit',
|
||||
));
|
||||
$props = id(new DifferentialDiffProperty())->loadAllWhere(
|
||||
'diffID = %d',
|
||||
$target_manual->getID());
|
||||
$props = mpull($props, 'getData', 'getName');
|
||||
|
||||
$aux_fields = $this->loadAuxiliaryFields($revision);
|
||||
|
||||
$comments = $revision->loadComments();
|
||||
$comments = array_merge(
|
||||
@@ -139,6 +135,9 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
||||
|
||||
$aux_phids = array();
|
||||
foreach ($aux_fields as $key => $aux_field) {
|
||||
$aux_field->setDiff($target);
|
||||
$aux_field->setManualDiff($target_manual);
|
||||
$aux_field->setDiffProperties($props);
|
||||
$aux_phids[$key] = $aux_field->getRequiredHandlePHIDsForRevisionView();
|
||||
}
|
||||
$object_phids = array_merge($object_phids, array_mergev($aux_phids));
|
||||
@@ -740,11 +739,7 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
||||
return array($changesets, $vs_map, $vs_changesets, $refs);
|
||||
}
|
||||
|
||||
private function loadAuxiliaryFieldsAndProperties(
|
||||
DifferentialRevision $revision,
|
||||
DifferentialDiff $diff,
|
||||
DifferentialDiff $manual_diff,
|
||||
array $special_properties) {
|
||||
private function loadAuxiliaryFields(DifferentialRevision $revision) {
|
||||
|
||||
$aux_fields = DifferentialFieldSelector::newSelector()
|
||||
->getFieldSpecifications();
|
||||
@@ -760,46 +755,7 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
||||
$revision,
|
||||
$aux_fields);
|
||||
|
||||
$aux_props = array();
|
||||
foreach ($aux_fields as $key => $aux_field) {
|
||||
$aux_field->setDiff($diff);
|
||||
$aux_field->setManualDiff($manual_diff);
|
||||
$aux_props[$key] = $aux_field->getRequiredDiffProperties();
|
||||
}
|
||||
|
||||
$required_properties = array_mergev($aux_props);
|
||||
$required_properties = array_merge(
|
||||
$required_properties,
|
||||
$special_properties);
|
||||
|
||||
$property_map = array();
|
||||
if ($required_properties) {
|
||||
$properties = id(new DifferentialDiffProperty())->loadAllWhere(
|
||||
'diffID = %d AND name IN (%Ls)',
|
||||
$manual_diff->getID(),
|
||||
$required_properties);
|
||||
$property_map = mpull($properties, 'getData', 'getName');
|
||||
}
|
||||
|
||||
foreach ($aux_fields as $key => $aux_field) {
|
||||
// Give each field only the properties it specifically required, and
|
||||
// set 'null' for each requested key which we didn't actually load a
|
||||
// value for (otherwise, getDiffProperty() will throw).
|
||||
if ($aux_props[$key]) {
|
||||
$props = array_select_keys($property_map, $aux_props[$key]) +
|
||||
array_fill_keys($aux_props[$key], null);
|
||||
} else {
|
||||
$props = array();
|
||||
}
|
||||
|
||||
$aux_field->setDiffProperties($props);
|
||||
}
|
||||
|
||||
return array(
|
||||
$aux_fields,
|
||||
array_select_keys(
|
||||
$property_map,
|
||||
$special_properties));
|
||||
return $aux_fields;
|
||||
}
|
||||
|
||||
private function buildSymbolIndexes(
|
||||
|
||||
Reference in New Issue
Block a user