diff --git a/lib/api-request.js b/lib/api-request.js index 7795dc4d..73779f1c 100644 --- a/lib/api-request.js +++ b/lib/api-request.js @@ -73,6 +73,10 @@ class ApiRequest { return this.params.subject_prefix } + hasContributorRole () { + return this.params.role && this.params.filters.contributorLiteral + } + static fromParams (params) { return new ApiRequest(params) } diff --git a/lib/elasticsearch/elastic-query-builder.js b/lib/elasticsearch/elastic-query-builder.js index d561795a..bf377261 100644 --- a/lib/elasticsearch/elastic-query-builder.js +++ b/lib/elasticsearch/elastic-query-builder.js @@ -87,6 +87,10 @@ class ElasticQueryBuilder { if (this.request.hasSubjectPrefix()) { this.applySubjectPrefix() } + + if (this.request.hasContributorRole()) { + this.applyContributorRole() + } } /** @@ -170,6 +174,13 @@ class ElasticQueryBuilder { ]) } + /** + * Concat contributor + role if role param is provided + */ + applyContributorRole () { + this.query.addMust(termMatch('contributorRoleLiteral', this.request.params.filters.contributorLiteral + '||' + this.request.params.role)) + } + /** * Build ES query for standard_number searches */ diff --git a/lib/resources.js b/lib/resources.js index 959f019c..9aa083e2 100644 --- a/lib/resources.js +++ b/lib/resources.js @@ -85,6 +85,7 @@ const parseSearchParams = function (params, overrideParams = {}) { issn: { type: 'string' }, lccn: { type: 'string' }, oclc: { type: 'string' }, + role: { type: 'string' }, merge_checkin_card_items: { type: 'boolean', default: true }, include_item_aggregations: { type: 'boolean', default: true }, ...overrideParams diff --git a/test/elastic-query-builder.test.js b/test/elastic-query-builder.test.js index 02ae58ed..1ab25a5c 100644 --- a/test/elastic-query-builder.test.js +++ b/test/elastic-query-builder.test.js @@ -252,6 +252,14 @@ describe('ElasticQueryBuilder', () => { expect(inst.query.toJson()).to.nested .include({ 'bool.filter[0].term.genreForm\\.raw': 'Maps' }) }) + + it('supports contributor + role', () => { + const request = new ApiRequest({ q: '', role: 'performer.', filters: { contributorLiteral: 'Patinkin, Mandy' } }) + const inst = ElasticQueryBuilder.forApiRequest(request) + + expect(inst.query.toJson()).to.nested + .include({ 'bool.must[0].term.contributorRoleLiteral.value': 'Patinkin, Mandy||performer.' }) + }) }) describe('Advanced Search query params', () => {