Commit 4ac1f264 by 段启岩

优化更新引用逻辑

parent 125f68a1
......@@ -16,6 +16,7 @@ import cn.meteor.beyondclouds.modules.tag.entity.Tag;
import cn.meteor.beyondclouds.modules.tag.service.ITagService;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.entity.TopicReference;
import cn.meteor.beyondclouds.modules.topic.enums.TopicReferenceType;
import cn.meteor.beyondclouds.modules.topic.service.ITopicReferenceService;
import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import cn.meteor.beyondclouds.modules.user.entity.User;
......@@ -127,43 +128,8 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
blogExt.setContent(content);
blogExtService.save(blogExt);
//4.判断是否引用话题
if (!CollectionUtils.isEmpty(topicIds)) {
// 获取要引用的话题,不正确的话题ID会被自动过滤
List<Topic> topicList = topicService.listByIds(topicIds);
List<String> existsTopicIds = topicList.stream().map(Topic::getTopicId).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(existsTopicIds)) {
List<TopicReference> topicReferenceList = new ArrayList<>();
for (String topicId : existsTopicIds) {
TopicReference topicReference = new TopicReference();
topicReference.setTopicId(topicId);
topicReference.setReferencerId(blog.getBlogId());
topicReference.setReferencerType(0);
topicReferenceList.add(topicReference);
}
// 批量保存
topicReferenceService.saveBatch(topicReferenceList);
// 更新话题引用次数
existsTopicIds.forEach(topicId -> {
topicService.increaseReferenceCount(topicId, 1);
});
}
}
//5.判断是否引用标签
if (!CollectionUtils.isEmpty(tagIds)) {
List<String> existsTagIds = tagService.listByIds(tagIds).stream().map(Tag::getTagId).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(existsTagIds)) {
List<BlogTag> blogTagList = new ArrayList<>();
for (String tagId : existsTagIds) {
BlogTag blogTag = new BlogTag();
blogTag.setBlogId(blog.getBlogId());
blogTag.setTagId(tagId);
blogTagList.add(blogTag);
}
blogTagService.saveBatch(blogTagList);
}
}
//4.更新标签和话题的引用
updateTopicAndTagReference(topicIds, tagIds, blog.getBlogId(), false);
}
/**
......@@ -373,25 +339,45 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
blogExtService.update(blogExt,blogExtQueryWrapper);
}
//4.判断是否引用话题
//4.更新标签和话题的引用
updateTopicAndTagReference(topicIds, tagIds, blog.getBlogId(), true);
}
// 添加新话题引用
/**
* 更新博客里面对标签和话题的引用
* @param tagIds
* @param topicIds
* @param blogId
* @param deleteOld
*/
private void updateTopicAndTagReference(List<String> topicIds, List<String> tagIds, String blogId, boolean deleteOld) {
// 1.处理话题引用
if (!CollectionUtils.isEmpty(topicIds)) {
// 获取要引用的话题,不正确的话题ID会被自动过滤
List<Topic> topicList = topicService.listByIds(topicIds);
List<String> existsTopicIds = topicList.stream().map(Topic::getTopicId).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(existsTopicIds)) {
// 删除旧话题引用
if (deleteOld) {
// 删除旧话题引用并更新话题的引用量
QueryWrapper<TopicReference> topicReferenceQueryWrapper = new QueryWrapper<>();
topicReferenceQueryWrapper.eq("referencer_id", blog.getBlogId());
topicReferenceQueryWrapper.eq("referencer_id", blogId);
// 减少对应话题的引用数量
List<String> referencedTopicIds =
topicReferenceService.list(topicReferenceQueryWrapper).stream()
.map(TopicReference::getTopicId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(referencedTopicIds)) {
topicService.decreaseReferenceCountBatch(referencedTopicIds, 1);
}
topicReferenceService.remove(topicReferenceQueryWrapper);
}
List<TopicReference> topicReferenceList = new ArrayList<>();
for (String topicId : existsTopicIds) {
TopicReference topicReference = new TopicReference();
topicReference.setTopicId(topicId);
topicReference.setReferencerId(blog.getBlogId());
topicReference.setReferencerType(0);
topicReference.setReferencerId(blogId);
topicReference.setReferencerType(TopicReferenceType.BLOG_REFERENCE.getType());
topicReferenceList.add(topicReference);
}
// 批量保存
......@@ -403,29 +389,35 @@ public class BlogServiceImpl extends ServiceImpl<BlogMapper, Blog> implements IB
}
}
//5.判断是否引用标签
// 添加新标签
// 2.处理标签引用
if (!CollectionUtils.isEmpty(tagIds)) {
List<String> existsTagIds = tagService.listByIds(tagIds).stream().map(Tag::getTagId).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(existsTagIds)) {
// 删除旧标签
if (deleteOld) {
// 删除旧标签引用并更新标签的引用量
QueryWrapper<BlogTag> blogTagQueryWrapper = new QueryWrapper<>();
blogTagQueryWrapper.eq("blog_id", blog.getBlogId());
blogTagQueryWrapper.eq("blog_id", blogId);
// 减少对应话题的引用数量
List<String> referencedTagIds =
blogTagService.list(blogTagQueryWrapper).stream()
.map(BlogTag::getTagId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(referencedTagIds)) {
tagService.decreaseReferenceCountBatch(referencedTagIds, 1);
}
blogTagService.remove(blogTagQueryWrapper);
}
List<BlogTag> blogTagList = new ArrayList<>();
for (String tagId : existsTagIds) {
BlogTag blogTag = new BlogTag();
blogTag.setBlogId(blog.getBlogId());
blogTag.setBlogId(blogId);
blogTag.setTagId(tagId);
blogTagList.add(blogTag);
}
blogTagService.saveBatch(blogTagList);
}
}
}
@Override
......
......@@ -5,6 +5,8 @@ import cn.meteor.beyondclouds.modules.tag.exception.TagServiceException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
/**
* <p>
* 标签表 服务类
......@@ -49,4 +51,33 @@ public interface ITagService extends IService<Tag> {
* @return
*/
IPage<Tag> getHotPage(Integer pageNumber, Integer pageSize);
/**
* 增加标签引用次数
* @param tagId
* @param count
*/
void increaseReferenceCount(String tagId, int count);
/**
* 批量增加标签引用次数
* @param tagIds
* @param count
*/
void increaseReferenceCountBatch(Collection<String> tagIds, int count);
/**
* 减少标签引用次数
* @param tagId
* @param count
*/
void decreaseReferenceCount(String tagId, int count);
/**
* 批量减少标签引用次数
* @param tagIds
* @param count
*/
void decreaseReferenceCountBatch(Collection<String> tagIds, int count);
}
......@@ -5,14 +5,16 @@ import cn.meteor.beyondclouds.modules.tag.enums.TagErrorCode;
import cn.meteor.beyondclouds.modules.tag.exception.TagServiceException;
import cn.meteor.beyondclouds.modules.tag.mapper.TagMapper;
import cn.meteor.beyondclouds.modules.tag.service.ITagService;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
/**
* <p>
* 标签表 服务实现类
......@@ -87,4 +89,36 @@ public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements ITagS
return page(page,tagHotQueryWrapper);
}
@Override
public void increaseReferenceCount(String tagId, int count) {
UpdateWrapper<Tag> tagUpdateWrapper = new UpdateWrapper<>();
tagUpdateWrapper.eq("tag_id", tagId);
tagUpdateWrapper.setSql("reference_count=reference_count + " + count);
update(tagUpdateWrapper);
}
@Override
public void increaseReferenceCountBatch(Collection<String> tagIds, int count) {
UpdateWrapper<Tag> tagUpdateWrapper = new UpdateWrapper<>();
tagUpdateWrapper.in("tag_id", tagIds);
tagUpdateWrapper.setSql("reference_count=reference_count + " + count);
update(tagUpdateWrapper);
}
@Override
public void decreaseReferenceCount(String tagId, int count) {
UpdateWrapper<Tag> tagUpdateWrapper = new UpdateWrapper<>();
tagUpdateWrapper.eq("tag_id", tagId);
tagUpdateWrapper.setSql("reference_count=reference_count - " + count);
update(tagUpdateWrapper);
}
@Override
public void decreaseReferenceCountBatch(Collection<String> tagIds, int count) {
UpdateWrapper<Tag> tagUpdateWrapper = new UpdateWrapper<>();
tagUpdateWrapper.in("tag_id", tagIds);
tagUpdateWrapper.setSql("reference_count=reference_count - " + count);
update(tagUpdateWrapper);
}
}
package cn.meteor.beyondclouds.modules.topic.enums;
import lombok.Getter;
/**
* 话题引用类型
* @author meteor
*/
@Getter
public enum TopicReferenceType {
BLOG_REFERENCE(0),
PROJECT_REFERENCE(1),
QUESTION_REFERENCE(2),
POST_REFERENCE(3)
;
private int type;
TopicReferenceType(int type) {
this.type = type;
}
}
package cn.meteor.beyondclouds.modules.topic.service;
import cn.meteor.beyondclouds.modules.tag.exception.TagServiceException;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.exception.TopicServiceException;
import cn.meteor.beyondclouds.modules.user.entity.User;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
/**
* <p>
* 话题表 服务类
......@@ -90,6 +91,27 @@ public interface ITopicService extends IService<Topic> {
void increaseReferenceCount(String topicId, int count);
/**
* 批量增加话题引用次数
* @param topicIds
* @param count
*/
void increaseReferenceCountBatch(Collection<String> topicIds, int count);
/**
* 减少话题引用次数
* @param topicId
* @param count
*/
void decreaseReferenceCount(String topicId, int count);
/**
* 批量减少话题引用次数
* @param topicIds
* @param count
*/
void decreaseReferenceCountBatch(Collection<String> topicIds, int count);
/**
* 取消关注话题
* @param userId
* @param topicId
......
package cn.meteor.beyondclouds.modules.topic.service.impl;
import cn.meteor.beyondclouds.modules.tag.exception.TagServiceException;
import cn.meteor.beyondclouds.modules.topic.entity.Topic;
import cn.meteor.beyondclouds.modules.topic.entity.TopicFollow;
import cn.meteor.beyondclouds.modules.topic.enums.TopicErrorCode;
......@@ -11,12 +10,14 @@ import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.service.IUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
......@@ -195,11 +196,34 @@ public class TopicServiceImpl extends ServiceImpl<TopicMapper, Topic> implements
@Override
public void increaseReferenceCount(String topicId, int count) {
Topic topic = getById(topicId);
if (null != topic) {
topic.setReferenceCount(topic.getReferenceCount() + count);
updateById(topic);
UpdateWrapper<Topic> topicUpdateWrapper = new UpdateWrapper<>();
topicUpdateWrapper.eq("topic_id", topicId);
topicUpdateWrapper.setSql("reference_count=reference_count + " + count);
update(topicUpdateWrapper);
}
@Override
public void increaseReferenceCountBatch(Collection<String> topicIds, int count) {
UpdateWrapper<Topic> topicUpdateWrapper = new UpdateWrapper<>();
topicUpdateWrapper.in("topic_id", topicIds);
topicUpdateWrapper.setSql("reference_count=reference_count + " + count);
update(topicUpdateWrapper);
}
@Override
public void decreaseReferenceCount(String topicId, int count) {
UpdateWrapper<Topic> topicUpdateWrapper = new UpdateWrapper<>();
topicUpdateWrapper.eq("topic_id", topicId);
topicUpdateWrapper.setSql("reference_count=reference_count - " + count);
update(topicUpdateWrapper);
}
@Override
public void decreaseReferenceCountBatch(Collection<String> topicIds, int count) {
UpdateWrapper<Topic> topicUpdateWrapper = new UpdateWrapper<>();
topicUpdateWrapper.in("topic_id", topicIds);
topicUpdateWrapper.setSql("reference_count=reference_count - " + count);
update(topicUpdateWrapper);
}
@Override
......
package cn.meteor.beyondclouds.modules.tag.service.impl;
import cn.meteor.beyondclouds.modules.tag.service.ITagService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TagServiceImplTest {
@Autowired
private ITagService tagService;
@Test
public void increaseReferenceCount() {
tagService.increaseReferenceCount("0718c0c591eb6c957b9c8691e808538e", 2);
}
@Test
public void increaseReferenceCountBatch() {
tagService.increaseReferenceCountBatch(List.of("0718c0c591eb6c957b9c8691e808538e", "32eb229153d0f2b8919a1e0442e15146"), 2);
}
@Test
public void decreaseReferenceCount() {
tagService.decreaseReferenceCount("0718c0c591eb6c957b9c8691e808538e", 2);
}
@Test
public void decreaseReferenceCountBatch() {
tagService.decreaseReferenceCountBatch(List.of("0718c0c591eb6c957b9c8691e808538e", "32eb229153d0f2b8919a1e0442e15146"), 2);
}
}
\ No newline at end of file
package cn.meteor.beyondclouds.modules.topic.service.impl;
import cn.meteor.beyondclouds.modules.topic.service.ITopicService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TopicServiceImplTest {
@Autowired
private ITopicService topicService;
@Test
public void increaseReferenceCount() {
topicService.increaseReferenceCount("229d7edbbe76badb0937238dc168c329", 2);
}
@Test
public void increaseReferenceCountBatch() {
topicService.increaseReferenceCountBatch(List.of("229d7edbbe76badb0937238dc168c329", "32d0053d77e27fecbad5928c66ff617f"), 2);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment