From 49da927f253cc6eb2861350c15571cfccd1d50ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Thu, 12 May 2022 09:47:30 +0200 Subject: [PATCH] Fix search for files with spaces --- .../search/pkg/search/index/index_test.go | 72 +++++++++++++------ .../pkg/search/provider/searchprovider.go | 2 +- .../search/provider/searchprovider_test.go | 18 +++++ 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/extensions/search/pkg/search/index/index_test.go b/extensions/search/pkg/search/index/index_test.go index 34f50257d..1549c2488 100644 --- a/extensions/search/pkg/search/index/index_test.go +++ b/extensions/search/pkg/search/index/index_test.go @@ -24,25 +24,9 @@ var _ = Describe("Index", func() { StorageId: "storageid", OpaqueId: "rootopaqueid", } - ref = &sprovider.Reference{ - ResourceId: rootId, - Path: "./Foo.pdf", - } - ri = &sprovider.ResourceInfo{ - Id: &sprovider.ResourceId{ - StorageId: "storageid", - OpaqueId: "opaqueid", - }, - ParentId: &sprovider.ResourceId{ - StorageId: "storageid", - OpaqueId: "someopaqueid", - }, - Path: "Foo.pdf", - Size: 12345, - Type: sprovider.ResourceType_RESOURCE_TYPE_FILE, - MimeType: "application/pdf", - Mtime: &typesv1beta1.Timestamp{Seconds: 4000}, - } + filename string + ref *sprovider.Reference + ri *sprovider.ResourceInfo parentRef = &sprovider.Reference{ ResourceId: rootId, Path: "./my/sudbir", @@ -92,6 +76,8 @@ var _ = Describe("Index", func() { ) BeforeEach(func() { + filename = "Foo.pdf" + mapping, err := index.BuildMapping() Expect(err).ToNot(HaveOccurred()) @@ -102,6 +88,28 @@ var _ = Describe("Index", func() { Expect(err).ToNot(HaveOccurred()) }) + JustBeforeEach(func() { + ref = &sprovider.Reference{ + ResourceId: rootId, + Path: "./" + filename, + } + ri = &sprovider.ResourceInfo{ + Id: &sprovider.ResourceId{ + StorageId: "storageid", + OpaqueId: "opaqueid", + }, + ParentId: &sprovider.ResourceId{ + StorageId: "storageid", + OpaqueId: "someopaqueid", + }, + Path: filename, + Size: 12345, + Type: sprovider.ResourceType_RESOURCE_TYPE_FILE, + MimeType: "application/pdf", + Mtime: &typesv1beta1.Timestamp{Seconds: 4000}, + } + }) + Describe("New", func() { It("returns a new index instance", func() { i, err := index.New(bleveIndex) @@ -119,8 +127,32 @@ var _ = Describe("Index", func() { }) Describe("Search", func() { - Context("with a file in the root of the space", func() { + Context("with a filename with spaces", func() { BeforeEach(func() { + filename = "Foo oo.pdf" + }) + It("finds the file", func() { + err := i.Add(ref, ri) + Expect(err).ToNot(HaveOccurred()) + + res, err := i.Search(ctx, &searchsvc.SearchIndexRequest{ + Ref: &searchmsg.Reference{ + ResourceId: &searchmsg.ResourceID{ + StorageId: ref.ResourceId.StorageId, + OpaqueId: ref.ResourceId.OpaqueId, + }, + }, + Query: `Name:foo\ o*`, + }) + Expect(err).ToNot(HaveOccurred()) + Expect(res).ToNot(BeNil()) + Expect(len(res.Matches)).To(Equal(1)) + }) + + }) + + Context("with a file in the root of the space", func() { + JustBeforeEach(func() { err := i.Add(ref, ri) Expect(err).ToNot(HaveOccurred()) }) diff --git a/extensions/search/pkg/search/provider/searchprovider.go b/extensions/search/pkg/search/provider/searchprovider.go index a9014aa87..2c6fc4607 100644 --- a/extensions/search/pkg/search/provider/searchprovider.go +++ b/extensions/search/pkg/search/provider/searchprovider.go @@ -125,7 +125,7 @@ func (p *Provider) Search(ctx context.Context, req *searchsvc.SearchRequest) (*s _, rootStorageID := storagespace.SplitStorageID(space.Root.StorageId) res, err := p.indexClient.Search(ctx, &searchsvc.SearchIndexRequest{ - Query: "Name:" + strings.ToLower(req.Query), + Query: "Name:" + strings.ReplaceAll(strings.ToLower(req.Query), " ", `\ `), Ref: &searchmsg.Reference{ ResourceId: &searchmsg.ResourceID{ StorageId: space.Root.StorageId, diff --git a/extensions/search/pkg/search/provider/searchprovider_test.go b/extensions/search/pkg/search/provider/searchprovider_test.go index 562a4ee06..2f6e2a2ab 100644 --- a/extensions/search/pkg/search/provider/searchprovider_test.go +++ b/extensions/search/pkg/search/provider/searchprovider_test.go @@ -146,6 +146,24 @@ var _ = Describe("Searchprovider", func() { }, nil) }) + It("lowercases the filename", func() { + p.Search(ctx, &searchsvc.SearchRequest{ + Query: "Foo.pdf", + }) + indexClient.AssertCalled(GinkgoT(), "Search", mock.Anything, mock.MatchedBy(func(req *searchsvc.SearchIndexRequest) bool { + return req.Query == "Name:foo.pdf" + })) + }) + + It("escapes special characters", func() { + p.Search(ctx, &searchsvc.SearchRequest{ + Query: "Foo oo.pdf", + }) + indexClient.AssertCalled(GinkgoT(), "Search", mock.Anything, mock.MatchedBy(func(req *searchsvc.SearchIndexRequest) bool { + return req.Query == `Name:foo\ oo.pdf` + })) + }) + It("searches the personal user space", func() { res, err := p.Search(ctx, &searchsvc.SearchRequest{ Query: "foo",