允许只传key进行过滤

This commit is contained in:
屈轩
2019-03-14 15:43:46 +08:00
parent 46d5120a35
commit 5d5cd9833b
2 changed files with 24 additions and 9 deletions
+21 -5
View File
@@ -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++
}
+3 -4
View File
@@ -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