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)