From 200ee527259ece527a5adac855c0bf30600c9b52 Mon Sep 17 00:00:00 2001 From: mochizuki <1p41p4jejo@gmail.com> Date: Fri, 7 Apr 2023 02:14:27 +0800 Subject: [PATCH 1/3] feat: add basic search repository for org, person, place and tag --- .../search/OrganizationSearchRepository.java | 42 +++++++++++++++++++ .../search/PersonSearchRepository.java | 42 +++++++++++++++++++ .../search/PlaceSearchRepository.java | 42 +++++++++++++++++++ .../search/TagSearchRepository.java | 42 +++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 src/main/java/io/charkchalk/backend/repository/search/OrganizationSearchRepository.java create mode 100644 src/main/java/io/charkchalk/backend/repository/search/PersonSearchRepository.java create mode 100644 src/main/java/io/charkchalk/backend/repository/search/PlaceSearchRepository.java create mode 100644 src/main/java/io/charkchalk/backend/repository/search/TagSearchRepository.java diff --git a/src/main/java/io/charkchalk/backend/repository/search/OrganizationSearchRepository.java b/src/main/java/io/charkchalk/backend/repository/search/OrganizationSearchRepository.java new file mode 100644 index 0000000..f024e5a --- /dev/null +++ b/src/main/java/io/charkchalk/backend/repository/search/OrganizationSearchRepository.java @@ -0,0 +1,42 @@ +package io.charkchalk.backend.repository.search; + +import io.charkchalk.backend.entity.Organization; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import java.util.List; + +@Repository +public class OrganizationSearchRepository { + + @Autowired + private EntityManager entityManager; + + public Page searchKeyword(String searchName, Pageable pageable) { + String[] searchNameArray = searchName.split(" "); + + StringBuilder queryString = new StringBuilder("SELECT o FROM Organization o WHERE "); + for (int i = 0; i < searchNameArray.length; i++) { + queryString.append("o.name LIKE :name").append(i); + if (i != searchNameArray.length - 1) { + queryString.append(" AND "); + } + } + + TypedQuery query = entityManager.createQuery(queryString.toString(), Organization.class); + for (int i = 0; i < searchNameArray.length; i++) { + query.setParameter("name" + i, "%" + searchNameArray[i] + "%"); + } + + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + + List organizations = query.getResultList(); + return new PageImpl<>(organizations, pageable, organizations.size()); + } +} diff --git a/src/main/java/io/charkchalk/backend/repository/search/PersonSearchRepository.java b/src/main/java/io/charkchalk/backend/repository/search/PersonSearchRepository.java new file mode 100644 index 0000000..a355968 --- /dev/null +++ b/src/main/java/io/charkchalk/backend/repository/search/PersonSearchRepository.java @@ -0,0 +1,42 @@ +package io.charkchalk.backend.repository.search; + +import io.charkchalk.backend.entity.Person; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import java.util.List; + +@Repository +public class PersonSearchRepository { + + @Autowired + private EntityManager entityManager; + + public Page searchKeyword(String searchName, Pageable pageable) { + String[] searchNameArray = searchName.split(" "); + + StringBuilder queryString = new StringBuilder("SELECT p FROM Person p WHERE "); + for (int i = 0; i < searchNameArray.length; i++) { + queryString.append("p.name LIKE :name").append(i); + if (i != searchNameArray.length - 1) { + queryString.append(" AND "); + } + } + + TypedQuery query = entityManager.createQuery(queryString.toString(), Person.class); + for (int i = 0; i < searchNameArray.length; i++) { + query.setParameter("name" + i, "%" + searchNameArray[i] + "%"); + } + + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + + List persons = query.getResultList(); + return new PageImpl<>(persons, pageable, persons.size()); + } +} diff --git a/src/main/java/io/charkchalk/backend/repository/search/PlaceSearchRepository.java b/src/main/java/io/charkchalk/backend/repository/search/PlaceSearchRepository.java new file mode 100644 index 0000000..bf38f46 --- /dev/null +++ b/src/main/java/io/charkchalk/backend/repository/search/PlaceSearchRepository.java @@ -0,0 +1,42 @@ +package io.charkchalk.backend.repository.search; + +import io.charkchalk.backend.entity.Place; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import java.util.List; + +@Repository +public class PlaceSearchRepository { + + @Autowired + private EntityManager entityManager; + + public Page searchKeyword(String searchName, Pageable pageable) { + String[] searchNameArray = searchName.split(" "); + + StringBuilder queryString = new StringBuilder("SELECT p FROM Place p WHERE "); + for (int i = 0; i < searchNameArray.length; i++) { + queryString.append("p.name LIKE :name").append(i); + if (i != searchNameArray.length - 1) { + queryString.append(" AND "); + } + } + + TypedQuery query = entityManager.createQuery(queryString.toString(), Place.class); + for (int i = 0; i < searchNameArray.length; i++) { + query.setParameter("name" + i, "%" + searchNameArray[i] + "%"); + } + + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + + List places = query.getResultList(); + return new PageImpl<>(places, pageable, places.size()); + } +} diff --git a/src/main/java/io/charkchalk/backend/repository/search/TagSearchRepository.java b/src/main/java/io/charkchalk/backend/repository/search/TagSearchRepository.java new file mode 100644 index 0000000..e7fa316 --- /dev/null +++ b/src/main/java/io/charkchalk/backend/repository/search/TagSearchRepository.java @@ -0,0 +1,42 @@ +package io.charkchalk.backend.repository.search; + +import io.charkchalk.backend.entity.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import java.util.List; + +@Repository +public class TagSearchRepository { + + @Autowired + private EntityManager entityManager; + + public Page searchKeyword(String searchName, Pageable pageable) { + String[] searchNameArray = searchName.split(" "); + + StringBuilder queryString = new StringBuilder("SELECT t FROM Tag t WHERE "); + for (int i = 0; i < searchNameArray.length; i++) { + queryString.append("t.name LIKE :name").append(i); + if (i != searchNameArray.length - 1) { + queryString.append(" AND "); + } + } + + TypedQuery query = entityManager.createQuery(queryString.toString(), Tag.class); + for (int i = 0; i < searchNameArray.length; i++) { + query.setParameter("name" + i, "%" + searchNameArray[i] + "%"); + } + + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + + List tags = query.getResultList(); + return new PageImpl<>(tags, pageable, tags.size()); + } +} From ea47ccdd74f53fe2b2e585dcde3ca80d6074061f Mon Sep 17 00:00:00 2001 From: mochizuki <1p41p4jejo@gmail.com> Date: Fri, 7 Apr 2023 02:14:55 +0800 Subject: [PATCH 2/3] feat: add basic search controller --- .../search/basic/BasicSearchController.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java diff --git a/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java b/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java new file mode 100644 index 0000000..4901584 --- /dev/null +++ b/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java @@ -0,0 +1,82 @@ +package io.charkchalk.backend.service.search.basic; + +import io.charkchalk.backend.entity.Organization; +import io.charkchalk.backend.entity.Tag; +import io.charkchalk.backend.json.PageJson; +import io.charkchalk.backend.json.organization.OrganizationConverter; +import io.charkchalk.backend.json.organization.OrganizationJson; +import io.charkchalk.backend.json.person.PersonConverter; +import io.charkchalk.backend.json.person.PersonJson; +import io.charkchalk.backend.json.place.PlaceConverter; +import io.charkchalk.backend.json.place.PlaceJson; +import io.charkchalk.backend.json.tag.TagConverter; +import io.charkchalk.backend.json.tag.TagJson; +import io.charkchalk.backend.repository.search.OrganizationSearchRepository; +import io.charkchalk.backend.repository.search.PersonSearchRepository; +import io.charkchalk.backend.repository.search.PlaceSearchRepository; +import io.charkchalk.backend.repository.search.TagSearchRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +@Validated +@RestController +public class BasicSearchController { + + @Autowired + private TagSearchRepository tagSearchRepository; + + @Autowired + private OrganizationSearchRepository organizationSearchRepository; + + @Autowired + private PersonSearchRepository personSearchRepository; + + @Autowired + private PlaceSearchRepository placeSearchRepository; + + @Autowired + private TagConverter tagConverter; + + @Autowired + private OrganizationConverter organizationConverter; + + @Autowired + private PersonConverter personConverter; + + @Autowired + private PlaceConverter placeConverter; + + @GetMapping("/api/search/basic/tag/{name}") + public ResponseEntity> getTag(@PathVariable @NotNull String name, Pageable pageable) { + TagConverter.checkPageable(pageable); + Page tagPage = tagSearchRepository.searchKeyword(name, pageable); + return ResponseEntity.ok(tagConverter.convertToPageJson(tagPage)); + } + + @GetMapping("/api/search/basic/organization/{name}") + public ResponseEntity> getOrganization(@PathVariable @NotNull String name, Pageable pageable) { + TagConverter.checkPageable(pageable); + Page organizationPage = organizationSearchRepository.searchKeyword(name, pageable); + return ResponseEntity.ok(organizationConverter.convertToPageJson(organizationPage)); + } + + @GetMapping("/api/search/basic/person/{name}") + public ResponseEntity> getPerson(@PathVariable @NotNull String name, Pageable pageable) { + TagConverter.checkPageable(pageable); + Page personPage = personSearchRepository.searchKeyword(name, pageable); + return ResponseEntity.ok(personConverter.convertToPageJson(personPage)); + } + + @GetMapping("/api/search/basic/place/{name}") + public ResponseEntity> getPlace(@PathVariable @NotNull String name, Pageable pageable) { + TagConverter.checkPageable(pageable); + Page placePage = placeSearchRepository.searchKeyword(name, pageable); + return ResponseEntity.ok(placeConverter.convertToPageJson(placePage)); + } +} From 13d25967a0def97c3dda3ca054eaa72334639048 Mon Sep 17 00:00:00 2001 From: mochizuki <1p41p4jejo@gmail.com> Date: Fri, 7 Apr 2023 02:19:31 +0800 Subject: [PATCH 3/3] style: fix coding style issues --- .../backend/service/search/basic/BasicSearchController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java b/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java index 4901584..682a81c 100644 --- a/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java +++ b/src/main/java/io/charkchalk/backend/service/search/basic/BasicSearchController.java @@ -60,7 +60,8 @@ public ResponseEntity> getTag(@PathVariable @NotNull String na } @GetMapping("/api/search/basic/organization/{name}") - public ResponseEntity> getOrganization(@PathVariable @NotNull String name, Pageable pageable) { + public ResponseEntity> getOrganization(@PathVariable @NotNull String name, + Pageable pageable) { TagConverter.checkPageable(pageable); Page organizationPage = organizationSearchRepository.searchKeyword(name, pageable); return ResponseEntity.ok(organizationConverter.convertToPageJson(organizationPage));