mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-08-31 01:35:56 +08:00
fix: project tag value tree can return sum of any field (#19464)
Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
@@ -979,8 +979,7 @@ func getItemDetails(manager IModelManager, item IModel, ctx context.Context, use
|
||||
return nil, httperrors.NewInternalServerError("FetchCustomizeColumns returns incorrect results(expect 1 actual %d)", len(extraRows))
|
||||
}
|
||||
|
||||
func tryGetModelProperty(manager IModelManager, ctx context.Context, property string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
userCred := fetchUserCredential(ctx)
|
||||
func tryGetModelProperty(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, property string, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
funcName := fmt.Sprintf("GetProperty%s", utils.Kebab2Camel(property, "-"))
|
||||
|
||||
modelValue := reflect.ValueOf(manager)
|
||||
@@ -1023,7 +1022,7 @@ func (dispatcher *DBModelDispatcher) Get(ctx context.Context, idStr string, quer
|
||||
manager := dispatcher.manager.GetImmutableInstance(ctx, userCred, query)
|
||||
ctx = manager.PrepareQueryContext(ctx, userCred, query)
|
||||
|
||||
data, err := tryGetModelProperty(manager, ctx, idStr, query)
|
||||
data, err := tryGetModelProperty(manager, ctx, userCred, idStr, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else if data != nil {
|
||||
|
||||
@@ -326,6 +326,7 @@ func (manager *SDomainLevelResourceBaseManager) GetPropertyDomainTagValueTree(
|
||||
manager.GetIDomainLevelModelManager(),
|
||||
"domain",
|
||||
"domain_id",
|
||||
"",
|
||||
ctx,
|
||||
userCred,
|
||||
query,
|
||||
|
||||
@@ -83,11 +83,12 @@ func objIdQueryWithTags(ctx context.Context, modelName string, tagsList []map[st
|
||||
if len(tags) == 0 {
|
||||
continue
|
||||
}
|
||||
metadataView := metadataResQ.Query(metadataResQ.Field("obj_id"))
|
||||
metadataView := metadataResQ.Query(metadataResQ.Field("obj_id").Label("obj_id"))
|
||||
for key, val := range tags {
|
||||
q := metadataResQ.Query().Equals("key", key)
|
||||
q := metadataResQ.Query(metadataResQ.Field("id"))
|
||||
q = q.Equals("key", key)
|
||||
if len(val) > 0 {
|
||||
q = q.Equals("key", key).In("value", val)
|
||||
q = q.In("value", val)
|
||||
}
|
||||
sq := q.SubQuery()
|
||||
metadataView = metadataView.Join(sq, sqlchemy.Equals(metadataView.Field("id"), sq.Field("id")))
|
||||
|
||||
@@ -944,6 +944,7 @@ func (manager *SStandaloneAnonResourceBaseManager) GetPropertyTagValueTree(
|
||||
manager.GetIStandaloneModelManager(),
|
||||
manager.Keyword(),
|
||||
"id",
|
||||
"",
|
||||
ctx,
|
||||
userCred,
|
||||
query,
|
||||
@@ -954,6 +955,7 @@ func GetPropertyTagValueTree(
|
||||
manager IModelManager,
|
||||
tagObjType string,
|
||||
tagIdField string,
|
||||
sumField string,
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
@@ -964,7 +966,7 @@ func GetPropertyTagValueTree(
|
||||
return nil, errors.Wrap(err, "Unmarshal")
|
||||
}
|
||||
|
||||
valueMap, err := GetTagValueCountMap(manager, tagObjType, tagIdField, input.Keys, ctx, userCred, query)
|
||||
valueMap, err := GetTagValueCountMap(manager, tagObjType, tagIdField, sumField, input.Keys, ctx, userCred, query)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "AllStringAmp")
|
||||
}
|
||||
@@ -981,6 +983,7 @@ func GetTagValueCountMap(
|
||||
manager IModelManager,
|
||||
tagObjType string,
|
||||
tagIdField string,
|
||||
sumField string,
|
||||
keys []string,
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
@@ -988,14 +991,22 @@ func GetTagValueCountMap(
|
||||
) ([]map[string]string, error) {
|
||||
var err error
|
||||
objSubQ := manager.Query().SubQuery()
|
||||
objQ := objSubQ.Query(objSubQ.Field(tagIdField), sqlchemy.COUNT("_sub_count_"))
|
||||
var sumFieldQ sqlchemy.IQueryField
|
||||
if len(sumField) > 0 {
|
||||
sumFieldQ = sqlchemy.SUM("_sub_count_", objSubQ.Field(sumField))
|
||||
} else {
|
||||
sumFieldQ = sqlchemy.COUNT("_sub_count_")
|
||||
}
|
||||
objQ := objSubQ.Query(objSubQ.Field(tagIdField), sumFieldQ)
|
||||
objQ, err = ListItemQueryFilters(manager, ctx, objQ, userCred, query, policy.PolicyActionList)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "ListItemQueryFilters")
|
||||
}
|
||||
objQ = objQ.GroupBy(objSubQ.Field(tagIdField))
|
||||
q := objQ.SubQuery().Query(sqlchemy.SUM(tagValueCountKey, objQ.Field("_sub_count_")))
|
||||
metadataSQ := Metadata.Query().Equals("obj_type", tagObjType).In("key", keys).SubQuery()
|
||||
|
||||
metadataMan := GetMetadaManagerInContext(ctx)
|
||||
metadataSQ := metadataMan.Query().Equals("obj_type", tagObjType).In("key", keys).SubQuery()
|
||||
groupBy := make([]interface{}, 0)
|
||||
for i, key := range keys {
|
||||
valueFieldName := TagValueKey(i)
|
||||
|
||||
@@ -33,7 +33,7 @@ func TagValueKey(idx int) string {
|
||||
type sTagValueTreeNode struct {
|
||||
Key string `json:"key"`
|
||||
Value string `json:"value"`
|
||||
Count int `json:"count"`
|
||||
Count float64 `json:"count"`
|
||||
Tags tagutils.TTagSet `json:"tags"`
|
||||
|
||||
Children []*sTagValueTreeNode `json:"children"`
|
||||
@@ -100,7 +100,7 @@ func constructTree(data []map[string]string, keys []string) *sTagValueTreeNode {
|
||||
}
|
||||
|
||||
func processOneRow(node *sTagValueTreeNode, row map[string]string, keys []string) {
|
||||
rowCount, _ := strconv.Atoi(row[tagValueCountKey])
|
||||
rowCount, _ := strconv.ParseFloat(row[tagValueCountKey], 64)
|
||||
node.Count += rowCount
|
||||
for i := range keys {
|
||||
key := keys[i]
|
||||
|
||||
@@ -655,6 +655,7 @@ func (manager *SVirtualResourceBaseManager) GetPropertyProjectTagValueTree(
|
||||
manager.GetIVirtualModelManager(),
|
||||
"project",
|
||||
"tenant_id",
|
||||
"",
|
||||
ctx,
|
||||
userCred,
|
||||
query,
|
||||
|
||||
@@ -418,6 +418,7 @@ func (manager *SIdentityBaseResourceManager) GetPropertyDomainTagValueTree(
|
||||
manager.GetIIdentityModelManager(),
|
||||
"domain",
|
||||
"domain_id",
|
||||
"",
|
||||
ctx,
|
||||
userCred,
|
||||
query,
|
||||
|
||||
@@ -529,7 +529,7 @@ func (org *SOrganization) syncIModelManagerTags(ctx context.Context, userCred mc
|
||||
orgKeys[i] = fmt.Sprintf("%s%s", db.ORGANIZATION_TAG_PREFIX, keys[i])
|
||||
}
|
||||
{
|
||||
tagValMaps, err := db.GetTagValueCountMap(manager, manager.Keyword(), "id", userKeys, ctx, userCred, query)
|
||||
tagValMaps, err := db.GetTagValueCountMap(manager, manager.Keyword(), "id", "", userKeys, ctx, userCred, query)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GetTagValueCountMap")
|
||||
}
|
||||
@@ -545,7 +545,7 @@ func (org *SOrganization) syncIModelManagerTags(ctx context.Context, userCred mc
|
||||
}
|
||||
}
|
||||
{
|
||||
tagValMaps, err := db.GetTagValueCountMap(manager, manager.Keyword(), "id", orgKeys, ctx, userCred, query)
|
||||
tagValMaps, err := db.GetTagValueCountMap(manager, manager.Keyword(), "id", "", orgKeys, ctx, userCred, query)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GetTagValueCountMap")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user