Skip to content

Commit 5ea61e1

Browse files
authored
[esutil.Client] fix routing support for MultiSearch to specify routing for each individual search (#95)
1 parent 96c0c8a commit 5ea61e1

File tree

3 files changed

+56
-14
lines changed

3 files changed

+56
-14
lines changed

go/v1beta1/storage/esutil/client.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ type BulkRequestItem struct {
6363

6464
type MultiSearchRequest struct {
6565
Index string
66-
Routing string
6766
Searches []*EsSearch
6867
}
6968

@@ -297,6 +296,10 @@ func (c *client) Search(ctx context.Context, request *SearchRequest) (*SearchRes
297296
c.esClient.Search.WithContext(ctx),
298297
}
299298

299+
if body.Routing != "" {
300+
searchOptions = append(searchOptions, c.esClient.Search.WithRouting(body.Routing))
301+
}
302+
300303
var (
301304
searchFrom int
302305
pitId string
@@ -388,19 +391,30 @@ func (c *client) Search(ctx context.Context, request *SearchRequest) (*SearchRes
388391
func (c *client) MultiSearch(ctx context.Context, request *MultiSearchRequest) (*EsMultiSearchResponse, error) {
389392
log := c.logger.Named("MultiSearch")
390393

391-
searchMetadata, _ := json.Marshal(&EsMultiSearchQueryFragment{
392-
Index: request.Index,
393-
Routing: request.Routing,
394+
searchMetadataWithoutRouting, _ := json.Marshal(&EsMultiSearchQueryFragment{
395+
Index: request.Index,
394396
})
395-
searchMetadata = append(searchMetadata, '\n')
397+
searchMetadataWithoutRouting = append(searchMetadataWithoutRouting, '\n')
396398

397399
var searchRequestBody bytes.Buffer
398400
for _, search := range request.Searches {
399401
data, _ := json.Marshal(search)
400402
dataBytes := append(data, '\n')
401403

402-
searchRequestBody.Grow(len(searchMetadata) + len(dataBytes))
403-
searchRequestBody.Write(searchMetadata)
404+
if search.Routing != "" {
405+
searchMetadataWithRouting, _ := json.Marshal(&EsMultiSearchQueryFragment{
406+
Index: request.Index,
407+
Routing: search.Routing,
408+
})
409+
searchMetadataWithRouting = append(searchMetadataWithRouting, '\n')
410+
411+
searchRequestBody.Grow(len(searchMetadataWithRouting) + len(dataBytes))
412+
searchRequestBody.Write(searchMetadataWithRouting)
413+
} else {
414+
searchRequestBody.Grow(len(searchMetadataWithoutRouting) + len(dataBytes))
415+
searchRequestBody.Write(searchMetadataWithoutRouting)
416+
}
417+
404418
searchRequestBody.Write(dataBytes)
405419
}
406420

go/v1beta1/storage/esutil/client_test.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,19 @@ var _ = Describe("elasticsearch client", func() {
566566

567567
Expect(searchRequest).To(BeEquivalentTo(expectedSearch))
568568
})
569+
570+
When("routing is specified", func() {
571+
var expectedRouting string
572+
573+
BeforeEach(func() {
574+
expectedRouting = fake.LetterN(10)
575+
expectedSearchRequest.Search.Routing = expectedRouting
576+
})
577+
578+
It("should specify the routing value during the search", func() {
579+
Expect(transport.ReceivedHttpRequests[0].URL.Query().Get("routing")).To(Equal(expectedRouting))
580+
})
581+
})
569582
})
570583

571584
When("the search operation fails", func() {
@@ -802,15 +815,20 @@ var _ = Describe("elasticsearch client", func() {
802815
})
803816
})
804817

805-
When("routing is specified", func() {
806-
var expectedRouting string
818+
When("routing is specified for a search", func() {
819+
var (
820+
expectedRouting string
821+
randomSearchIndex int
822+
)
807823

808824
BeforeEach(func() {
809825
expectedRouting = fake.LetterN(10)
810-
expectedMultiSearchRequest.Routing = expectedRouting
826+
randomSearchIndex = fake.Number(0, len(expectedSearches)-1)
827+
828+
expectedMultiSearchRequest.Searches[randomSearchIndex].Routing = expectedRouting
811829
})
812830

813-
It("should include the routing value in each search header", func() {
831+
It("should include the routing value in the specified search header", func() {
814832
var expectedPayloads []interface{}
815833

816834
for i := 0; i < len(expectedSearches); i++ {
@@ -820,13 +838,22 @@ var _ = Describe("elasticsearch client", func() {
820838
parseNDJSONRequestBody(transport.ReceivedHttpRequests[0].Body, expectedPayloads)
821839

822840
for i, payload := range expectedPayloads {
823-
if i%2 == 0 { // search metadata
841+
modulus := i % 2
842+
index := (i - modulus) / 2
843+
844+
if modulus == 0 { // search metadata
824845
metadata := payload.(*EsMultiSearchQueryFragment)
825846
Expect(metadata.Index).To(Equal(expectedIndex))
826-
Expect(metadata.Routing).To(Equal(expectedRouting))
847+
848+
if index == randomSearchIndex {
849+
Expect(metadata.Routing).To(Equal(expectedRouting))
850+
} else {
851+
Expect(metadata.Routing).To(BeEmpty())
852+
}
827853
} else { // search
828854
search := payload.(*EsSearch)
829-
expectedSearch := expectedSearches[(i-1)/2]
855+
expectedSearch := expectedSearches[index]
856+
expectedSearch.Routing = ""
830857

831858
Expect(search).To(Equal(expectedSearch))
832859
}

go/v1beta1/storage/esutil/types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ type EsSearch struct {
5454
Sort map[string]EsSortOrder `json:"sort,omitempty"`
5555
Collapse *EsSearchCollapse `json:"collapse,omitempty"`
5656
Pit *EsSearchPit `json:"pit,omitempty"`
57+
Routing string `json:"-"`
5758
}
5859

5960
type EsSortOrder string

0 commit comments

Comments
 (0)