mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00:32:42 +01:00
Fix "Map omits required key" exception by comparing result order against modern field keys
Summary: Sorting a Maniphest search query by custom fields throws a "Map returned omits required key" exception. The `isCustomFieldOrderKey()` check still tested against legacy field key format (for example `[custom:]std:maniphest:deadline.due`) while the code passes modern field key format (for example `custom.deadline.due`). After fixing this, `PhutilTypeSpec::checkMap()` throws an exception when a non-optional (extra) key `$column` is in `$columns` but not in the array of type parameters below to check against: `"Got unexpected parameters: customfield, customfield.index.table, customfield.index.key"` Thus add optional types for customfields in `buildPagingClauseFromMultipleColumns()` to allow them instead of throwing another exception. Closes T15631 Test Plan: * Have a custom field (with search: true) defined via http://phorge.localhost/config/edit/maniphest.custom-field-definitions/ * Have two tasks have the custom field set * Go to http://phorge.localhost/maniphest/query/ , select the custom field (e.g. "Due Date (Reversed)") in the "Order By" field, and click the "Search" button. Iterate through the results via the "Next" button if needed Reviewers: O1 Blessed Committers, valerio.bozzolan Reviewed By: O1 Blessed Committers, valerio.bozzolan Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno Maniphest Tasks: T15631 Differential Revision: https://we.phorge.it/D25504
This commit is contained in:
parent
328aee033f
commit
d42b3eb0b1
1 changed files with 5 additions and 2 deletions
|
@ -735,6 +735,9 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery
|
||||||
array(
|
array(
|
||||||
'table' => 'optional string|null',
|
'table' => 'optional string|null',
|
||||||
'column' => 'string',
|
'column' => 'string',
|
||||||
|
'customfield' => 'optional bool',
|
||||||
|
'customfield.index.key' => 'optional string',
|
||||||
|
'customfield.index.table' => 'optional string',
|
||||||
'value' => 'wild',
|
'value' => 'wild',
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
'reverse' => 'optional bool',
|
'reverse' => 'optional bool',
|
||||||
|
@ -1747,7 +1750,7 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery
|
||||||
|
|
||||||
$map = array();
|
$map = array();
|
||||||
foreach ($fields->getFields() as $field) {
|
foreach ($fields->getFields() as $field) {
|
||||||
$map['custom:'.$field->getFieldKey()] = $field->getValueForStorage();
|
$map[$field->getModernFieldKey()] = $field->getValueForStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $map;
|
return $map;
|
||||||
|
@ -1758,7 +1761,7 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery
|
||||||
* @task customfield
|
* @task customfield
|
||||||
*/
|
*/
|
||||||
protected function isCustomFieldOrderKey($key) {
|
protected function isCustomFieldOrderKey($key) {
|
||||||
$prefix = 'custom:';
|
$prefix = 'custom.';
|
||||||
return !strncmp($key, $prefix, strlen($prefix));
|
return !strncmp($key, $prefix, strlen($prefix));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue