From 827bb916a7a95b145580f369d08bd0ce8fbef948 Mon Sep 17 00:00:00 2001 From: Dan Feder Date: Fri, 4 Mar 2022 16:42:18 -0500 Subject: [PATCH] Switch to comma-separated values for search API sorts (#3760) * Switch to comma-separated values * Update docs --- .../metastore_search/docs/openapi_spec.json | 25 ++++++++++++------- .../DkanApiDocs/MetastoreSearchApiDocs.php | 5 +++- .../src/QueryBuilderTrait.php | 10 +++++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/modules/metastore/modules/metastore_search/docs/openapi_spec.json b/modules/metastore/modules/metastore_search/docs/openapi_spec.json index 6b17b9105c..6758e8691e 100644 --- a/modules/metastore/modules/metastore_search/docs/openapi_spec.json +++ b/modules/metastore/modules/metastore_search/docs/openapi_spec.json @@ -72,23 +72,30 @@ { "name": "sort", "in": "query", - "description": "Which property to sort results on. Use array format to sort on multiple properties, e.g. sort[0]=field1&sort[1]=field2", + "description": "Which property to sort results on.", "schema": { - "type": "string" + "type": "array", + "items": { + "type": "string", + "default": "title" + } }, - "style": "form" + "style": "form", + "explode": false }, { "name": "sort-order", "in": "query", - "description": "Sort results in ascending or descending order. If sorting on multiple properties, use array format to map to sort values, e.g. sort-order[0]=asc&sort-order[1]=desc", + "description": "Sort results in ascending or descending order. Allowed values: asc, desc", "schema": { - "type": "string", - "default": "asc", - "enum": [ "asc", "desc"] + "type": "array", + "items": { + "type": "string", + "default": "asc" + } }, - "example": "desc", - "style": "form" + "style": "form", + "explode": false }, { "name": "facets", diff --git a/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php b/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php index e682acfd98..097f91c857 100644 --- a/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php +++ b/modules/metastore/modules/metastore_search/src/Plugin/DkanApiDocs/MetastoreSearchApiDocs.php @@ -82,7 +82,10 @@ public static function create( public function spec() { $spec = $this->getDoc('metastore_search'); - $spec['paths']['/api/1/search']['get']['parameters'][3]['schema']['enum'] = $this->getIndexedFields(); + $propList = $this->t('Available properties: %list', [ + '%list' => implode(", ", $this->getIndexedFields()), + ]); + $spec['paths']['/api/1/search']['get']['parameters'][3]['description'] .= " $propList"; $facetTypes = $this->getFacetTypes(); foreach ($facetTypes as $type => $example) { diff --git a/modules/metastore/modules/metastore_search/src/QueryBuilderTrait.php b/modules/metastore/modules/metastore_search/src/QueryBuilderTrait.php index 28f2a70e4e..3e65b20d50 100644 --- a/modules/metastore/modules/metastore_search/src/QueryBuilderTrait.php +++ b/modules/metastore/modules/metastore_search/src/QueryBuilderTrait.php @@ -159,9 +159,11 @@ private function setSort(QueryInterface $query, array $params, IndexInterface $i $fields = array_keys($index->getFields()); $sorts = $params['sort'] ?? []; - if (!is_array($sorts)) { - $sorts = [$sorts]; + if (is_string($sorts)) { + // @todo Move this into Util class to share with FacetsCommonTrait. + $sorts = array_map('trim', str_getcsv($sorts)); } + if (empty($sorts)) { $query->sort('search_api_relevance', Query::SORT_DESC); } @@ -194,8 +196,8 @@ private function getSortOrder(array $params, int $index = 0) { $default = QueryInterface::SORT_ASC; $orders = $params['sort-order'] ?? []; - if (!is_array($orders)) { - $orders = [$orders]; + if (is_string($orders)) { + $orders = array_map('trim', str_getcsv($orders)); } if (!isset($orders[$index]) || !in_array($orders[$index], $allowed)) {