From be42d9005724df69457f7002910932445ae3f108 Mon Sep 17 00:00:00 2001 From: Chiara Bigarella Date: Wed, 25 Sep 2019 08:41:05 +0200 Subject: [PATCH 1/3] indexer: add Created and Updated fields --- asclepias_broker/search/indexer.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/asclepias_broker/search/indexer.py b/asclepias_broker/search/indexer.py index 82e0f02..a4d49a7 100644 --- a/asclepias_broker/search/indexer.py +++ b/asclepias_broker/search/indexer.py @@ -66,10 +66,14 @@ def build_group_metadata(group: Group) -> dict: ids = id_group.identifiers doc = deepcopy((id_group.data and id_group.data.json) or {}) all_ids = sum([g.identifiers for g in group.groups], []) + doc['Created'] = id_group.data.created + doc['Updated'] = id_group.data.updated else: doc = deepcopy((group.data and group.data.json) or {}) ids = group.identifiers all_ids = ids + doc['Created'] = group.data.created + doc['Updated'] = group.data.updated doc['Identifier'] = [build_id_info(i) for i in ids] doc['SearchIdentifier'] = [build_id_info(i) for i in all_ids] @@ -140,6 +144,20 @@ def build_doc( rel_meta = build_relationship_metadata(rel) grouping = grouping or \ ('identity' if rel.type == GroupType.Identity else 'version') + + updated = None + if src_meta["Updated"] > trg_meta["Updated"]: + updated = src_meta["Updated"] + else: + updated = trg_meta["Updated"] + + created = None + for relationship in rel.relationships: + if not created: + created = relationship.data.created + elif created > relationship.data.created: + created = relationship.data.created + return { '_id': str(doc_uuid), '_source': { @@ -149,6 +167,8 @@ def build_doc( "History": rel_meta, "Source": src_meta, "Target": trg_meta, + "Created": created, + "Updated": updated }, } From 97c8f3cb2d7dff2c90fdcf41269b3b03b0ea4b2a Mon Sep 17 00:00:00 2001 From: Chiara Bigarella Date: Wed, 25 Sep 2019 14:44:28 +0200 Subject: [PATCH 2/3] mappings: add Created and Updated dates --- .../mappings/v6/relationships/v1.0.0.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/asclepias_broker/mappings/v6/relationships/v1.0.0.json b/asclepias_broker/mappings/v6/relationships/v1.0.0.json index 4eef38e..4418f75 100644 --- a/asclepias_broker/mappings/v6/relationships/v1.0.0.json +++ b/asclepias_broker/mappings/v6/relationships/v1.0.0.json @@ -148,6 +148,12 @@ }, "PublicationDate": { "type": "date" + }, + "Created": { + "type": "date" + }, + "Updated": { + "type": "date" } } }, @@ -247,8 +253,20 @@ }, "PublicationDate": { "type": "date" + }, + "Created": { + "type": "date" + }, + "Updated": { + "type": "date" } } + }, + "Created": { + "type": "date" + }, + "Updated": { + "type": "date" } }, "dynamic": false From 56766e5f89af5d8a2071aa2cb5cd94b418ee2941 Mon Sep 17 00:00:00 2001 From: Chiara Bigarella Date: Wed, 25 Sep 2019 17:09:45 +0200 Subject: [PATCH 3/3] search: all parameters are optional --- asclepias_broker/search/query.py | 6 ----- tests/api/test_relationships.py | 38 ++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/asclepias_broker/search/query.py b/asclepias_broker/search/query.py index db87841..9fec39f 100644 --- a/asclepias_broker/search/query.py +++ b/asclepias_broker/search/query.py @@ -26,12 +26,6 @@ def search_factory(self, search, query_parser=None): from invenio_records_rest.sorter import default_sorter_factory search_index = search._index[0] - # TODO: make "scheme" optional? - for field in ('id', 'scheme', 'relation'): - if field not in request.values: - raise RESTValidationError( - errors=[FieldError(field, 'Required field.')]) - search, urlkwargs = default_facets_factory(search, search_index) search, sortkwargs = default_sorter_factory(search, search_index) for key, value in sortkwargs.items(): diff --git a/tests/api/test_relationships.py b/tests/api/test_relationships.py index c20adf7..2ca0c63 100644 --- a/tests/api/test_relationships.py +++ b/tests/api/test_relationships.py @@ -13,28 +13,38 @@ from asclepias_broker.events.api import EventAPI -def test_invalid_search_parameters(client): +def test_optional_search_parameters(client, db, es_clear): search_url = url_for('invenio_records_rest.relid_list') + _process_events([ + ['A', 'Cites', 'X'], + ['A', 'Cites', 'B'] + ]) + params = {} resp = client.get(search_url) - assert resp.status_code == 400 - assert resp.json['message'] == 'Validation error.' - assert resp.json['errors'][0]['field'] == 'id' + assert resp.status_code == 200 + assert resp.json['hits']['total'] == 2 - params['id'] = 'some-id' + params['scheme'] = 'doi' resp = client.get(search_url, query_string=params) - assert resp.status_code == 400 - assert resp.json['message'] == 'Validation error.' - assert len(resp.json['errors']) == 1 - assert resp.json['errors'][0]['field'] == 'scheme' + assert resp.status_code == 200 + assert resp.json['hits']['total'] == 2 - params['scheme'] = 'doi' + params['id'] = 'X' resp = client.get(search_url, query_string=params) - assert resp.status_code == 400 - assert resp.json['message'] == 'Validation error.' - assert len(resp.json['errors']) == 1 - assert resp.json['errors'][0]['field'] == 'relation' + assert resp.status_code == 200 + assert resp.json['hits']['total'] == 1 + + +def test_invalid_search_parameters(client): + search_url = url_for('invenio_records_rest.relid_list') + + params = {} + params['id'] = 'some-id' + resp = client.get(search_url, query_string=params) + assert resp.status_code == 200 + assert resp.json['hits']['total'] == 0 params['relation'] = 'not-a-valid-value' resp = client.get(search_url, query_string=params)