添加搜索后端接口
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