From d02e343082b879c98895606e370a6ea2db788b24 Mon Sep 17 00:00:00 2001 From: Nanda kishore Datrika Rajender Date: Fri, 7 Oct 2022 00:23:39 -0400 Subject: [PATCH 1/2] implement test --- pom.xml | 11 ++++++++-- .../CandidateChallengeApplication.java | 2 ++ .../EmployeeController.java | 20 ++++++++++++++++++ .../candidatechallenge/EmployeeEntity.java | 21 +++++++++++++++++++ .../EmployeeRepository.java | 8 +++++++ .../candidatechallenge/EmployeeService.java | 18 ++++++++++++++++ .../candidatechallenge/PropertyEntity.java | 14 +++++++++++++ .../PropertyRepository.java | 8 +++++++ src/main/resources/application.yml | 14 ++++++++++++- 9 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java create mode 100644 src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java create mode 100644 src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java create mode 100644 src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java create mode 100644 src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java create mode 100644 src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java diff --git a/pom.xml b/pom.xml index 17fd7ad..070d808 100644 --- a/pom.xml +++ b/pom.xml @@ -37,13 +37,20 @@ flyway-core runtime - + + org.projectlombok + lombok + 1.18.10 + com.h2database h2 runtime - + + org.springframework.boot + spring-boot-starter-data-jpa + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java index 0114259..ccfc332 100644 --- a/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java +++ b/src/main/java/com/zoomcare/candidatechallenge/CandidateChallengeApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication +@EnableJpaRepositories({"com.zoomcare.candidatechallenge"}) public class CandidateChallengeApplication { diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java new file mode 100644 index 0000000..c9a9d55 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java @@ -0,0 +1,20 @@ +package com.zoomcare.candidatechallenge; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/employee") +public class EmployeeController { + + @Autowired + private EmployeeService employeeService; + + @GetMapping("/{id}") + public EmployeeEntity getById(@PathVariable(name = "id") Long id){ + return employeeService.getById(id); + } +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java new file mode 100644 index 0000000..79e5893 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java @@ -0,0 +1,21 @@ +package com.zoomcare.candidatechallenge; +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Table; + +import javax.persistence.*; +import java.util.Set; + +@Data +@Table("Employee") +public class EmployeeEntity { + @Id + private Long id; + @ManyToOne(cascade = {CascadeType.ALL}) + @JoinColumn(name="supervisor_id") + private EmployeeEntity supervisor; + + @OneToMany(mappedBy = "supervisor") + private Set subordinates; + +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java new file mode 100644 index 0000000..f136dc1 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeRepository.java @@ -0,0 +1,8 @@ +package com.zoomcare.candidatechallenge; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface EmployeeRepository extends JpaRepository { +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java new file mode 100644 index 0000000..a79f652 --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java @@ -0,0 +1,18 @@ +package com.zoomcare.candidatechallenge; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EmployeeService { + + @Autowired + private EmployeeRepository employeeRepository; + + public EmployeeEntity getById(Long id) { + EmployeeEntity employeeEntity = employeeRepository.findById(id).get(); + // List<> + + return employeeRepository.findById(id).get(); + } +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java b/src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java new file mode 100644 index 0000000..3853b9e --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java @@ -0,0 +1,14 @@ +package com.zoomcare.candidatechallenge; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Table; + +@Data +@Table("Property") +public class PropertyEntity { + @Id + private Long employeeId; + private String key; + private String value; +} diff --git a/src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java b/src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java new file mode 100644 index 0000000..cb7a01f --- /dev/null +++ b/src/main/java/com/zoomcare/candidatechallenge/PropertyRepository.java @@ -0,0 +1,8 @@ +package com.zoomcare.candidatechallenge; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PropertyRepository extends JpaRepository { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4408d17..4b9ab74 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,17 @@ spring: h2: console: enabled: true + datasource: + driverClassName: org.h2.Driver + url: jdbc:h2:mem:testdb + username: sa + password: + jpa: + show-sql: true + flyway: + baseline-on-migrate: true + main: + allow-bean-definition-overriding: true management: endpoints: web: @@ -9,4 +20,5 @@ management: include: "*" endpoint: health: - show-details: always \ No newline at end of file + show-details: always + From 78814c65933372e76bf6c0261df219a8f06a811a Mon Sep 17 00:00:00 2001 From: Nanda kishore Datrika Rajender Date: Fri, 7 Oct 2022 01:02:49 -0400 Subject: [PATCH 2/2] complete the implementation --- pom.xml | 1 + .../EmployeeController.java | 8 ++ .../candidatechallenge/EmployeeEntity.java | 10 +- .../candidatechallenge/EmployeeService.java | 108 +++++++++++++++++- 4 files changed, 118 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 070d808..cca0729 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ spring-boot-starter-test test + diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java index c9a9d55..2636451 100644 --- a/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeController.java @@ -6,6 +6,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/employee") public class EmployeeController { @@ -13,6 +15,12 @@ public class EmployeeController { @Autowired private EmployeeService employeeService; + @GetMapping("/all") + public List getAllEmployees() { + return employeeService.getAllEmployees(); + } + + @GetMapping("/{id}") public EmployeeEntity getById(@PathVariable(name = "id") Long id){ return employeeService.getById(id); diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java index 79e5893..a15df62 100644 --- a/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java @@ -4,6 +4,7 @@ import org.springframework.data.relational.core.mapping.Table; import javax.persistence.*; +import java.util.List; import java.util.Set; @Data @@ -11,11 +12,8 @@ public class EmployeeEntity { @Id private Long id; - @ManyToOne(cascade = {CascadeType.ALL}) - @JoinColumn(name="supervisor_id") - private EmployeeEntity supervisor; - - @OneToMany(mappedBy = "supervisor") - private Set subordinates; + private Long supervisor_id; + private List employeeDetails; + private List reportees; } diff --git a/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java b/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java index a79f652..30dffaa 100644 --- a/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java +++ b/src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java @@ -1,18 +1,120 @@ package com.zoomcare.candidatechallenge; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.ResultSetExtractor; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.stereotype.Service; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + @Service public class EmployeeService { @Autowired private EmployeeRepository employeeRepository; + @Autowired + private JdbcTemplate jdbcTemplate; public EmployeeEntity getById(Long id) { - EmployeeEntity employeeEntity = employeeRepository.findById(id).get(); - // List<> - return employeeRepository.findById(id).get(); + String query = "select employee.*, property.* from employee LEFT OUTER JOIN property ON employee.id=property.employee_id"; + return jdbcTemplate.query(query, new ResultSetExtractor() { + @Override + public EmployeeEntity extractData(ResultSet resultSet) throws SQLException, DataAccessException { + EmployeeEntity employee=null; + Map supList = new HashMap<>(); + while(resultSet.next()){ + Long empId = resultSet.getLong("id"); + if(employee==null && empId==id){ + employee = new EmployeeEntity(); + employee.setId(empId); + employee.setSupervisor_id(resultSet.getLong("supervisor_id")); + } + if(resultSet.getLong("supervisor_id")==id){ + supList.put(empId, empId); + } + Long propId = resultSet.getLong("employee_id"); + if(propId>0 && empId==id){ + PropertyEntity property = new PropertyEntity(); + property.setEmployeeId(propId); + property.setKey(resultSet.getString("key")); + property.setValue(resultSet.getString("value")); + if(employee.getEmployeeDetails()!=null){ + employee.getEmployeeDetails().add(property); + }else{ + employee.setEmployeeDetails(new ArrayList<>()); + employee.getEmployeeDetails().add(property); + } + } + } + employee.setReportees(new ArrayList<>()); + employee.getReportees().addAll(supList.keySet()); + return employee; + } + }); + } + + public List getAllEmployees() { + String query = "select employee.*, property.* from employee LEFT OUTER JOIN property ON employee.id=property.employee_id"; + return jdbcTemplate.query(query, new ResultSetExtractor>() { + @Override + public List extractData(ResultSet resultSet) throws SQLException, DataAccessException { + List list = new ArrayList<>(); + Map empMap = new HashMap<>(); + Map> reportMap = new HashMap<>(); + List pList = new ArrayList<>(); + while(resultSet.next()){ + Long empId = resultSet.getLong("id"); + if(!empMap.containsKey(empId)){ + EmployeeEntity emp = new EmployeeEntity(); + emp.setId(empId); + Long supervisor_id = resultSet.getLong("supervisor_id"); + emp.setSupervisor_id(supervisor_id); + if(reportMap.containsKey(supervisor_id)){ + reportMap.get(supervisor_id).add(empId); + }else{ + List l = new ArrayList<>(); + l.add(empId); + reportMap.put(supervisor_id, l); + } + empMap.put(empId, emp); + } + Long empId2 = resultSet.getLong("employee_id"); + if(empId2>0) { + PropertyEntity property = new PropertyEntity(); + property.setEmployeeId(empId2); + property.setKey(resultSet.getString("key")); + property.setValue(resultSet.getString("value")); + if(empMap.get(empId2).getEmployeeDetails()!=null){ + empMap.get(empId2).getEmployeeDetails().add(property); + }else{ + empMap.get(empId2).setEmployeeDetails(new ArrayList<>()); + empMap.get(empId2).getEmployeeDetails().add(property); + } + } + } + list.addAll(empMap.values()); + for (EmployeeEntity emp:list) { + if(emp.getReportees()!=null) { + if(reportMap.get(emp.getId())!=null) + emp.getReportees().addAll(reportMap.get(emp.getId())); + }else{ + if(reportMap.get(emp.getId())!=null) { + emp.setReportees(new ArrayList<>()); + emp.getReportees().addAll(reportMap.get(emp.getId())); + } + } + + } + return list; + } + }); } }