From 0a12ba34f052d436f7ced56f297ee17a166d4a1a Mon Sep 17 00:00:00 2001 From: Chris Price Date: Mon, 13 Mar 2023 14:52:12 -0700 Subject: [PATCH] feat: Split sortedSetFetch up into ByRank and ByScore functions (#280) * feat: Split sortedSetFetch up into ByRank and ByScore functions As per the API design discussion and the pattern we established in the node.js SDK, this commit splits the SortedSetFetch into two functions, one for fetching by score and one for by rank. This prevents the user from needing to reason about which combinations of arguments are and are not legal together. --- momento/cache_client.go | 17 ++- momento/sorted_set_fetch.go | 167 ------------------------- momento/sorted_set_fetch_by_rank.go | 100 +++++++++++++++ momento/sorted_set_fetch_by_score.go | 116 +++++++++++++++++ momento/sorted_set_test.go | 179 ++++++++++++++++++--------- momento/value.go | 7 ++ 6 files changed, 355 insertions(+), 231 deletions(-) delete mode 100644 momento/sorted_set_fetch.go create mode 100644 momento/sorted_set_fetch_by_rank.go create mode 100644 momento/sorted_set_fetch_by_score.go diff --git a/momento/cache_client.go b/momento/cache_client.go index 0162f41f..dcfce184 100644 --- a/momento/cache_client.go +++ b/momento/cache_client.go @@ -34,9 +34,11 @@ type CacheClient interface { // KeysExist checks if provided keys exist in the cache. KeysExist(ctx context.Context, r *KeysExistRequest) (responses.KeysExistResponse, error) - // SortedSetFetch fetches the elements in the given sorted set by index rank or by score. - SortedSetFetch(ctx context.Context, r *SortedSetFetchRequest) (responses.SortedSetFetchResponse, error) - // SortedSetElement adds an element to the given sorted set. If the element already exists, + // SortedSetFetchByRank fetches the elements in the given sorted set by rank. + SortedSetFetchByRank(ctx context.Context, r *SortedSetFetchByRankRequest) (responses.SortedSetFetchResponse, error) + // SortedSetFetchByScore fetches the elements in the given sorted set by score. + SortedSetFetchByScore(ctx context.Context, r *SortedSetFetchByScoreRequest) (responses.SortedSetFetchResponse, error) + // SortedSetPutElement adds an element to the given sorted set. If the element already exists, // its score is updated. Creates the sorted set if it does not exist. SortedSetPutElement(ctx context.Context, r *SortedSetPutElementRequest) (responses.SortedSetPutElementResponse, error) // SortedSetPutElements adds elements to the given sorted set. If an element already exists, @@ -271,7 +273,14 @@ func (c defaultScsClient) KeysExist(ctx context.Context, r *KeysExistRequest) (r return r.response, nil } -func (c defaultScsClient) SortedSetFetch(ctx context.Context, r *SortedSetFetchRequest) (responses.SortedSetFetchResponse, error) { +func (c defaultScsClient) SortedSetFetchByRank(ctx context.Context, r *SortedSetFetchByRankRequest) (responses.SortedSetFetchResponse, error) { + if err := c.dataClient.makeRequest(ctx, r); err != nil { + return nil, err + } + return r.response, nil +} + +func (c defaultScsClient) SortedSetFetchByScore(ctx context.Context, r *SortedSetFetchByScoreRequest) (responses.SortedSetFetchResponse, error) { if err := c.dataClient.makeRequest(ctx, r); err != nil { return nil, err } diff --git a/momento/sorted_set_fetch.go b/momento/sorted_set_fetch.go deleted file mode 100644 index 8abda2bd..00000000 --- a/momento/sorted_set_fetch.go +++ /dev/null @@ -1,167 +0,0 @@ -package momento - -import ( - "context" - - "github.com/momentohq/client-sdk-go/responses" - - pb "github.com/momentohq/client-sdk-go/internal/protos" -) - -type SortedSetOrder int - -const ( - ASCENDING SortedSetOrder = 0 - DESCENDING SortedSetOrder = 1 -) - -type SortedSetFetchByRank struct { - StartRank *int32 - EndRank *int32 -} - -type SortedSetFetchByScore struct { - MinScore *float64 - MaxScore *float64 - Offset *uint32 - Count *uint32 -} - -type SortedSetFetchRequest struct { - CacheName string - SetName string - Order SortedSetOrder - ByRank *SortedSetFetchByRank - ByScore *SortedSetFetchByScore - - grpcRequest *pb.XSortedSetFetchRequest - grpcResponse *pb.XSortedSetFetchResponse - response responses.SortedSetFetchResponse -} - -func (r *SortedSetFetchRequest) cacheName() string { return r.CacheName } - -func (r *SortedSetFetchRequest) requestName() string { return "Sorted set fetch" } - -func (r *SortedSetFetchRequest) initGrpcRequest(scsDataClient) error { - var err error - - if _, err = prepareName(r.SetName, "Set name"); err != nil { - return err - } - - if r.ByRank != nil && r.ByScore != nil { - return NewMomentoError( - InvalidArgumentError, - "Only one of ByRank or ByScore may be specified", - nil, - ) - } - - grpcReq := &pb.XSortedSetFetchRequest{ - SetName: []byte(r.SetName), - Order: pb.XSortedSetFetchRequest_Order(r.Order), - WithScores: true, - } - - if r.ByScore != nil { - by_score := pb.XSortedSetFetchRequest_ByScore{ - ByScore: &pb.XSortedSetFetchRequest_XByScore{ - Min: &pb.XSortedSetFetchRequest_XByScore_UnboundedMin{}, - Max: &pb.XSortedSetFetchRequest_XByScore_UnboundedMax{}, - Offset: 0, - Count: -1, - }, - } - - if r.ByScore.MinScore != nil { - by_score.ByScore.Min = &pb.XSortedSetFetchRequest_XByScore_MinScore{ - MinScore: &pb.XSortedSetFetchRequest_XByScore_XScore{ - Score: float64(*r.ByScore.MinScore), - Exclusive: false, - }, - } - } - - if r.ByScore.MaxScore != nil { - by_score.ByScore.Max = &pb.XSortedSetFetchRequest_XByScore_MaxScore{ - MaxScore: &pb.XSortedSetFetchRequest_XByScore_XScore{ - Score: float64(*r.ByScore.MaxScore), - Exclusive: false, - }, - } - } - - if r.ByScore.Offset != nil { - by_score.ByScore.Offset = *r.ByScore.Offset - } - - if r.ByScore.Count != nil { - by_score.ByScore.Count = int32(*r.ByScore.Count) - } - - grpcReq.Range = &by_score - } else { - // This is the default: fetch everything in ascending order. - by_index := pb.XSortedSetFetchRequest_ByIndex{ - ByIndex: &pb.XSortedSetFetchRequest_XByIndex{ - Start: &pb.XSortedSetFetchRequest_XByIndex_UnboundedStart{}, - End: &pb.XSortedSetFetchRequest_XByIndex_UnboundedEnd{}, - }, - } - - if r.ByRank != nil { - if r.ByRank.StartRank != nil { - by_index.ByIndex.Start = &pb.XSortedSetFetchRequest_XByIndex_InclusiveStartIndex{ - InclusiveStartIndex: *r.ByRank.StartRank, - } - } - - if r.ByRank.EndRank != nil { - by_index.ByIndex.End = &pb.XSortedSetFetchRequest_XByIndex_ExclusiveEndIndex{ - ExclusiveEndIndex: *r.ByRank.EndRank, - } - } - } - - grpcReq.Range = &by_index - } - - r.grpcRequest = grpcReq - - return nil -} - -func (r *SortedSetFetchRequest) makeGrpcRequest(metadata context.Context, client scsDataClient) (grpcResponse, error) { - resp, err := client.grpcClient.SortedSetFetch(metadata, r.grpcRequest) - if err != nil { - return nil, err - } - - r.grpcResponse = resp - - return resp, nil -} - -func (r *SortedSetFetchRequest) interpretGrpcResponse() error { - switch grpcResp := r.grpcResponse.SortedSet.(type) { - case *pb.XSortedSetFetchResponse_Found: - r.response = responses.NewSortedSetFetchHit(sortedSetGrpcElementToModel(grpcResp.Found.GetValuesWithScores().Elements)) - case *pb.XSortedSetFetchResponse_Missing: - r.response = &responses.SortedSetFetchMiss{} - default: - return errUnexpectedGrpcResponse(r, r.grpcResponse) - } - return nil -} - -func sortedSetGrpcElementToModel(grpcSetElements []*pb.XSortedSetElement) []responses.SortedSetBytesElement { - var returnList []responses.SortedSetBytesElement - for _, element := range grpcSetElements { - returnList = append(returnList, responses.SortedSetBytesElement{ - Value: element.Value, - Score: element.Score, - }) - } - return returnList -} diff --git a/momento/sorted_set_fetch_by_rank.go b/momento/sorted_set_fetch_by_rank.go new file mode 100644 index 00000000..9784caa3 --- /dev/null +++ b/momento/sorted_set_fetch_by_rank.go @@ -0,0 +1,100 @@ +package momento + +import ( + "context" + + "github.com/momentohq/client-sdk-go/responses" + + pb "github.com/momentohq/client-sdk-go/internal/protos" +) + +type SortedSetFetchByRankRequest struct { + CacheName string + SetName string + Order SortedSetOrder + StartRank *int32 + EndRank *int32 + + grpcRequest *pb.XSortedSetFetchRequest + grpcResponse *pb.XSortedSetFetchResponse + response responses.SortedSetFetchResponse +} + +func (r *SortedSetFetchByRankRequest) cacheName() string { return r.CacheName } + +func (r *SortedSetFetchByRankRequest) requestName() string { return "Sorted set fetch" } + +func (r *SortedSetFetchByRankRequest) initGrpcRequest(scsDataClient) error { + var err error + + if _, err = prepareName(r.SetName, "Set name"); err != nil { + return err + } + + grpcReq := &pb.XSortedSetFetchRequest{ + SetName: []byte(r.SetName), + Order: pb.XSortedSetFetchRequest_Order(r.Order), + WithScores: true, + } + + // This is the default: fetch everything in ascending order. + by_index := pb.XSortedSetFetchRequest_ByIndex{ + ByIndex: &pb.XSortedSetFetchRequest_XByIndex{ + Start: &pb.XSortedSetFetchRequest_XByIndex_UnboundedStart{}, + End: &pb.XSortedSetFetchRequest_XByIndex_UnboundedEnd{}, + }, + } + + if r.StartRank != nil { + + by_index.ByIndex.Start = &pb.XSortedSetFetchRequest_XByIndex_InclusiveStartIndex{ + InclusiveStartIndex: *r.StartRank, + } + } + + if r.EndRank != nil { + by_index.ByIndex.End = &pb.XSortedSetFetchRequest_XByIndex_ExclusiveEndIndex{ + ExclusiveEndIndex: *r.EndRank, + } + } + + grpcReq.Range = &by_index + + r.grpcRequest = grpcReq + + return nil +} + +func (r *SortedSetFetchByRankRequest) makeGrpcRequest(metadata context.Context, client scsDataClient) (grpcResponse, error) { + resp, err := client.grpcClient.SortedSetFetch(metadata, r.grpcRequest) + if err != nil { + return nil, err + } + + r.grpcResponse = resp + + return resp, nil +} + +func (r *SortedSetFetchByRankRequest) interpretGrpcResponse() error { + switch grpcResp := r.grpcResponse.SortedSet.(type) { + case *pb.XSortedSetFetchResponse_Found: + r.response = responses.NewSortedSetFetchHit(sortedSetByRankGrpcElementToModel(grpcResp.Found.GetValuesWithScores().Elements)) + case *pb.XSortedSetFetchResponse_Missing: + r.response = &responses.SortedSetFetchMiss{} + default: + return errUnexpectedGrpcResponse(r, r.grpcResponse) + } + return nil +} + +func sortedSetByRankGrpcElementToModel(grpcSetElements []*pb.XSortedSetElement) []responses.SortedSetBytesElement { + var returnList []responses.SortedSetBytesElement + for _, element := range grpcSetElements { + returnList = append(returnList, responses.SortedSetBytesElement{ + Value: element.Value, + Score: element.Score, + }) + } + return returnList +} diff --git a/momento/sorted_set_fetch_by_score.go b/momento/sorted_set_fetch_by_score.go new file mode 100644 index 00000000..7243d964 --- /dev/null +++ b/momento/sorted_set_fetch_by_score.go @@ -0,0 +1,116 @@ +package momento + +import ( + "context" + + "github.com/momentohq/client-sdk-go/responses" + + pb "github.com/momentohq/client-sdk-go/internal/protos" +) + +type SortedSetFetchByScoreRequest struct { + CacheName string + SetName string + Order SortedSetOrder + MinScore *float64 + MaxScore *float64 + Offset *uint32 + Count *uint32 + + grpcRequest *pb.XSortedSetFetchRequest + grpcResponse *pb.XSortedSetFetchResponse + response responses.SortedSetFetchResponse +} + +func (r *SortedSetFetchByScoreRequest) cacheName() string { return r.CacheName } + +func (r *SortedSetFetchByScoreRequest) requestName() string { return "Sorted set fetch" } + +func (r *SortedSetFetchByScoreRequest) initGrpcRequest(scsDataClient) error { + var err error + + if _, err = prepareName(r.SetName, "Set name"); err != nil { + return err + } + + grpcReq := &pb.XSortedSetFetchRequest{ + SetName: []byte(r.SetName), + Order: pb.XSortedSetFetchRequest_Order(r.Order), + WithScores: true, + } + + by_score := pb.XSortedSetFetchRequest_ByScore{ + ByScore: &pb.XSortedSetFetchRequest_XByScore{ + Min: &pb.XSortedSetFetchRequest_XByScore_UnboundedMin{}, + Max: &pb.XSortedSetFetchRequest_XByScore_UnboundedMax{}, + Offset: 0, + Count: -1, + }, + } + + if r.MinScore != nil { + by_score.ByScore.Min = &pb.XSortedSetFetchRequest_XByScore_MinScore{ + MinScore: &pb.XSortedSetFetchRequest_XByScore_XScore{ + Score: float64(*r.MinScore), + Exclusive: false, + }, + } + } + + if r.MaxScore != nil { + by_score.ByScore.Max = &pb.XSortedSetFetchRequest_XByScore_MaxScore{ + MaxScore: &pb.XSortedSetFetchRequest_XByScore_XScore{ + Score: float64(*r.MaxScore), + Exclusive: false, + }, + } + } + + if r.Offset != nil { + by_score.ByScore.Offset = *r.Offset + } + + if r.Count != nil { + by_score.ByScore.Count = int32(*r.Count) + } + + grpcReq.Range = &by_score + + r.grpcRequest = grpcReq + + return nil +} + +func (r *SortedSetFetchByScoreRequest) makeGrpcRequest(metadata context.Context, client scsDataClient) (grpcResponse, error) { + resp, err := client.grpcClient.SortedSetFetch(metadata, r.grpcRequest) + if err != nil { + return nil, err + } + + r.grpcResponse = resp + + return resp, nil +} + +func (r *SortedSetFetchByScoreRequest) interpretGrpcResponse() error { + switch grpcResp := r.grpcResponse.SortedSet.(type) { + case *pb.XSortedSetFetchResponse_Found: + r.response = responses.NewSortedSetFetchHit(sortedSetByScoreGrpcElementToModel(grpcResp.Found.GetValuesWithScores().Elements)) + case *pb.XSortedSetFetchResponse_Missing: + r.response = &responses.SortedSetFetchMiss{} + default: + return errUnexpectedGrpcResponse(r, r.grpcResponse) + } + return nil +} + +func sortedSetByScoreGrpcElementToModel(grpcSetElements []*pb.XSortedSetElement) []responses.SortedSetBytesElement { + var returnList []responses.SortedSetBytesElement + for _, element := range grpcSetElements { + returnList = append(returnList, responses.SortedSetBytesElement{ + Value: element.Value, + Score: element.Score, + }) + } + return returnList +} diff --git a/momento/sorted_set_test.go b/momento/sorted_set_test.go index 25a532d2..521d385f 100644 --- a/momento/sorted_set_test.go +++ b/momento/sorted_set_test.go @@ -39,9 +39,9 @@ var _ = Describe("SortedSet", func() { // Convenience for fetching elements. fetch := func() (SortedSetFetchResponse, error) { - return sharedContext.Client.SortedSetFetch( + return sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, }, @@ -55,7 +55,7 @@ var _ = Describe("SortedSet", func() { value := String(uuid.NewString()) Expect( - client.SortedSetFetch(ctx, &SortedSetFetchRequest{ + client.SortedSetFetchByRank(ctx, &SortedSetFetchByRankRequest{ CacheName: cacheName, SetName: collectionName, }), ).Error().To(HaveMomentoErrorCode(expectedError)) @@ -221,12 +221,12 @@ var _ = Describe("SortedSet", func() { ), ) - Describe(`SortedSetFetch`, func() { + Describe(`SortedSetFetchByRank`, func() { It(`Misses if the set does not exist`, func() { Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, }, @@ -250,9 +250,9 @@ var _ = Describe("SortedSet", func() { }) It(`With no extra args it fetches everything in ascending order`, func() { - resp, err := sharedContext.Client.SortedSetFetch( + resp, err := sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, }, @@ -280,25 +280,11 @@ var _ = Describe("SortedSet", func() { )) }) - It(`It errors when ByRank and ByScore are defined`, func() { - Expect( - sharedContext.Client.SortedSetFetch( - sharedContext.Ctx, - &SortedSetFetchRequest{ - CacheName: sharedContext.CacheName, - SetName: sharedContext.CollectionName, - ByRank: &SortedSetFetchByRank{}, - ByScore: &SortedSetFetchByScore{}, - }, - ), - ).Error().To(HaveMomentoErrorCode(InvalidArgumentError)) - }) - It(`Orders`, func() { Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: DESCENDING, @@ -320,16 +306,14 @@ var _ = Describe("SortedSet", func() { start := int32(1) end := int32(4) Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: DESCENDING, - ByRank: &SortedSetFetchByRank{ - StartRank: &start, - EndRank: &end, - }, + StartRank: &start, + EndRank: &end, }, ), ).To(HaveSortedSetElements( @@ -344,15 +328,13 @@ var _ = Describe("SortedSet", func() { It(`Counts negative start rank inclusive from the end`, func() { start := int32(-3) Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: DESCENDING, - ByRank: &SortedSetFetchByRank{ - StartRank: &start, - }, + StartRank: &start, }, ), ).To(HaveSortedSetElements( @@ -367,15 +349,93 @@ var _ = Describe("SortedSet", func() { It(`Counts negative end rank exclusively from the end`, func() { end := int32(-3) Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByRank( + sharedContext.Ctx, + &SortedSetFetchByRankRequest{ + CacheName: sharedContext.CacheName, + SetName: sharedContext.CollectionName, + Order: DESCENDING, + EndRank: &end, + }, + ), + ).To(HaveSortedSetElements( + []SortedSetBytesElement{ + {Value: []byte("one"), Score: 9999}, + {Value: []byte("two"), Score: 50}, + {Value: []byte("three"), Score: 0}, + }, + )) + }) + }) + }) + + Describe(`SortedSetFetchByScore`, func() { + It(`Misses if the set does not exist`, func() { + Expect( + sharedContext.Client.SortedSetFetchByScore( + sharedContext.Ctx, + &SortedSetFetchByScoreRequest{ + CacheName: sharedContext.CacheName, + SetName: sharedContext.CollectionName, + }, + ), + ).To(BeAssignableToTypeOf(&SortedSetFetchMiss{})) + }) + + Context(`With a populated SortedSet`, func() { + // We'll populate the SortedSet with these elements. + sortedSetElements := []SortedSetElement{ + {Value: String("one"), Score: 9999}, + {Value: String("two"), Score: 50}, + {Value: String("three"), Score: 0}, + {Value: String("four"), Score: -50}, + {Value: String("five"), Score: -500}, + {Value: String("six"), Score: -1000}, + } + + BeforeEach(func() { + putElements(sortedSetElements) + }) + + It(`With no extra args it fetches everything in ascending order`, func() { + resp, err := sharedContext.Client.SortedSetFetchByScore( + sharedContext.Ctx, + &SortedSetFetchByScoreRequest{ + CacheName: sharedContext.CacheName, + SetName: sharedContext.CollectionName, + }, + ) + Expect(err).To(BeNil()) + Expect(resp).To(HaveSortedSetElements( + []SortedSetBytesElement{ + {Value: []byte("six"), Score: -1000}, + {Value: []byte("five"), Score: -500}, + {Value: []byte("four"), Score: -50}, + {Value: []byte("three"), Score: 0}, + {Value: []byte("two"), Score: 50}, + {Value: []byte("one"), Score: 9999}, + }, + )) + Expect(resp).To(HaveSortedSetStringElements( + []SortedSetStringElement{ + {Value: "six", Score: -1000}, + {Value: "five", Score: -500}, + {Value: "four", Score: -50}, + {Value: "three", Score: 0}, + {Value: "two", Score: 50}, + {Value: "one", Score: 9999}, + }, + )) + }) + + It(`Orders`, func() { + Expect( + sharedContext.Client.SortedSetFetchByScore( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByScoreRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: DESCENDING, - ByRank: &SortedSetFetchByRank{ - EndRank: &end, - }, }, ), ).To(HaveSortedSetElements( @@ -383,6 +443,9 @@ var _ = Describe("SortedSet", func() { {Value: []byte("one"), Score: 9999}, {Value: []byte("two"), Score: 50}, {Value: []byte("three"), Score: 0}, + {Value: []byte("four"), Score: -50}, + {Value: []byte("five"), Score: -500}, + {Value: []byte("six"), Score: -1000}, }, )) }) @@ -391,16 +454,14 @@ var _ = Describe("SortedSet", func() { minScore := float64(0) maxScore := float64(50) Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByScore( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByScoreRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: DESCENDING, - ByScore: &SortedSetFetchByScore{ - MinScore: &minScore, - MaxScore: &maxScore, - }, + MinScore: &minScore, + MaxScore: &maxScore, }, ), ).To(HaveSortedSetElements( @@ -417,18 +478,16 @@ var _ = Describe("SortedSet", func() { offset := uint32(1) count := uint32(2) Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByScore( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByScoreRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: DESCENDING, - ByScore: &SortedSetFetchByScore{ - MinScore: &minScore, - MaxScore: &maxScore, - Offset: &offset, - Count: &count, - }, + MinScore: &minScore, + MaxScore: &maxScore, + Offset: &offset, + Count: &count, }, ), ).To(HaveSortedSetElements( @@ -766,9 +825,9 @@ var _ = Describe("SortedSet", func() { Expect(err).To(BeNil()) Expect(resp).To(BeAssignableToTypeOf(&SortedSetPutElementSuccess{})) - fetchResp, fetchErr := sharedContext.Client.SortedSetFetch( + fetchResp, fetchErr := sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, }, @@ -799,7 +858,7 @@ var _ = Describe("SortedSet", func() { ), ).To(BeAssignableToTypeOf(&SortedSetPutElementsSuccess{})) - fetchResp, err := sharedContext.Client.SortedSetFetch(sharedContext.Ctx, &SortedSetFetchRequest{ + fetchResp, err := sharedContext.Client.SortedSetFetchByRank(sharedContext.Ctx, &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: ASCENDING, @@ -838,7 +897,7 @@ var _ = Describe("SortedSet", func() { }), ).To(BeAssignableToTypeOf(&SortedSetRemoveElementSuccess{})) - fetchResp, err := sharedContext.Client.SortedSetFetch(sharedContext.Ctx, &SortedSetFetchRequest{ + fetchResp, err := sharedContext.Client.SortedSetFetchByRank(sharedContext.Ctx, &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, Order: ASCENDING, @@ -893,9 +952,9 @@ var _ = Describe("SortedSet", func() { ).To(BeAssignableToTypeOf(&SortedSetRemoveElementsSuccess{})) Expect( - sharedContext.Client.SortedSetFetch( + sharedContext.Client.SortedSetFetchByRank( sharedContext.Ctx, - &SortedSetFetchRequest{ + &SortedSetFetchByRankRequest{ CacheName: sharedContext.CacheName, SetName: sharedContext.CollectionName, }, diff --git a/momento/value.go b/momento/value.go index c24656ee..15da64ed 100644 --- a/momento/value.go +++ b/momento/value.go @@ -86,6 +86,13 @@ func DictionaryElementsFromMapStringValue(theMap map[string]Value) []DictionaryE return elements } +type SortedSetOrder int + +const ( + ASCENDING SortedSetOrder = 0 + DESCENDING SortedSetOrder = 1 +) + type SortedSetElement struct { Value Value Score float64