You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/08/24 10:28:43 UTC

[servicecomb-kie] branch master updated: Fix: Can not page the kvs (#211)

This is an automated email from the ASF dual-hosted git repository.

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-kie.git


The following commit(s) were added to refs/heads/master by this push:
     new f3527b9  Fix: Can not page the kvs (#211)
f3527b9 is described below

commit f3527b9c2ace866fac2553a314e38eeb6b109d75
Author: little-cui <su...@qq.com>
AuthorDate: Tue Aug 24 18:28:39 2021 +0800

    Fix: Can not page the kvs (#211)
---
 pkg/validator/rule.go                  |  2 +-
 server/datasource/etcd/kv/kv_dao.go    | 38 ++++++++++++++--------------
 server/datasource/mongo/kv/kv_dao.go   |  4 +--
 server/resource/v1/kv_resource_test.go | 45 +++++++++++++++++++++++++++++++++-
 4 files changed, 65 insertions(+), 24 deletions(-)

diff --git a/pkg/validator/rule.go b/pkg/validator/rule.go
index 401c1b7..eb32ba3 100644
--- a/pkg/validator/rule.go
+++ b/pkg/validator/rule.go
@@ -24,7 +24,7 @@ const (
 	commonNameRegexString = `^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$`
 	labelKeyRegexString   = `^[a-zA-Z0-9]{1,32}$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]{1,30}[a-zA-Z0-9]$`
 	labelValueRegexString = `^[a-zA-Z0-9]{0,160}$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]{0,158}[a-zA-Z0-9]$`
-	getKeyRegexString     = `^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$|^beginWith\([a-zA-Z0-9][a-zA-Z0-9_\-.]*\)$|^wildcard\([a-zA-Z0-9][a-zA-Z0-9_\-.*]*\)$`
+	getKeyRegexString     = `^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$|^beginWith\([a-zA-Z0-9][a-zA-Z0-9_\-.]*\)$|^wildcard\([a-zA-Z0-9*][a-zA-Z0-9_\-.*]*\)$`
 	asciiRegexString      = `^[\x00-\x7F]*$`
 	allCharString         = `.*`
 )
diff --git a/server/datasource/etcd/kv/kv_dao.go b/server/datasource/etcd/kv/kv_dao.go
index 67a639d..48c2eb0 100644
--- a/server/datasource/etcd/kv/kv_dao.go
+++ b/server/datasource/etcd/kv/kv_dao.go
@@ -251,26 +251,24 @@ func IsUniqueFind(opts datasource.FindOptions) bool {
 }
 
 func toRegex(opts datasource.FindOptions) (*regexp.Regexp, error) {
-	var (
-		regex *regexp.Regexp
-		value string
-	)
-	if opts.Key != "" {
-		switch {
-		case strings.HasPrefix(opts.Key, "beginWith("):
-			value = "^" + strings.ReplaceAll(getValue(opts.Key), ".", "\\.") + ".*"
-		case strings.HasPrefix(opts.Key, "wildcard("):
-			value = strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
-			value = strings.ReplaceAll(value, "*", ".*")
-		default:
-			value = "^" + strings.ReplaceAll(opts.Key, ".", "\\.") + "$"
-		}
-		var err error
-		regex, err = regexp.Compile(value)
-		if err != nil {
-			openlog.Error("invalid wildcard expr: " + err.Error())
-			return nil, err
-		}
+	var value string
+	if opts.Key == "" {
+		return nil, nil
+	}
+	switch {
+	case strings.HasPrefix(opts.Key, "beginWith("):
+		value = strings.ReplaceAll(getValue(opts.Key), ".", "\\.") + ".*"
+	case strings.HasPrefix(opts.Key, "wildcard("):
+		value = strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
+		value = strings.ReplaceAll(value, "*", ".*")
+	default:
+		value = strings.ReplaceAll(opts.Key, ".", "\\.")
+	}
+	value = "(?i)^" + value + "$"
+	regex, err := regexp.Compile(value)
+	if err != nil {
+		openlog.Error("invalid wildcard expr: " + value + ", error: " + err.Error())
+		return nil, err
 	}
 	return regex, nil
 }
diff --git a/server/datasource/mongo/kv/kv_dao.go b/server/datasource/mongo/kv/kv_dao.go
index 45060f6..554243e 100644
--- a/server/datasource/mongo/kv/kv_dao.go
+++ b/server/datasource/mongo/kv/kv_dao.go
@@ -94,11 +94,11 @@ func findKV(ctx context.Context, domain string, project string, opts datasource.
 		switch {
 		case strings.HasPrefix(opts.Key, "beginWith("):
 			value := strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
-			filter["key"] = bson.M{"$regex": value, "$options": "$i"}
+			filter["key"] = bson.M{"$regex": "^" + value + ".*$", "$options": "$i"}
 		case strings.HasPrefix(opts.Key, "wildcard("):
 			value := strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
 			value = strings.ReplaceAll(value, "*", ".*")
-			filter["key"] = bson.M{"$regex": value, "$options": "$i"}
+			filter["key"] = bson.M{"$regex": "^" + value + "$", "$options": "$i"}
 		}
 	}
 	if len(opts.Labels) != 0 {
diff --git a/server/resource/v1/kv_resource_test.go b/server/resource/v1/kv_resource_test.go
index b11ffe0..bd44725 100644
--- a/server/resource/v1/kv_resource_test.go
+++ b/server/resource/v1/kv_resource_test.go
@@ -429,7 +429,7 @@ func TestKVResource_List(t *testing.T) {
 		assert.Equal(t, 1, len(result.Data))
 	})
 	t.Run("get one key, fuzzy match,should return 2 kv", func(t *testing.T) {
-		r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=beginWith(time)", nil)
+		r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=beginWith(TIME)", nil)
 		r.Header.Set("Content-Type", "application/json")
 		kvr := &v1.KVResource{}
 		c, err := restfultest.New(kvr, nil)
@@ -442,6 +442,49 @@ func TestKVResource_List(t *testing.T) {
 		err = json.Unmarshal(body, result)
 		assert.NoError(t, err)
 		assert.Equal(t, 2, len(result.Data))
+
+		r, _ = http.NewRequest("GET", "/v1/kv_test/kie/kv?key=beginWith(IME)", nil)
+		r.Header.Set("Content-Type", "application/json")
+		kvr = &v1.KVResource{}
+		c, err = restfultest.New(kvr, nil)
+		assert.NoError(t, err)
+		resp = httptest.NewRecorder()
+		c.ServeHTTP(resp, r)
+		body, err = ioutil.ReadAll(resp.Body)
+		assert.NoError(t, err)
+		result = &model.KVResponse{}
+		err = json.Unmarshal(body, result)
+		assert.NoError(t, err)
+		assert.Equal(t, 0, len(result.Data))
+	})
+	t.Run("get one key, wildcard match,should return 2 kv", func(t *testing.T) {
+		r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=wildcard(*IME*)", nil)
+		r.Header.Set("Content-Type", "application/json")
+		kvr := &v1.KVResource{}
+		c, err := restfultest.New(kvr, nil)
+		assert.NoError(t, err)
+		resp := httptest.NewRecorder()
+		c.ServeHTTP(resp, r)
+		body, err := ioutil.ReadAll(resp.Body)
+		assert.NoError(t, err)
+		result := &model.KVResponse{}
+		err = json.Unmarshal(body, result)
+		assert.NoError(t, err)
+		assert.Equal(t, 2, len(result.Data))
+
+		r, _ = http.NewRequest("GET", "/v1/kv_test/kie/kv?key=wildcard(TIME)", nil)
+		r.Header.Set("Content-Type", "application/json")
+		kvr = &v1.KVResource{}
+		c, err = restfultest.New(kvr, nil)
+		assert.NoError(t, err)
+		resp = httptest.NewRecorder()
+		c.ServeHTTP(resp, r)
+		body, err = ioutil.ReadAll(resp.Body)
+		assert.NoError(t, err)
+		result = &model.KVResponse{}
+		err = json.Unmarshal(body, result)
+		assert.NoError(t, err)
+		assert.Equal(t, 0, len(result.Data))
 	})
 	t.Run("get one key by service label should return 2 kv,delete one", func(t *testing.T) {
 		r, _ := http.NewRequest("GET", "/v1/kv_test/kie/kv?key=timeout&label=service:utService", nil)