From ddddecc3ab98b2b1aa691723b6eb45ca9726fe20 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Thu, 4 Aug 2016 11:13:41 -0700 Subject: [PATCH] clientv3: ignore sort-ascend-key option --- clientv3/op.go | 8 ++++++++ clientv3/op_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 clientv3/op_test.go diff --git a/clientv3/op.go b/clientv3/op.go index 41ab52c96..4b4292692 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -193,6 +193,14 @@ func WithRev(rev int64) OpOption { return func(op *Op) { op.rev = rev } } // 'order' can be either 'SortNone', 'SortAscend', 'SortDescend'. func WithSort(target SortTarget, order SortOrder) OpOption { return func(op *Op) { + if target == SortByKey && order == SortAscend { + // If order != SortNone, server fetches the entire key-space, + // and then applies the sort and limit, if provided. + // Since current mvcc.Range implementation returns results + // sorted by keys in lexiographically ascending order, + // client should ignore SortOrder if the target is SortByKey. + order = SortNone + } op.sort = &SortOption{target, order} } } diff --git a/clientv3/op_test.go b/clientv3/op_test.go new file mode 100644 index 000000000..de533f954 --- /dev/null +++ b/clientv3/op_test.go @@ -0,0 +1,38 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package clientv3 + +import ( + "reflect" + "testing" + + pb "github.com/coreos/etcd/etcdserver/etcdserverpb" +) + +// TestOpWithSort tests if WithSort(ASCEND, KEY) and WithLimit are specified, +// RangeRequest ignores the SortOption to avoid unnecessarily fetching +// the entire key-space. +func TestOpWithSort(t *testing.T) { + opReq := OpGet("foo", WithSort(SortByKey, SortAscend), WithLimit(10)).toRequestOp().Request + q, ok := opReq.(*pb.RequestOp_RequestRange) + if !ok { + t.Fatalf("expected range request, got %v", reflect.TypeOf(opReq)) + } + req := q.RequestRange + wreq := &pb.RangeRequest{Key: []byte("foo"), SortOrder: pb.RangeRequest_NONE, Limit: 10} + if !reflect.DeepEqual(req, wreq) { + t.Fatalf("expected %+v, got %+v", wreq, req) + } +}