From 8c7776599adb02e66fa8c86f12c246a7f48527df Mon Sep 17 00:00:00 2001
From: dnokov <dnokov1997@gmail.com>
Date: Wed, 22 Nov 2023 20:54:33 +0200
Subject: [PATCH] Adding JDBC implementations for methods

Adding JDBC implementation for findPetTypeByName and findSpecialtiesByName along with respective unit tests
---
 .../jdbc/JdbcPetTypeRepositoryImpl.java       | 24 ++++++++++---
 .../jdbc/JdbcSpecialtyRepositoryImpl.java     | 29 +++++++++++----
 .../AbstractClinicServiceTests.java           | 36 ++++++++++++++++++-
 3 files changed, 78 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java
index ee958432..1835cb71 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetTypeRepositoryImpl.java
@@ -47,11 +47,11 @@ import org.springframework.stereotype.Repository;
 @Repository
 @Profile("jdbc")
 public class JdbcPetTypeRepositoryImpl implements PetTypeRepository {
-	
+
 	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
-	
+
 	private SimpleJdbcInsert insertPetType;
-	
+
 	@Autowired
 	public JdbcPetTypeRepositoryImpl(DataSource dataSource) {
 		this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
@@ -76,7 +76,23 @@ public class JdbcPetTypeRepositoryImpl implements PetTypeRepository {
         return petType;
 	}
 
-	@Override
+    @Override
+    public PetType findByName(String name) throws DataAccessException {
+        PetType petType;
+        try {
+            Map<String, Object> params = new HashMap<>();
+            params.put("name", name);
+            petType = this.namedParameterJdbcTemplate.queryForObject(
+                "SELECT id, name FROM types WHERE name= :name",
+                params,
+                BeanPropertyRowMapper.newInstance(PetType.class));
+        } catch (EmptyResultDataAccessException ex) {
+            throw new ObjectRetrievalFailureException(PetType.class, name);
+        }
+        return petType;
+    }
+
+    @Override
 	public Collection<PetType> findAll() throws DataAccessException {
 		Map<String, Object> params = new HashMap<>();
         return this.namedParameterJdbcTemplate.query(
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java
index 5042cd0e..256f34d1 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcSpecialtyRepositoryImpl.java
@@ -16,12 +16,11 @@
 
 package org.springframework.samples.petclinic.repository.jdbc;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import javax.sql.DataSource;
 
+import io.micrometer.core.instrument.binder.db.MetricsDSLContext;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Profile;
 import org.springframework.dao.DataAccessException;
@@ -43,9 +42,9 @@ import org.springframework.stereotype.Repository;
 @Repository
 @Profile("jdbc")
 public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository {
-	
+
 	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
-	
+
 	private SimpleJdbcInsert insertSpecialty;
 
 	@Autowired
@@ -72,7 +71,25 @@ public class JdbcSpecialtyRepositoryImpl implements SpecialtyRepository {
         return specialty;
 	}
 
-	@Override
+    @Override
+    public List<Specialty> findByNameIn(Set<String> names) {
+        List<Specialty> specialties;
+        try{
+            String sql = "SELECT id, name FROM specialties WHERE specialties.name IN (:names)";
+            Map<String, Object> params = new HashMap<>();
+            params.put("names", names);
+            specialties = this.namedParameterJdbcTemplate.query(
+                sql,
+                params,
+                new BeanPropertyRowMapper<>(Specialty.class));
+        } catch (EmptyResultDataAccessException ex){
+            throw new ObjectRetrievalFailureException(Specialty.class, names);
+        }
+
+        return specialties;
+    }
+
+    @Override
 	public Collection<Specialty> findAll() throws DataAccessException {
 		Map<String, Object> params = new HashMap<>();
         return this.namedParameterJdbcTemplate.query(
diff --git a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
index eb3d8ea7..cdc081d9 100644
--- a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
@@ -25,6 +25,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
 import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -470,5 +473,36 @@ abstract class AbstractClinicServiceTests {
         assertThat(specialty).isNull();
     }
 
-
+    @Test
+    @Transactional
+    void shouldFindSpecialtyByName() {
+        Specialty specialty1 = new Specialty();
+        specialty1.setName("radiology");
+        specialty1.setId(1);
+        Specialty specialty2 = new Specialty();
+        specialty2.setName("surgery");
+        specialty2.setId(2);
+        Specialty specialty3 = new Specialty();
+        specialty3.setName("dentistry");
+        specialty3.setId(3);
+        List<Specialty> expectedSpecialties = List.of(specialty1, specialty2, specialty3);
+        Set<String> specialtyNames = expectedSpecialties.stream()
+            .map(Specialty::getName)
+            .collect(Collectors.toSet());
+        Collection<Specialty> actualSpecialties = this.clinicService.findSpecialtiesByName(specialtyNames);
+        assertThat(actualSpecialties).isNotNull();
+        assertThat(actualSpecialties.size()).isEqualTo(expectedSpecialties.size());
+        for (Specialty expected : expectedSpecialties) {
+            assertThat(actualSpecialties.stream()
+                .anyMatch(
+                    actual -> actual.getName().equals(expected.getName())
+                    && actual.getId().equals(expected.getId()))).isTrue();
+        }
+    }
+
+    @Test
+    void shouldFindPetTypeByName(){
+        PetType petType = this.clinicService.findPetTypeByName("cat");
+        assertThat(petType.getId()).isEqualTo(1);
+    }
 }
-- 
GitLab