From 16cc26d30e16f197a4b58dab0493a2e681c4dee5 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 24 Nov 2025 13:45:04 +0100 Subject: [PATCH 1/8] feat: add metadata_fields param to "my data" API --- .../harvard/iq/dataverse/mydata/DataRetrieverAPI.java | 9 +++++---- .../harvard/iq/dataverse/search/SolrSearchResult.java | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java index f9f1379e2af..1cd0e88e6b3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java @@ -154,7 +154,8 @@ private void verifyAuth (ContainerRequestContext crc, String userIdentifier) thr public String retrieveMyDataAsJsonString( @Context ContainerRequestContext crc, @QueryParam("dvobject_types") List dvobject_types, - @QueryParam("published_states") List published_states, + @QueryParam("published_states") List published_states, + @QueryParam("metadata_fields") List metadataFields, @QueryParam("selected_page") Integer selectedPage, @QueryParam("mydata_search_term") String searchTerm, @QueryParam("role_ids") List roleIds, @@ -284,7 +285,7 @@ public String retrieveMyDataAsJsonString( Json.createObjectBuilder() .add("pagination", pager.asJsonObjectBuilderUsingCardTerms()) //.add(SearchConstants.SEARCH_API_ITEMS, this.formatSolrDocs(solrQueryResponse, filterParams, this.myDataFinder)) - .add(SearchConstants.SEARCH_API_ITEMS, this.formatSolrDocs(solrQueryResponse, roleTagRetriever)) + .add(SearchConstants.SEARCH_API_ITEMS, this.formatSolrDocs(solrQueryResponse, roleTagRetriever, metadataFields)) .add(SearchConstants.SEARCH_API_TOTAL_COUNT, solrQueryResponse.getNumResultsFound()) .add(SearchConstants.SEARCH_API_START, solrQueryResponse.getResultsStart()) .add("search_term", filterParams.getSearchTerm()) @@ -347,7 +348,7 @@ private JsonObjectBuilder getPublicationStatusCounts(SolrQueryResponse solrRespo * @param roleTagRetriever * @return */ - private JsonArrayBuilder formatSolrDocs(SolrQueryResponse solrResponse, RoleTagRetriever roleTagRetriever ){ + private JsonArrayBuilder formatSolrDocs(SolrQueryResponse solrResponse, RoleTagRetriever roleTagRetriever, List metadataFields){ if (solrResponse == null){ throw new NullPointerException("DataRetrieverAPI.formatSolrDocs: solrResponse should not be null"); } @@ -365,7 +366,7 @@ private JsonArrayBuilder formatSolrDocs(SolrQueryResponse solrResponse, RoleTagR // (a) Get core card data from solr // ------------------------------------------- - myDataCardInfo = doc.getJsonForMyData(isValid(doc)); + myDataCardInfo = doc.getJsonForMyData(isValid(doc), metadataFields); if (doc.getEntity() != null && !doc.getEntity().isInstanceofDataFile()){ String parentAlias = dataverseService.getParentAliasString(doc); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java index 67af99e4b78..a725b73ee70 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java @@ -438,9 +438,9 @@ public JsonArrayBuilder getRelevance() { * * @return */ - public JsonObjectBuilder getJsonForMyData(boolean isValid) { + public JsonObjectBuilder getJsonForMyData(boolean isValid, List metadataFields) { - JsonObjectBuilder myDataJson = json(true, true, true);// boolean showRelevance, boolean showEntityIds, boolean showApiUrls) + JsonObjectBuilder myDataJson = json(true, true, true, metadataFields); myDataJson.add("publication_statuses", this.getPublicationStatusesAsJSON()) .add("is_draft_state", this.isDraftState()).add("is_in_review_state", this.isInReviewState()) From 3b2f1db2a5a4ad60add1b2bf185ba8c73b7fc990 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Mon, 24 Nov 2025 16:26:57 +0100 Subject: [PATCH 2/8] feat: add show_collections param to "my data" API --- .../harvard/iq/dataverse/mydata/DataRetrieverAPI.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java index 1cd0e88e6b3..7c2d2eb1584 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java @@ -161,7 +161,8 @@ public String retrieveMyDataAsJsonString( @QueryParam("role_ids") List roleIds, @QueryParam("userIdentifier") String userIdentifier, @QueryParam("filter_validities") Boolean filterValidities, - @QueryParam("dataset_valid") List datasetValidities) { + @QueryParam("dataset_valid") List datasetValidities, + @QueryParam("show_collections") boolean showCollections) { boolean otherUser; String noMsgResultsFound = BundleUtil.getStringFromBundle("dataretrieverAPI.noMsgResultsFound"); @@ -241,7 +242,13 @@ public String retrieveMyDataAsJsonString( SearchFields.RELEASE_OR_CREATE_DATE, SortBy.DESCENDING, solrCardStart, //paginationStart, true, // dataRelatedToMe - SearchConstants.NUM_SOLR_DOCS_TO_RETRIEVE //10 // SearchFields.NUM_SOLR_DOCS_TO_RETRIEVE + SearchConstants.NUM_SOLR_DOCS_TO_RETRIEVE, //10 // SearchFields.NUM_SOLR_DOCS_TO_RETRIEVE + true, + null, + null, + true, + true, + showCollections ); if (this.solrQueryResponse.getNumResultsFound()==0){ From 493a119e33f13e46abfffb5b6e379dfa90647cd4 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Wed, 26 Nov 2025 15:38:21 +0100 Subject: [PATCH 3/8] feat: add sort params to "my data" API --- .../iq/dataverse/mydata/DataRetrieverAPI.java | 23 +++++++++++-------- .../iq/dataverse/search/SearchUtil.java | 10 ++++++++ .../harvard/iq/dataverse/search/SortBy.java | 5 ++++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java index 7c2d2eb1584..988c1e01d56 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java @@ -9,8 +9,7 @@ import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.engine.command.impl.GetUserPermittedCollectionsCommand; -import edu.harvard.iq.dataverse.search.SolrQueryResponse; -import edu.harvard.iq.dataverse.search.SolrSearchResult; +import edu.harvard.iq.dataverse.search.*; import edu.harvard.iq.dataverse.api.AbstractApiBean; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.DataverseRole; @@ -18,11 +17,6 @@ import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; -import edu.harvard.iq.dataverse.search.SearchConstants; -import edu.harvard.iq.dataverse.search.SearchException; -import edu.harvard.iq.dataverse.search.SearchFields; -import edu.harvard.iq.dataverse.search.SearchServiceFactory; -import edu.harvard.iq.dataverse.search.SortBy; import java.util.Arrays; import java.util.List; @@ -162,7 +156,9 @@ public String retrieveMyDataAsJsonString( @QueryParam("userIdentifier") String userIdentifier, @QueryParam("filter_validities") Boolean filterValidities, @QueryParam("dataset_valid") List datasetValidities, - @QueryParam("show_collections") boolean showCollections) { + @QueryParam("show_collections") boolean showCollections, + @QueryParam("sort") String sortField, + @QueryParam("order") String sortOrder) { boolean otherUser; String noMsgResultsFound = BundleUtil.getStringFromBundle("dataretrieverAPI.noMsgResultsFound"); @@ -232,14 +228,21 @@ public String retrieveMyDataAsJsonString( return this.getJSONErrorString(noMsgResultsFound, null); } + SortBy sortBy; + try { + sortBy = SearchUtil.getSortBy(sortField, sortOrder, SearchFields.RELEASE_OR_CREATE_DATE); + } catch (Exception ex) { + return this.getJSONErrorString(ex.getLocalizedMessage(), null); + } + try { solrQueryResponse = searchService.getDefaultSearchService().search( dataverseRequest, null, // subtree, default it to Dataverse for now filterParams.getSearchTerm(), //"*", // filterQueries,//filterQueries, - //SearchFields.NAME_SORT, SortBy.ASCENDING, - SearchFields.RELEASE_OR_CREATE_DATE, SortBy.DESCENDING, + sortBy.getField(), + sortBy.getOrder(), solrCardStart, //paginationStart, true, // dataRelatedToMe SearchConstants.NUM_SOLR_DOCS_TO_RETRIEVE, //10 // SearchFields.NUM_SOLR_DOCS_TO_RETRIEVE diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchUtil.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchUtil.java index adcc5825766..939a768cd2f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchUtil.java @@ -68,8 +68,18 @@ public static String getTimestampOrNull(Timestamp timestamp) { } public static SortBy getSortBy(String sortField, String sortOrder) throws Exception { + return getSortBy(sortField, sortOrder, SearchFields.RELEVANCE); + } + + public static SortBy getSortBy(String sortField, String sortOrder, String defaultSortField) throws Exception { + List allowedDefaultSortFieldValues = SortBy.allowedFieldStrings(); + if (!allowedDefaultSortFieldValues.contains(defaultSortField)) { + throw new Exception("The 'defaultSortField' was set to '" + defaultSortField + "' but expected one of " + allowedDefaultSortFieldValues + "."); + } if (StringUtils.isBlank(sortField)) { + sortField = defaultSortField; + } else if (sortField.equals("relevance")) { sortField = SearchFields.RELEVANCE; } else if (sortField.equals("name")) { // "name" sounds better than "name_sort" so we convert it here so users don't have to pass in "name_sort" diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SortBy.java b/src/main/java/edu/harvard/iq/dataverse/search/SortBy.java index 9d3f0b99abc..8fb6642e744 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SortBy.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SortBy.java @@ -14,6 +14,11 @@ public static List allowedOrderStrings() { } private final String field; + + public static List allowedFieldStrings() { + return Arrays.asList(SearchFields.RELEVANCE, SearchFields.NAME_SORT, SearchFields.RELEASE_OR_CREATE_DATE); + } + private final String order; public SortBy(String field, String order) { From 71a68a0aa02a9a4751043af813bda09d0ffc35da Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Thu, 27 Nov 2025 14:59:06 +0100 Subject: [PATCH 4/8] feat: add fq param to "my data" API --- .../edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java index 988c1e01d56..0a889025966 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java @@ -158,7 +158,8 @@ public String retrieveMyDataAsJsonString( @QueryParam("dataset_valid") List datasetValidities, @QueryParam("show_collections") boolean showCollections, @QueryParam("sort") String sortField, - @QueryParam("order") String sortOrder) { + @QueryParam("order") String sortOrder, + @QueryParam("fq") final List filterQueries) { boolean otherUser; String noMsgResultsFound = BundleUtil.getStringFromBundle("dataretrieverAPI.noMsgResultsFound"); @@ -222,11 +223,12 @@ public String retrieveMyDataAsJsonString( //msg("search with user: " + searchUser.getIdentifier()); - List filterQueries = this.myDataFinder.getSolrFilterQueries(); - if (filterQueries==null){ + List defaultFilterQueries = this.myDataFinder.getSolrFilterQueries(); + if (defaultFilterQueries==null){ logger.fine("No ids found for this search"); return this.getJSONErrorString(noMsgResultsFound, null); } + filterQueries.addAll(defaultFilterQueries); SortBy sortBy; try { From 92e624272e62228fc73c91e5d083d8624c1b9da1 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 28 Nov 2025 17:04:35 +0100 Subject: [PATCH 5/8] test: add test for metadata_fields param in "my data" API --- .../iq/dataverse/api/DataRetrieverApiIT.java | 44 +++++++++++++++++++ .../edu/harvard/iq/dataverse/api/UtilIT.java | 8 +++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index 72f8fa638e1..6998c2714d1 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -7,6 +7,8 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import io.restassured.path.json.JsonPath; +import org.hamcrest.CoreMatchers; +import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -407,6 +409,48 @@ public void testRetrieveMyDataAsJsonStringSortOrder() { assertEquals(OK.getStatusCode(), deleteSuperUserResponse.getStatusCode()); } + @Test + public void testRetrieveMyDataWithMetadataFields() { + + Response createUser = UtilIT.createRandomUser(); + createUser.prettyPrint(); + String apiToken = UtilIT.getApiTokenFromResponse(createUser); + + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + createDataverseResponse.prettyPrint(); + String dataverseAlias = UtilIT.getAliasFromResponse(createDataverseResponse); + + Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); + createDatasetResponse.prettyPrint(); + + Response myDataWithAuthor = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&metadata_fields=citation:author"); + myDataWithAuthor.prettyPrint(); + myDataWithAuthor.then().assertThat() + .body("data.items[0].metadataBlocks.citation.displayName", CoreMatchers.equalTo("Citation Metadata")) + .body("data.items[0].metadataBlocks.citation.fields[0].typeName", CoreMatchers.equalTo("author")) + .body("data.items[0].metadataBlocks.citation.fields[0].value[0].authorName.value", CoreMatchers.equalTo("Finch, Fiona")) + .body("data.items[0].metadataBlocks.citation.fields[0].value[0].authorAffiliation.value", CoreMatchers.equalTo("Birds Inc.")) + .statusCode(OK.getStatusCode()); + + Response subFieldsNotSupported = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&metadata_fields=citation:authorAffiliation"); + subFieldsNotSupported.prettyPrint(); + subFieldsNotSupported.then().assertThat() + .body("data.items[0].metadataBlocks.citation.displayName", CoreMatchers.equalTo("Citation Metadata")) + // No fields returned. authorAffiliation is a subfield of author and not supported. + .body("data.items[0].metadataBlocks.citation.fields", Matchers.empty()) + .statusCode(OK.getStatusCode()); + + Response myDataWithAllFieldsFromCitation = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&metadata_fields=citation:*"); + // Many more fields printed + myDataWithAllFieldsFromCitation.prettyPrint(); + myDataWithAllFieldsFromCitation.then().assertThat() + .body("data.items[0].metadataBlocks.citation.displayName", CoreMatchers.equalTo("Citation Metadata")) + // Many fields returned, all of the citation block that has been filled in. + .body("data.items[0].metadataBlocks.citation.fields", Matchers.hasSize(5)) + .statusCode(OK.getStatusCode()); + + } + private static String prettyPrintError(String resourceBundleKey, List params) { final String errorMessage; if (params == null || params.isEmpty()) { diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index 4dcea10cfe6..71b4a2eed50 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -4126,17 +4126,21 @@ static Response importDatasetViaNativeApi(String apiToken, String dataverseAlias } - static Response retrieveMyDataAsJsonString(String apiToken, String userIdentifier, ArrayList roleIds) { + static Response retrieveMyDataAsJsonString(String apiToken, String userIdentifier, ArrayList roleIds, String parameterString) { Response response = given() .header(API_TOKEN_HTTP_HEADER, apiToken) .contentType("application/json; charset=utf-8") .queryParam("role_ids", roleIds) .queryParam("dvobject_types", MyDataFilterParams.defaultDvObjectTypes) .queryParam("published_states", MyDataFilterParams.defaultPublishedStates) - .get("/api/mydata/retrieve?userIdentifier=" + userIdentifier); + .get("/api/mydata/retrieve?userIdentifier=" + userIdentifier + parameterString); return response; } + static Response retrieveMyDataAsJsonString(String apiToken, String userIdentifier, ArrayList roleIds) { + return retrieveMyDataAsJsonString(apiToken, userIdentifier, roleIds, ""); + } + static Response retrieveMyCollectionList(String apiToken, String userIdentifier) { RequestSpecification requestSpecification = given(); if (apiToken != null) { From 285886570d4911927cfc02de3945efd6d2b8f1b8 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 28 Nov 2025 17:12:00 +0100 Subject: [PATCH 6/8] test: add test for show_collections param in "my data" API --- .../iq/dataverse/api/DataRetrieverApiIT.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java index 6998c2714d1..a18843838ce 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataRetrieverApiIT.java @@ -451,6 +451,66 @@ public void testRetrieveMyDataWithMetadataFields() { } + @Test + public void testRetrieveMyDataWithCollections() { + Response createUser = UtilIT.createRandomUser(); + String apiToken = UtilIT.getApiTokenFromResponse(createUser); + + Response createDataverseResponse = UtilIT.createRandomDataverse(apiToken); + createDataverseResponse.prettyPrint(); + createDataverseResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + JsonPath createdDataverse = JsonPath.from(createDataverseResponse.body().asString()); + String dataverseName = createdDataverse.getString("data.name"); + String dataverseAlias = createdDataverse.getString("data.alias"); + Integer dataverseId = createdDataverse.getInt("data.id"); + + UtilIT.publishDataverseViaNativeApi(dataverseAlias, apiToken).then().assertThat().statusCode(OK.getStatusCode()); + + Response createDatasetResponse = UtilIT.createRandomDatasetViaNativeApi(dataverseAlias, apiToken); + createDatasetResponse.then().assertThat().statusCode(CREATED.getStatusCode()); + JsonPath createdDataset = JsonPath.from(createDatasetResponse.body().asString()); + int datasetId = createdDataset.getInt("data.id"); + String datasetPid = createdDataset.getString("data.persistentId"); + + UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken).then().assertThat().statusCode(OK.getStatusCode()); + + // Test that the Dataverse collection that the dataset was created in is returned + Response myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true"); + myDataResponse.prettyPrint(); + myDataResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.items[0].collections.size()", CoreMatchers.is(1)) + .body("data.items[0].collections[0].id", CoreMatchers.is(dataverseId)) + .body("data.items[0].collections[0].name", CoreMatchers.is(dataverseName)) + .body("data.items[0].collections[0].alias", CoreMatchers.is(dataverseAlias)); + + Response createDataverse2Response = UtilIT.createRandomDataverse(apiToken); + createDataverse2Response.prettyPrint(); + createDataverse2Response.then().assertThat().statusCode(CREATED.getStatusCode()); + JsonPath createDataverse2 = JsonPath.from(createDataverse2Response.body().asString()); + String dataverse2Name = createDataverse2.getString("data.name"); + String dataverse2Alias = createDataverse2.getString("data.alias"); + Integer dataverse2Id = createDataverse2.getInt("data.id"); + + UtilIT.publishDataverseViaNativeApi(dataverse2Alias, apiToken).then().assertThat().statusCode(OK.getStatusCode()); + + UtilIT.linkDataset(datasetPid, dataverse2Alias, apiToken).then().assertThat().statusCode(OK.getStatusCode()); + + UtilIT.sleepForReindex(String.valueOf(datasetId), apiToken, 5); + + // Test that the Dataverse collection that the dataset was linked to is also returned + myDataResponse = UtilIT.retrieveMyDataAsJsonString(apiToken, "", new ArrayList<>(Arrays.asList(6L)), "&show_collections=true"); + myDataResponse.prettyPrint(); + myDataResponse.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.items[0].collections.size()", CoreMatchers.is(2)) + .body("data.items[0].collections", CoreMatchers.hasItems( + Map.of("id", dataverseId, "name", dataverseName, "alias", dataverseAlias), + Map.of("id", dataverse2Id, "name", dataverse2Name, "alias", dataverse2Alias) + )); + + } + private static String prettyPrintError(String resourceBundleKey, List params) { final String errorMessage; if (params == null || params.isEmpty()) { From fda18402f5c134d60b953103da43ffc198718079 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 28 Nov 2025 17:21:48 +0100 Subject: [PATCH 7/8] docs: update docs for "my data" API and search API --- doc/sphinx-guides/source/api/native-api.rst | 10 ++++++++++ doc/sphinx-guides/source/api/search.rst | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 3abcb526abd..06ff32e7f8d 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -8579,6 +8579,16 @@ Parameters: ``per_page`` Number of results returned per page. +``metadata_fields`` Includes the requested fields for each dataset in the response. Multiple "metadata_fields" parameters can be used to include several fields. See :doc:`search` for further information on this parameter. + +``show_collections`` Whether or not to include a list of parent and linked collections for each dataset search result. + +``sort`` The sort field. Supported values include "name", "date" and "relevance". + +``order`` The order in which to sort. Can either be "asc" or "desc". + +``fq`` A filter query to filter the list returned. Multiple "fq" parameters can be used. + MyData Collection List ~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/sphinx-guides/source/api/search.rst b/doc/sphinx-guides/source/api/search.rst index 05daf54d43f..a75766efc18 100755 --- a/doc/sphinx-guides/source/api/search.rst +++ b/doc/sphinx-guides/source/api/search.rst @@ -27,7 +27,7 @@ Name Type Description q string The search term or terms. Using "title:data" will search only the "title" field. "*" can be used as a wildcard either alone or adjacent to a term (i.e. "bird*"). For example, https://demo.dataverse.org/api/search?q=title:data . For a list of fields to search, please see https://github.com/IQSS/dataverse/issues/2558 (for now). type string Can be either "dataverse", "dataset", or "file". Multiple "type" parameters can be used to include multiple types (i.e. ``type=dataset&type=file``). If omitted, all types will be returned. For example, https://demo.dataverse.org/api/search?q=*&type=dataset subtree string The identifier of the Dataverse collection to which the search should be narrowed. The subtree of this Dataverse collection and all its children will be searched. Multiple "subtree" parameters can be used to include multiple Dataverse collections. For example, https://demo.dataverse.org/api/search?q=data&subtree=birds&subtree=cats . -sort string The sort field. Supported values include "name" and "date". See example under "order". +sort string The sort field. Supported values include "name", "date" and "relevance". See example under "order". order string The order in which to sort. Can either be "asc" or "desc". For example, https://demo.dataverse.org/api/search?q=data&sort=name&order=asc per_page int The number of results to return per request. The default is 10. The max is 1000. See :ref:`iteration example `. start int A cursor for paging through search results. See :ref:`iteration example `. From 947638b0891eb17d605a316819cd0189ba20f89b Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 28 Nov 2025 17:27:50 +0100 Subject: [PATCH 8/8] docs: add release note for #12009 --- doc/release-notes/12009-my-data-api-params.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/12009-my-data-api-params.md diff --git a/doc/release-notes/12009-my-data-api-params.md b/doc/release-notes/12009-my-data-api-params.md new file mode 100644 index 00000000000..abff4d5033a --- /dev/null +++ b/doc/release-notes/12009-my-data-api-params.md @@ -0,0 +1 @@ +The My Data API now supports the `metadata_fields`, `sort` and `order`, `show_collections` and `fq` parameters, which enhances its functionality and brings it in line with the search API. \ No newline at end of file