mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-19 02:37:24 +08:00
允许只传key进行过滤
This commit is contained in:
@@ -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++
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user