添加搜索后端接口

Change-Id: Ie7d87009f4b71ebdf3fdb30f561d4cf85bc6f416
diff --git a/src/main/java/database/DataManagerInterface.java b/src/main/java/database/DataManagerInterface.java
index 357b81f..b02f4a6 100644
--- a/src/main/java/database/DataManagerInterface.java
+++ b/src/main/java/database/DataManagerInterface.java
@@ -51,6 +51,7 @@
     public int SubmitSeed(String begid,Seed seed);//提交种子,返回状态:0 success,1 重复,2其他原因
     public void SettleBeg();//结算所有求种信息,求种信息中需要增加Beg截止日期,默认14天,期间投票>的则Beg成功,否则Beg失败,并发放对应奖励
 
+    public Post[] SearchPost(String userQ);//传入搜索的关键词或句子,返回搜索到的帖子信息(按照公共字符数量排序)
     public Post[] GetPostList();//获取用户的帖子列表
     public Post GetPost(String postid);//获取一个帖子的详细信息
     public PostReply[] GetPostReplyList(String postid);//获取一个帖子的回复列表
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 580f9e8..b91e471 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -39,15 +39,15 @@
 import entity.config;
 import entity.PostReply;
 import entity.QPostReply;
+import entity.UserInvite;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class Database1 implements DataManagerInterface {
-    @PersistenceContext
-    private final EntityManager entitymanager;
     private static final Logger logger = LoggerFactory.getLogger(Database1.class);
     private EntityManagerFactory emf;
+    
     public Database1() {
         config cfg = new config();
         Map<String,Object> props = new HashMap<>();
@@ -55,9 +55,15 @@
                   "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
         props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
         props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
-        this.entitymanager = Persistence.createEntityManagerFactory("myPersistenceUnit", props).createEntityManager();
-        // this.emf=entitymanager;
+        // 只创建一个 EntityManagerFactory,为每个操作创建新的 EntityManager
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
     }
+    
+    // 为每个操作创建新的 EntityManager 以避免线程安全问题
+    private EntityManager createEntityManager() {
+        return emf.createEntityManager();
+    }
+
     @Override
     public String LoginUser(User userinfo){
         try {
@@ -73,6 +79,7 @@
                 return null;
             }
             
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             User foundUser = null;
@@ -97,14 +104,15 @@
     // 返回状态:0 success,1 邮箱重复,2其他原因
     @Override
     public int RegisterUser(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try{
             // 首先检查该邮箱是否在UserInvite表中被邀请过
-            JPAQuery<String> inviteQuery = new JPAQuery<>(entitymanager);
+            JPAQuery<UserInvite> inviteQuery = new JPAQuery<>(entitymanager);
             QUserInvite ui = QUserInvite.userInvite;
-            List<String> invitedEmails = inviteQuery.select(ui.inviterEmail).from(ui).fetch();
+            List<UserInvite> UserInvites = inviteQuery.select(ui).from(ui).where(ui.inviterEmail.eq(userinfo.email)).fetch();
 
             // 如果邮箱不在被邀请列表中,拒绝注册
-            if(!invitedEmails.contains(userinfo.email)){
+            if(UserInvites.isEmpty()){
                 return 2; // 未被邀请
             }
 
@@ -117,8 +125,23 @@
                 return 1; // 邮箱重复
             }
 
+            UserPT userPT = new UserPT();
+            userPT.userid = userinfo.userid;
+            userPT.magic = 0; // 设置默认值
+            userPT.upload = 0; // 设置默认值
+            userPT.download = 0; // 设置默认值
+            userPT.share = 0.0; // 设置默认值
+            userPT.user = userinfo; // 设置关联关系
+            userPT.farmurl = ""; // 设置默认值
+            userPT.viptime = 0; // 设置默认值
+
             entitymanager.getTransaction().begin();
             entitymanager.persist(userinfo);
+            entitymanager.persist(userPT);
+            // 删除所有匹配的邀请记录
+            for (UserInvite invite : UserInvites) {
+                entitymanager.remove(invite);
+            }
             entitymanager.getTransaction().commit();
             return 0; // 注册成功
 
@@ -135,11 +158,12 @@
     // 返回状态:0 success,1 不存在,2其他原因
     @Override
     public int UpdateInformation(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
-            
+
             entitymanager.getTransaction().begin();
             
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
@@ -177,6 +201,7 @@
     // 返回用户的全部基本信息
     @Override
     public User GetInformation(String userid){
+        EntityManager entitymanager = createEntityManager();
         User user = entitymanager.find(User.class, userid);
         return user;
     }
@@ -184,6 +209,7 @@
     //返回用户的全部pt站信息
     @Override
     public UserPT GetInformationPT(String userid){
+        EntityManager entitymanager = createEntityManager();
         UserPT userPT = entitymanager.find(UserPT.class, userid);
         return userPT;
     }
@@ -192,6 +218,7 @@
     @Override
     public int UpdateInformationPT(UserPT userinfo){
         try{
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
             QUserPT u = QUserPT.userPT;
             UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
@@ -212,6 +239,7 @@
     //返回状态:0 success,1 id重复,2其他原因
     @Override
     public int RegisterUserPT(UserPT userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             
@@ -238,30 +266,58 @@
     //返回种子的全部信息
     @Override
     public Seed GetSeedInformation(String seedid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
-        return seed;
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
+            Seed seed = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedid.eq(seedid)).fetchOne();
+            return seed;
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByTag(String tag){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seedtag.eq(tag)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedtag.eq(tag)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByUser(String userid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seeduserid.eq(userid)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seeduserid.eq(userid)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public int DeleteSeed(String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             Seed seed = entitymanager.find(Seed.class, seedid);
@@ -284,6 +340,7 @@
     //添加一个新的种子,0成功,其他失败信息待定;
     @Override
     public int RegisterSeed(Seed seedinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
@@ -315,6 +372,7 @@
     @Override
     public int UpdateSeed(Seed seedinfo){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
@@ -333,28 +391,37 @@
     //传入搜索的关键词或句子,返回搜索到的种子信息(按照公共字符数量排序)
     @Override
     public Seed[] SearchSeed(String userQ){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).fetch();
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象,避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .fetch();
 
-        if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+            if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+                return seeds.toArray(new Seed[0]);
+            }
+
+            String processedQuery = userQ.toLowerCase().trim();
+            Map<Seed, Integer> seedCountMap = new HashMap<>();
+            for(Seed seed : seeds){
+                String title = seed.title.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                seedCountMap.put(seed, count);
+            }
+            seeds.sort((s1, s2) -> {
+                int count1 = seedCountMap.getOrDefault(s1, 0);
+                int count2 = seedCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
         }
-
-        String processedQuery = userQ.toLowerCase().trim();
-        Map<Seed, Integer> seedCountMap = new HashMap<>();
-        for(Seed seed : seeds){
-            String title = seed.title.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            seedCountMap.put(seed, count);
-        }
-        seeds.sort((s1, s2) -> {
-            int count1 = seedCountMap.getOrDefault(s1, 0);
-            int count2 = seedCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return seeds.toArray(new Seed[0]);
     }
 
     //计算字符串公共字符数量
@@ -388,6 +455,7 @@
     @Override
     public int AddNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
             QNotice n = QNotice.notice;
             Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
@@ -408,6 +476,7 @@
     @Override
     public boolean UpdateNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
             if (oldNotice == null) {
                 return false;
@@ -425,6 +494,7 @@
     @Override
     public boolean DeleteNotice(String noticeid){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice notice = entitymanager.find(Notice.class, noticeid);
             if (notice == null) {
                 return false;
@@ -441,6 +511,7 @@
     //获取用户的剩余邀请次数
     public int GetUserAvailableInviteTimes(String userid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
@@ -457,6 +528,7 @@
     @Override
     public int InviteUser(String inviterid,String inviteemail){
         try {
+            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -477,6 +549,7 @@
     //添加一个收藏,返回状态:0 success,1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
         QUser u2 = QUser.user;
         User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
@@ -507,6 +580,7 @@
     @Override
     public boolean DeleteCollect(String userid,String seedid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
@@ -532,6 +606,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -577,6 +652,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -619,6 +695,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -657,6 +734,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -717,6 +795,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -771,6 +850,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -844,6 +924,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -894,6 +975,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -1426,6 +1508,7 @@
 
     @Override
     public Post[] GetPostList() {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         List<Post> posts = query.select(p).from(p).fetch();
@@ -1434,6 +1517,7 @@
 
     @Override
     public Post GetPost(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
@@ -1442,10 +1526,38 @@
 
     @Override
     public PostReply[] GetPostReplyList(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
         QPostReply p = QPostReply.postReply;
         List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
         return replies.toArray(new PostReply[0]);
     }
+
+    @Override
+    public Post[] SearchPost(String postQ) {
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+        QPost p = QPost.post;
+        List<Post> posts = query.select(p).from(p).fetch();
+
+        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            return posts.toArray(new Post[0]);
+        }
+
+        String processedQuery = postQ.toLowerCase().trim();
+        Map<Post, Integer> postCountMap = new HashMap<>();
+        for(Post post : posts){
+            String title = post.posttitle.toLowerCase().trim();
+            int count = countCommonCharacter(processedQuery, title);
+            postCountMap.put(post, count);
+        }
+        posts.sort((s1, s2) -> {
+            int count1 = postCountMap.getOrDefault(s1, 0);
+            int count2 = postCountMap.getOrDefault(s2, 0);
+            return Integer.compare(count2, count1);
+        });
+
+        return posts.toArray(new Post[0]);
+    }
 }
 
diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index d7c5eee..0166081 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -1116,4 +1116,9 @@
     public PostReply[] GetPostReplyList(String postid) {
         return null;
     }
+
+    @Override
+    public Post[] SearchPost(String userQ) {
+        return null;
+    }
 }
\ No newline at end of file