From: Daniel Kutyła Date: Thu, 15 Sep 2022 18:20:52 +0000 (+0200) Subject: 19051: Added quote handling in the search X-Git-Tag: 2.5.0~37^2~2 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/54805dd83a984d4e34bb35146d2505bac12bc1d0 19051: Added quote handling in the search Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła --- diff --git a/cypress/integration/search.spec.js b/cypress/integration/search.spec.js index 5434ca24..cbb091fd 100644 --- a/cypress/integration/search.spec.js +++ b/cypress/integration/search.spec.js @@ -105,6 +105,39 @@ describe('Search tests', function() { }); }); + it.only('can search items using quotes', function() { + const random = Math.floor(Math.random() * Math.floor(999999)); + const colName = `Collection ${random}`; + const colName2 = `Collection test ${random}`; + + // Creates the collection using the admin token so we can set up + // a bogus manifest text without block signatures. + cy.createCollection(adminUser.token, { + name: colName, + owner_uuid: activeUser.user.uuid, + preserve_version: true, + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }).as('collection1'); + + cy.createCollection(adminUser.token, { + name: colName2, + owner_uuid: activeUser.user.uuid, + preserve_version: true, + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }).as('collection2'); + + cy.getAll('@collection1', '@collection2') + .then(function() { + cy.loginAs(activeUser); + + cy.doSearch(colName); + cy.get('[data-cy=search-results] table tbody tr').should('have.length', 2); + + cy.doSearch(`"${colName}"`); + cy.get('[data-cy=search-results] table tbody tr').should('have.length', 1); + }); + }); + it('can display owner of the item', function() { const colName = `Collection ${Math.floor(Math.random() * Math.floor(999999))}`; diff --git a/src/services/api/filter-builder.ts b/src/services/api/filter-builder.ts index 4809e7a8..da67935a 100644 --- a/src/services/api/filter-builder.ts +++ b/src/services/api/filter-builder.ts @@ -65,7 +65,18 @@ export class FilterBuilder { } public addFullTextSearch(value: string) { - const terms = value.trim().split(/(\s+)/); + const regex = /"[^"]*"/; + const matches: any[] = []; + + let match = value.match(regex); + + while (match) { + value = value.replace(match[0], ""); + matches.push(match[0].replace(/"/g, '')); + match = value.match(regex); + } + + const terms = value.trim().split(/(\s+)/).concat(matches); terms.forEach(term => { if (term !== " ") { this.addCondition("any", "ilike", term, "%", "%");