From 809b9ed3d16acf88e0bc4eefabf891b44ffe4aba Mon Sep 17 00:00:00 2001 From: Michael Landis Date: Fri, 10 Mar 2023 13:48:55 -0800 Subject: [PATCH] feat: implement `sortedSetPutElement` (#266) Implement `sortedSetPutElement`. --- momento/cache_client.go | 22 +++++++++ momento/sorted_set_put_element.go | 13 ++++++ momento/sorted_set_put_elements.go | 6 +-- momento/sorted_set_test.go | 67 ++++++++++++++++++++++++++-- responses/sorted_set_put.go | 9 ---- responses/sorted_set_put_element.go | 9 ++++ responses/sorted_set_put_elements.go | 9 ++++ 7 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 momento/sorted_set_put_element.go delete mode 100644 responses/sorted_set_put.go create mode 100644 responses/sorted_set_put_element.go create mode 100644 responses/sorted_set_put_elements.go diff --git a/momento/cache_client.go b/momento/cache_client.go index 0508b41a..f5e39e0e 100644 --- a/momento/cache_client.go +++ b/momento/cache_client.go @@ -28,6 +28,7 @@ type CacheClient interface { KeysExist(ctx context.Context, r *KeysExistRequest) (responses.KeysExistResponse, error) SortedSetFetch(ctx context.Context, r *SortedSetFetchRequest) (responses.SortedSetFetchResponse, error) + SortedSetPutElement(ctx context.Context, r *SortedSetPutElementRequest) (responses.SortedSetPutElementResponse, error) SortedSetPutElements(ctx context.Context, r *SortedSetPutElementsRequest) (responses.SortedSetPutElementsResponse, error) SortedSetGetScores(ctx context.Context, r *SortedSetGetScoresRequest) (responses.SortedSetGetScoresResponse, error) SortedSetRemoveElements(ctx context.Context, r *SortedSetRemoveElementsRequest) (responses.SortedSetRemoveElementsResponse, error) @@ -224,6 +225,27 @@ func (c defaultScsClient) SortedSetFetch(ctx context.Context, r *SortedSetFetchR return r.response, nil } +func (c defaultScsClient) SortedSetPutElement(ctx context.Context, r *SortedSetPutElementRequest) (responses.SortedSetPutElementResponse, error) { + if r.Value == nil { + return nil, convertMomentoSvcErrorToCustomerError( + momentoerrors.NewMomentoSvcErr( + momentoerrors.InvalidArgumentError, "value cannot be nil", nil, + ), + ) + } + newRequest := &SortedSetPutElementsRequest{ + CacheName: r.CacheName, + SetName: r.SetName, + Elements: []*SortedSetPutElement{{Value: r.Value, Score: r.Score}}, + Ttl: r.Ttl, + } + if err := c.dataClient.makeRequest(ctx, newRequest); err != nil { + return nil, err + } + + return &responses.SortedSetPutElementSuccess{}, nil +} + func (c defaultScsClient) SortedSetPutElements(ctx context.Context, r *SortedSetPutElementsRequest) (responses.SortedSetPutElementsResponse, error) { if err := c.dataClient.makeRequest(ctx, r); err != nil { return nil, err diff --git a/momento/sorted_set_put_element.go b/momento/sorted_set_put_element.go new file mode 100644 index 00000000..3e441afb --- /dev/null +++ b/momento/sorted_set_put_element.go @@ -0,0 +1,13 @@ +package momento + +import ( + "github.com/momentohq/client-sdk-go/utils" +) + +type SortedSetPutElementRequest struct { + CacheName string + SetName string + Value Value + Score float64 + Ttl *utils.CollectionTtl +} diff --git a/momento/sorted_set_put_elements.go b/momento/sorted_set_put_elements.go index 9cb7fb9d..cd707b20 100644 --- a/momento/sorted_set_put_elements.go +++ b/momento/sorted_set_put_elements.go @@ -47,7 +47,7 @@ func (r *SortedSetPutElementsRequest) initGrpcRequest(client scsDataClient) erro return err } - elements := convertSortedSetElementToGrpc(r.Elements) + elements := convertSortedSetElementsToGrpc(r.Elements) r.grpcRequest = &pb.XSortedSetPutRequest{ SetName: []byte(r.SetName), @@ -68,11 +68,11 @@ func (r *SortedSetPutElementsRequest) makeGrpcRequest(metadata context.Context, } func (r *SortedSetPutElementsRequest) interpretGrpcResponse() error { - r.response = &responses.SortedSetPutSuccess{} + r.response = &responses.SortedSetPutElementsSuccess{} return nil } -func convertSortedSetElementToGrpc(modelSetElements []*SortedSetPutElement) []*pb.XSortedSetElement { +func convertSortedSetElementsToGrpc(modelSetElements []*SortedSetPutElement) []*pb.XSortedSetElement { var returnList []*pb.XSortedSetElement for _, el := range modelSetElements { returnList = append(returnList, &pb.XSortedSetElement{ diff --git a/momento/sorted_set_test.go b/momento/sorted_set_test.go index 6e32ade7..d81b57ea 100644 --- a/momento/sorted_set_test.go +++ b/momento/sorted_set_test.go @@ -34,7 +34,7 @@ var _ = Describe("SortedSet", func() { Elements: elements, }, ), - ).To(BeAssignableToTypeOf(&SortedSetPutSuccess{})) + ).To(BeAssignableToTypeOf(&SortedSetPutElementsSuccess{})) } // Convenience for fetching elements. @@ -79,6 +79,12 @@ var _ = Describe("SortedSet", func() { }), ).Error().To(HaveMomentoErrorCode(expectedError)) + Expect( + client.SortedSetPutElement(ctx, &SortedSetPutElementRequest{ + CacheName: cacheName, SetName: collectionName, Value: value, Score: float64(1), + }), + ).Error().To(HaveMomentoErrorCode(expectedError)) + putElements := []*SortedSetPutElement{{ Value: value, Score: float64(1), @@ -180,7 +186,24 @@ var _ = Describe("SortedSet", func() { ).To(BeAssignableToTypeOf(SortedSetIncrementScoreSuccess(0))) }, ), - Entry(`SortedSetPut`, + Entry(`SortedSetPutElement`, + func(element SortedSetPutElement, ttl *utils.CollectionTtl) { + request := &SortedSetPutElementRequest{ + CacheName: sharedContext.CacheName, + SetName: sharedContext.CollectionName, + Value: element.Value, + Score: element.Score, + } + if ttl != nil { + request.Ttl = ttl + } + + Expect( + sharedContext.Client.SortedSetPutElement(sharedContext.Ctx, request), + ).To(BeAssignableToTypeOf(&SortedSetPutElementSuccess{})) + }, + ), + Entry(`SortedSetPutElements`, func(element SortedSetPutElement, ttl *utils.CollectionTtl) { request := &SortedSetPutElementsRequest{ CacheName: sharedContext.CacheName, @@ -193,7 +216,7 @@ var _ = Describe("SortedSet", func() { Expect( sharedContext.Client.SortedSetPutElements(sharedContext.Ctx, request), - ).To(BeAssignableToTypeOf(&SortedSetPutSuccess{})) + ).To(BeAssignableToTypeOf(&SortedSetPutElementsSuccess{})) }, ), ) @@ -699,6 +722,44 @@ var _ = Describe("SortedSet", func() { }) }) + Describe(`SortedSetPutElement`, func() { + // TODO + /* + It(`Puts an element with a string value`, func() { + resp, err := sharedContext.Client.SortedSetPutElement( + sharedContext.Ctx, + &SortedSetPutElementRequest{ + CacheName: sharedContext.CacheName, + SetName: sharedContext.CollectionName, + Value: String("aValue"), + Score: 42, + }) + Expect(err).To(BeNil()) + Expect(resp).To(BeAssignableToTypeOf(&SortedSetPutElementSuccess{})) + + fetchResp, fetchErr := sharedContext.Client.SortedSetFetch( + sharedContext.Ctx, + &SortedSetFetchRequest{ + CacheName: sharedContext.CacheName, + SetName: sharedContext.CollectionName, + }, + ) + Expect(fetchErr).To(BeNil()) + switch fetchResp := fetchResp.(type) { + case *SortedSetFetchHit: + Expect(fetchResp.elements).To(Equal( + []SortedSetElement{ + &SortedSetElement{Value: "aValue", Score: 42}, + }, + )) + } + })*/ + }) + + Describe(`SortedSetPutElements`, func() { + // TODO: add tests for SortedSetPutElements + }) + Describe(`SortedSetRemove`, func() { It(`Succeeds when the element does not exist`, func() { Expect( diff --git a/responses/sorted_set_put.go b/responses/sorted_set_put.go deleted file mode 100644 index e6e6fe02..00000000 --- a/responses/sorted_set_put.go +++ /dev/null @@ -1,9 +0,0 @@ -package responses - -type SortedSetPutElementsResponse interface { - isSortedSetPutResponse() -} - -type SortedSetPutSuccess struct{} - -func (SortedSetPutSuccess) isSortedSetPutResponse() {} diff --git a/responses/sorted_set_put_element.go b/responses/sorted_set_put_element.go new file mode 100644 index 00000000..a2c3e7c4 --- /dev/null +++ b/responses/sorted_set_put_element.go @@ -0,0 +1,9 @@ +package responses + +type SortedSetPutElementResponse interface { + isSortedSetPutElementResponse() +} + +type SortedSetPutElementSuccess struct{} + +func (SortedSetPutElementSuccess) isSortedSetPutElementResponse() {} diff --git a/responses/sorted_set_put_elements.go b/responses/sorted_set_put_elements.go new file mode 100644 index 00000000..02b9d1cc --- /dev/null +++ b/responses/sorted_set_put_elements.go @@ -0,0 +1,9 @@ +package responses + +type SortedSetPutElementsResponse interface { + isSortedSetPutElementsResponse() +} + +type SortedSetPutElementsSuccess struct{} + +func (SortedSetPutElementsSuccess) isSortedSetPutElementsResponse() {}