1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-19 16:58:48 +02: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:
Andre Klapper 2024-01-04 10:16:15 +01:00
parent 328aee033f
commit d42b3eb0b1

View file

@ -735,6 +735,9 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery
array(
'table' => 'optional string|null',
'column' => 'string',
'customfield' => 'optional bool',
'customfield.index.key' => 'optional string',
'customfield.index.table' => 'optional string',
'value' => 'wild',
'type' => 'string',
'reverse' => 'optional bool',
@ -1747,7 +1750,7 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery
$map = array();
foreach ($fields->getFields() as $field) {
$map['custom:'.$field->getFieldKey()] = $field->getValueForStorage();
$map[$field->getModernFieldKey()] = $field->getValueForStorage();
}
return $map;
@ -1758,7 +1761,7 @@ abstract class PhabricatorCursorPagedPolicyAwareQuery
* @task customfield
*/
protected function isCustomFieldOrderKey($key) {
$prefix = 'custom:';
$prefix = 'custom.';
return !strncmp($key, $prefix, strlen($prefix));
}