添加搜索后端接口

Change-Id: Ie7d87009f4b71ebdf3fdb30f561d4cf85bc6f416
diff --git a/src/main/java/api/ApiController.java b/src/main/java/api/ApiController.java
index 326255d..c2562bc 100644
--- a/src/main/java/api/ApiController.java
+++ b/src/main/java/api/ApiController.java
@@ -27,6 +27,7 @@
 import entity.User;
 import entity.Post;
 import entity.PostReply;
+import entity.UserPT;
 
 import java.util.UUID;
 
@@ -548,7 +549,6 @@
             // 添加 replies 数组
             com.fasterxml.jackson.databind.node.ArrayNode repliesArray = mapper.createArrayNode();
             if (replies != null) {
-                System.out.println("Replies count: " + replies.length);
                 for (PostReply reply : replies) {
                     com.fasterxml.jackson.databind.node.ObjectNode replyJson = mapper.createObjectNode();
                     replyJson.put("replyid", reply.replyid);
@@ -602,7 +602,6 @@
         @RequestBody String requestBody
     ) {
         try {
-            System.out.println("Add reply request body: " + requestBody);
             // 解析 JSON 数据
             com.fasterxml.jackson.databind.JsonNode jsonNode = mapper.readTree(requestBody);
             com.fasterxml.jackson.databind.JsonNode postidNode = jsonNode.get("postid");
@@ -617,10 +616,6 @@
             String authorid = authoridNode.asText();
             String content = contentNode.asText();
 
-            System.out.println("Post ID: " + postid);
-            System.out.println("Author ID: " + authorid);
-            System.out.println("Content: " + content);
-
             // 参数验证
             if (postid == null || postid.trim().isEmpty() || 
                 authorid == null || authorid.trim().isEmpty() || 
@@ -629,7 +624,6 @@
             }
             
             int ret = db1.AddComment(postid, authorid, content);
-            System.out.println("Add comment result: " + ret);
             if (ret == 0) {
                 return new ResponseEntity<>(0, HttpStatus.OK); // 返回 0 表示成功
             } else {
@@ -649,20 +643,74 @@
         @RequestParam("tag") String tag,
         @RequestParam("keyword") String query
     ) {
-        return null;
-    //     try {
-    //         Seed[] seeds = db1.SearchSeeds(query);
-    //         if (seeds == null || seeds.length == 0) {
-    //             return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 404 表示未找到种子
-    //         }
-    //         String json = mapper.writeValueAsString(seeds);
-    //         return new ResponseEntity<>(json, headers, HttpStatus.OK);
-    //     } catch (JsonProcessingException e) {
-    //         e.printStackTrace();
-    //         return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
-    //     } catch (Exception e) {
-    //         e.printStackTrace();
-    //         return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
-    //     }
+        try {
+            Seed[] seeds = db1.SearchSeed(query);
+            if (seeds == null || seeds.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到种子
+            }
+            
+            // 过滤掉与前端要求tag不同的种子
+            java.util.List<Seed> filteredSeeds = new java.util.ArrayList<>();
+            for (Seed seed : seeds) {
+                if (seed.seedtag != null && seed.seedtag.equals(tag)) {
+                    filteredSeeds.add(seed);
+                }
+            }
+            
+            // 如果过滤后没有匹配的种子,返回空数组
+            if (filteredSeeds.isEmpty()) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND);
+            }
+            
+            Seed[] filteredSeedsArray = filteredSeeds.toArray(new Seed[0]);
+            String json = mapper.writeValueAsString(filteredSeedsArray);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> searchPosts(
+        @RequestParam("keyword") String query
+    ) {
+        try {
+            Post[] posts = db1.SearchPost(query);
+            if (posts == null || posts.length == 0) {
+                return new ResponseEntity<>("[]", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到帖子
+            }
+            String json = mapper.writeValueAsString(posts);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("[]", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    @Override
+    public ResponseEntity<String> getUserPT(
+        @RequestParam("userid") String userid
+    ) {
+        try {
+            UserPT userPT = db1.GetInformationPT(userid);
+            if (userPT == null) {
+                return new ResponseEntity<>("", errorHeaders, HttpStatus.NOT_FOUND); // 返回 404 表示未找到用户PT信息
+            }
+            String json = mapper.writeValueAsString(userPT);
+            return new ResponseEntity<>(json, headers, HttpStatus.OK);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ResponseEntity<>("", errorHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
+        }
     }
 }
\ No newline at end of file
diff --git a/src/main/java/api/ApiInterface.java b/src/main/java/api/ApiInterface.java
index d2e804b..2d79fa7 100644
--- a/src/main/java/api/ApiInterface.java
+++ b/src/main/java/api/ApiInterface.java
@@ -91,4 +91,14 @@
         @RequestParam("tag") String tag,
         @RequestParam("keyword") String query
     );
+
+    @GetMapping("/search-posts")
+    ResponseEntity<String> searchPosts(
+        @RequestParam("keyword") String query
+    );
+
+    @GetMapping("/get-userpt")
+    ResponseEntity<String> getUserPT(
+        @RequestParam("userid") String userid
+    );
 }
\ No newline at end of file
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