From 5d5cd9833b722ae7264f57192a136a46da6633a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 14 Mar 2019 15:19:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=8F=AA=E4=BC=A0key?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudcommon/db/standalone.go | 26 +++++++++++++++++++++----- pkg/mcclient/options/base.go | 7 +++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/pkg/cloudcommon/db/standalone.go b/pkg/cloudcommon/db/standalone.go index 09fcd2e85a..45bbfd5716 100644 --- a/pkg/cloudcommon/db/standalone.go +++ b/pkg/cloudcommon/db/standalone.go @@ -105,6 +105,11 @@ func (manager *SStandaloneResourceBaseManager) FetchByExternalId(idStr string) ( } } +type STagValue struct { + value string + exist bool +} + func (manager *SStandaloneResourceBaseManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { q, err := manager.SResourceBaseManager.ListItemFilter(ctx, q, userCred, query) if err != nil { @@ -116,7 +121,7 @@ func (manager *SStandaloneResourceBaseManager) ListItemFilter(ctx context.Contex q = q.Filter(sqlchemy.IsFalse(q.Field("is_emulated"))) } - tags := map[string]string{} + tags := map[string]STagValue{} if query.Contains("tags") { idx := 0 for { @@ -124,7 +129,11 @@ func (manager *SStandaloneResourceBaseManager) ListItemFilter(ctx context.Contex if len(key) == 0 { break } - value, _ := query.GetString("tags", fmt.Sprintf("%d", idx), "value") + value := STagValue{exist: false} + if query.Contains("tags", fmt.Sprintf("%d", idx), "value") { + value.value, _ = query.GetString("tags", fmt.Sprintf("%d", idx), "value") + value.exist = true + } tags[key] = value idx++ } @@ -135,10 +144,17 @@ func (manager *SStandaloneResourceBaseManager) ListItemFilter(ctx context.Contex idx := 0 for k, v := range tags { if idx == 0 { - metadataView = metadataView.Equals("key", k).Equals("value", v) + metadataView = metadataView.Equals("key", k) + if v.exist { + metadataView = metadataView.Equals("value", v.value) + } } else { - subMetataView := Metadata.Query().Equals("key", k).Equals("value", v).SubQuery() - metadataView.Join(subMetataView, sqlchemy.Equals(metadataView.Field("id"), subMetataView.Field("id"))) + subMetataView := Metadata.Query().Equals("key", k) + if v.exist { + subMetataView = subMetataView.Equals("value", v.value) + } + sq := subMetataView.SubQuery() + metadataView.Join(sq, sqlchemy.Equals(metadataView.Field("id"), sq.Field("id"))) } idx++ } diff --git a/pkg/mcclient/options/base.go b/pkg/mcclient/options/base.go index e52733a73c..af622c7347 100644 --- a/pkg/mcclient/options/base.go +++ b/pkg/mcclient/options/base.go @@ -219,13 +219,12 @@ func (opts *BaseListOptions) Params() (*jsonutils.JSONDict, error) { params.Set("admin", jsonutils.JSONTrue) } } - if len(opts.TagsKey) != len(opts.TagsValue) { - return nil, fmt.Errorf("tags key length not equal value length") - } if len(opts.TagsKey) > 0 { for i := 0; i < len(opts.TagsKey); i++ { params.Add(jsonutils.NewString(opts.TagsKey[i]), fmt.Sprintf("tags.%d.key", i)) - params.Add(jsonutils.NewString(opts.TagsValue[i]), fmt.Sprintf("tags.%d.value", i)) + if len(opts.TagsValue) > i { + params.Add(jsonutils.NewString(opts.TagsValue[i]), fmt.Sprintf("tags.%d.value", i)) + } } } return params, nil