This is an automated email from the ASF dual-hosted git repository.

shuai pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/answer.git

commit 537b721044f3abd91c04485339d9ac3382a3bba7
Author: hgaol <dhan...@hotmail.com>
AuthorDate: Fri Apr 25 00:48:33 2025 +0800

    feat: refactor tag migration logic to streamline object relations and 
remove unused code
---
 internal/repo/activity_common/follow.go   | 13 ++----
 internal/repo/tag/tag_rel_repo.go         | 67 ++++++++++++++++++++++++-------
 internal/service/tag_common/tag_common.go | 10 +----
 pkg/obj/obj.go                            | 12 ------
 4 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/internal/repo/activity_common/follow.go 
b/internal/repo/activity_common/follow.go
index e1765278..99e5a6e6 100644
--- a/internal/repo/activity_common/follow.go
+++ b/internal/repo/activity_common/follow.go
@@ -188,17 +188,13 @@ func (ar *FollowRepo) MigrateFollowers(ctx 
context.Context, sourceObjectID, targ
 
        _, err = ar.data.DB.Transaction(func(session *xorm.Session) (result 
any, err error) {
                session = session.Context(ctx)
-               // 1. cancel all follows of the source object
+               // 1. delete all follows of the source object
                _, err = session.Table(entity.Activity{}.TableName()).
                        Where(builder.Eq{
                                "object_id":     sourceObjectID,
                                "activity_type": activityType,
                        }).
-                       Cols("cancelled", "cancelled_at").
-                       Update(&entity.Activity{
-                               Cancelled:   entity.ActivityCancelled,
-                               CancelledAt: time.Now(),
-                       })
+                       Delete(&entity.Activity{})
                if err != nil {
                        return nil, 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
                }
@@ -210,10 +206,9 @@ func (ar *FollowRepo) MigrateFollowers(ctx 
context.Context, sourceObjectID, targ
                                "activity_type": activityType,
                        }).
                        And(builder.In("user_id", userIDs)).
-                       Cols("cancelled", "cancelled_at").
+                       Cols("cancelled").
                        Update(&entity.Activity{
-                               Cancelled:   entity.ActivityAvailable,
-                               CancelledAt: time.Now(),
+                               Cancelled: entity.ActivityAvailable,
                        })
                if err != nil {
                        return nil, 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
diff --git a/internal/repo/tag/tag_rel_repo.go 
b/internal/repo/tag/tag_rel_repo.go
index 9b08177a..3634c97a 100644
--- a/internal/repo/tag/tag_rel_repo.go
+++ b/internal/repo/tag/tag_rel_repo.go
@@ -30,7 +30,7 @@ import (
        "github.com/apache/answer/internal/service/unique"
        "github.com/apache/answer/pkg/uid"
        "github.com/segmentfault/pacman/errors"
-       "xorm.io/builder"
+       "xorm.io/xorm"
 )
 
 // tagRelRepo tag rel repository
@@ -206,18 +206,55 @@ func (tr *tagRelRepo) 
GetTagRelDefaultStatusByObjectID(ctx context.Context, obje
 }
 
 // MigrateTagObjects migrate tag objects
-func (tr *tagRelRepo) MigrateTagObjects(ctx context.Context, sourceTagId, 
targetTagId, objectTypePrefix string) error {
-       _, err := tr.data.DB.Context(ctx).
-               Where("tag_id = ?", sourceTagId).
-               And("object_id LIKE ?", objectTypePrefix+"%").
-               And(builder.NotIn(
-                       "object_id", 
builder.Select("object_id").From(entity.TagRel{}.TableName()).
-                               Where(builder.Eq{"tag_id": targetTagId}).
-                               And(builder.Like{"object_id", objectTypePrefix 
+ "%"}),
-               )).
-               Update(&entity.TagRel{TagID: targetTagId})
-       if err != nil {
-               return 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
-       }
-       return nil
+func (tr *tagRelRepo) MigrateTagObjects(ctx context.Context, sourceTagId, 
targetTagId string) error {
+       _, err := tr.data.DB.Transaction(func(session *xorm.Session) (result 
any, err error) {
+               // 1. Get all objects related to source tag
+               var sourceObjects []entity.TagRel
+               err = session.Where("tag_id = ?", 
sourceTagId).Find(&sourceObjects)
+               if err != nil {
+                       return nil, 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
+               }
+
+               // 2. Get existing target tag relations
+               var existingTargets []entity.TagRel
+               err = session.Where("tag_id = ?", 
targetTagId).Find(&existingTargets)
+               if err != nil {
+                       return nil, 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
+               }
+
+               // Create map of existing target objects for quick lookup
+               existingMap := make(map[string]bool)
+               for _, target := range existingTargets {
+                       existingMap[target.ObjectID] = true
+               }
+
+               // 3. Create new relations for objects not already tagged with 
target
+               newRelations := make([]*entity.TagRel, 0)
+               for _, source := range sourceObjects {
+                       if !existingMap[source.ObjectID] {
+                               newRelations = append(newRelations, 
&entity.TagRel{
+                                       TagID:    targetTagId,
+                                       ObjectID: source.ObjectID,
+                                       Status:   source.Status,
+                               })
+                       }
+               }
+
+               if len(newRelations) > 0 {
+                       _, err = session.Insert(newRelations)
+                       if err != nil {
+                               return nil, 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
+                       }
+               }
+
+               // 4. Remove old relations
+               _, err = session.Where("tag_id = ?", 
sourceTagId).Delete(&entity.TagRel{})
+               if err != nil {
+                       return nil, 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
+               }
+
+               return nil, nil
+       })
+
+       return err
 }
diff --git a/internal/service/tag_common/tag_common.go 
b/internal/service/tag_common/tag_common.go
index aecfba42..318eac20 100644
--- a/internal/service/tag_common/tag_common.go
+++ b/internal/service/tag_common/tag_common.go
@@ -35,7 +35,6 @@ import (
        "github.com/apache/answer/internal/service/revision_common"
        "github.com/apache/answer/internal/service/siteinfo_common"
        "github.com/apache/answer/pkg/converter"
-       "github.com/apache/answer/pkg/obj"
        "github.com/segmentfault/pacman/errors"
        "github.com/segmentfault/pacman/log"
 )
@@ -78,7 +77,7 @@ type TagRelRepo interface {
        BatchGetObjectTagRelList(ctx context.Context, objectIds []string) 
(tagListList []*entity.TagRel, err error)
        CountTagRelByTagID(ctx context.Context, tagID string) (count int64, err 
error)
        GetTagRelDefaultStatusByObjectID(ctx context.Context, objectID string) 
(status int, err error)
-       MigrateTagObjects(ctx context.Context, sourceTagId, targetTagId, 
objectTypePrefix string) error
+       MigrateTagObjects(ctx context.Context, sourceTagId, targetTagId string) 
error
 }
 
 // TagCommonService user service
@@ -935,10 +934,5 @@ func (ts *TagCommonService) UpdateTag(ctx context.Context, 
req *schema.UpdateTag
 
 // MigrateTagQuestions migrate tag question
 func (ts *TagCommonService) MigrateTagQuestions(ctx context.Context, 
sourceTagID, targetTagID string) (err error) {
-       questionPrefix, err := 
obj.GetObjectIDPrefixByObjectType(constant.QuestionObjectType)
-       if err != nil {
-               return err
-       }
-
-       return ts.tagRelRepo.MigrateTagObjects(ctx, sourceTagID, targetTagID, 
questionPrefix)
+       return ts.tagRelRepo.MigrateTagObjects(ctx, sourceTagID, targetTagID)
 }
diff --git a/pkg/obj/obj.go b/pkg/obj/obj.go
index 37737d6d..0dc62819 100644
--- a/pkg/obj/obj.go
+++ b/pkg/obj/obj.go
@@ -20,8 +20,6 @@
 package obj
 
 import (
-       "strconv"
-
        "github.com/apache/answer/internal/base/constant"
        "github.com/apache/answer/internal/base/reason"
        "github.com/apache/answer/pkg/converter"
@@ -49,16 +47,6 @@ func GetObjectTypeNumberByObjectID(objectID string) 
(objectTypeNumber int, err e
        return converter.StringToInt(objectID[1:4]), nil
 }
 
-// GetObjectIDPrefixByObjectType get object id prefix by object type
-func GetObjectIDPrefixByObjectType(objectType string) (objectIDPrefix string, 
err error) {
-       objectTypeNumber, ok := constant.ObjectTypeStrMapping[objectType]
-       if !ok {
-               return "", errors.BadRequest(reason.ObjectNotFound)
-       }
-       objectIDPrefixNum := 0b1000 | objectTypeNumber
-       return strconv.FormatUint(uint64(objectIDPrefixNum), 2), nil
-}
-
 func checkObjectID(objectID string) (err error) {
        if len(objectID) < 5 {
                return errors.BadRequest(reason.ObjectNotFound)

Reply via email to