Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,26 @@
<artifactId>flyway-core</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
{

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
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;

import java.util.List;

@RestController
@RequestMapping("/employee")
public class EmployeeController {

@Autowired
private EmployeeService employeeService;

@GetMapping("/all")
public List<EmployeeEntity> getAllEmployees() {
return employeeService.getAllEmployees();
}


@GetMapping("/{id}")
public EmployeeEntity getById(@PathVariable(name = "id") Long id){
return employeeService.getById(id);
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/EmployeeEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
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.List;
import java.util.Set;

@Data
@Table("Employee")
public class EmployeeEntity {
@Id
private Long id;
private Long supervisor_id;
private List<PropertyEntity> employeeDetails;
private List<Long> reportees;

}
Original file line number Diff line number Diff line change
@@ -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<EmployeeEntity, Long> {
}
120 changes: 120 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/EmployeeService.java
Original file line number Diff line number Diff line change
@@ -0,0 +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) {

String query = "select employee.*, property.* from employee LEFT OUTER JOIN property ON employee.id=property.employee_id";
return jdbcTemplate.query(query, new ResultSetExtractor<EmployeeEntity>() {
@Override
public EmployeeEntity extractData(ResultSet resultSet) throws SQLException, DataAccessException {
EmployeeEntity employee=null;
Map<Long, Long> 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<EmployeeEntity> getAllEmployees() {
String query = "select employee.*, property.* from employee LEFT OUTER JOIN property ON employee.id=property.employee_id";
return jdbcTemplate.query(query, new ResultSetExtractor<List<EmployeeEntity>>() {
@Override
public List<EmployeeEntity> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
List<EmployeeEntity> list = new ArrayList<>();
Map<Long, EmployeeEntity> empMap = new HashMap<>();
Map<Long, List<Long>> reportMap = new HashMap<>();
List<PropertyEntity> 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<Long> 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;
}
});
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/zoomcare/candidatechallenge/PropertyEntity.java
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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<PropertyEntity, Long> {
}
14 changes: 13 additions & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,23 @@ 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:
exposure:
include: "*"
endpoint:
health:
show-details: always
show-details: always