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:
Jian Qiu
2024-02-06 21:50:46 +08:00
committed by GitHub
parent 8c2ecb44ed
commit c58970c888
8 changed files with 27 additions and 13 deletions
+2 -3
View File
@@ -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 {
+1
View File
@@ -326,6 +326,7 @@ func (manager *SDomainLevelResourceBaseManager) GetPropertyDomainTagValueTree(
manager.GetIDomainLevelModelManager(),
"domain",
"domain_id",
"",
ctx,
userCred,
query,
+4 -3
View File
@@ -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")))
+14 -3
View File
@@ -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)
+2 -2
View File
@@ -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]
+1
View File
@@ -655,6 +655,7 @@ func (manager *SVirtualResourceBaseManager) GetPropertyProjectTagValueTree(
manager.GetIVirtualModelManager(),
"project",
"tenant_id",
"",
ctx,
userCred,
query,
+1
View File
@@ -418,6 +418,7 @@ func (manager *SIdentityBaseResourceManager) GetPropertyDomainTagValueTree(
manager.GetIIdentityModelManager(),
"domain",
"domain_id",
"",
ctx,
userCred,
query,
+2 -2
View File
@@ -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")
}