Skip to content

Commit 8d8c45a

Browse files
author
bwajtr
committed
Implementation of scenario nine + implementation change of equals and hashCode methods in data classes: Java offers (since 1.7) methods Objects.equals and Objects.hash, which makes the task quite easy...
1 parent 2d0efc7 commit 8d8c45a

14 files changed

Lines changed: 286 additions & 105 deletions

File tree

dbscenarios.txt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
6. Fetch entity and it's many-to-one relation (Company for Department)
77
7. Fetch entity and it's one-to-many relation (Departments for Company)
88
8. Update entities one-to-many relation - add two items, update two items and delete one item
9-
9. Complex select - construct select where conditions based on some boolean conditions + throw in some outer joins
10-
10. Transactions handling
11-
11. Call stored procedure
12-
12. Optimistic locking
9+
9. Complex select - construct select where conditions based on some boolean conditions + throw in some joins
10+
10. Call stored procedure
11+
11. Optimistic locking

sql-updates/create-script.sql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ INSERT INTO Employee (department_pid, name, surname, email, salary)
7373
INSERT INTO Employee (department_pid, name, surname, email, salary)
7474
VALUES (2, 'Alica', 'Iannotti', 'alica.iannotti@clevergang.com', 30000);
7575
INSERT INTO Employee (department_pid, name, surname, email, salary)
76-
VALUES (3, 'Estrella', 'Heroux', 'estrella.heroux@clevergang.com', 31000);
76+
VALUES (3, 'Estrella', 'Heroux', 'estrella.heroux@clevergang.com', 51000);
7777
INSERT INTO Employee (department_pid, name, surname, email, salary)
78-
VALUES (4, 'Myrta', 'Lirette', 'myrta.lirette@supersoft.com', 50000);
78+
VALUES (4, 'Myrta', 'Lirette', 'myrta.lirette@supersoft.com', 54250);
7979

8080

8181
INSERT INTO Project (name, dateStarted) VALUES ('Awesome app', CURRENT_DATE);
@@ -87,3 +87,4 @@ INSERT INTO ProjectEmployee (project_pid, employee_pid) VALUES (1, 2);
8787
INSERT INTO ProjectEmployee (project_pid, employee_pid) VALUES (1, 9);
8888
INSERT INTO ProjectEmployee (project_pid, employee_pid) VALUES (2, 10);
8989
INSERT INTO ProjectEmployee (project_pid, employee_pid) VALUES (2, 5);
90+
INSERT INTO ProjectEmployee (project_pid, employee_pid) VALUES (1, 4);

src/main/java/com/clevergang/dbtests/Scenarios.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.clevergang.dbtests;
22

3-
import com.clevergang.dbtests.model.Company;
4-
import com.clevergang.dbtests.model.Department;
5-
import com.clevergang.dbtests.model.Employee;
6-
import com.clevergang.dbtests.model.Project;
7-
import com.clevergang.dbtests.repository.DataRepository;
3+
import com.clevergang.dbtests.repository.api.data.*;
4+
import com.clevergang.dbtests.repository.api.DataRepository;
85
import org.apache.commons.collections4.CollectionUtils;
96
import org.apache.commons.lang3.RandomStringUtils;
107
import org.slf4j.Logger;
@@ -204,6 +201,20 @@ private List<Department> createNewDepartmentsList(Company company) {
204201

205202
return departments;
206203
}
204+
205+
206+
/**
207+
* Execute complex query
208+
*
209+
* In our case we are executing following query:
210+
* Query: get all projects, where the total cost of the project per month is greater than 70000. In the same resultset
211+
* get all companies participating on such project along with cost of the project for the company.
212+
*/
213+
public void scenarioNine() {
214+
List<ProjectsWithCostsGreaterThanOutput> projectsWithCostsGreaterThan = repository.getProjectsWithCostsGreaterThan(70000);
215+
216+
logger.info("scenarioNine output: " + projectsWithCostsGreaterThan);
217+
}
207218
}
208219

209220

src/main/java/com/clevergang/dbtests/repository/DataRepository.java renamed to src/main/java/com/clevergang/dbtests/repository/api/DataRepository.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
package com.clevergang.dbtests.repository;
1+
package com.clevergang.dbtests.repository.api;
22

3-
import com.clevergang.dbtests.model.Company;
4-
import com.clevergang.dbtests.model.Department;
5-
import com.clevergang.dbtests.model.Employee;
6-
import com.clevergang.dbtests.model.Project;
3+
import com.clevergang.dbtests.repository.api.data.*;
74

85
import java.util.List;
96

@@ -44,4 +41,5 @@ public interface DataRepository {
4441

4542
void updateEmployee(Employee employeeToUpdate);
4643

44+
List<ProjectsWithCostsGreaterThanOutput> getProjectsWithCostsGreaterThan(int totalCostBoundary);
4745
}

src/main/java/com/clevergang/dbtests/model/Company.java renamed to src/main/java/com/clevergang/dbtests/repository/api/data/Company.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package com.clevergang.dbtests.model;
1+
package com.clevergang.dbtests.repository.api.data;
2+
3+
import java.util.Objects;
24

35
/**
46
* @author Bretislav Wajtr <bretislav.wajtr@clevergang.com>
@@ -35,27 +37,17 @@ public void setAddress(String address) {
3537

3638
@Override
3739
public boolean equals(Object o) {
38-
if (this == o)
39-
return true;
40-
if (o == null || getClass() != o.getClass())
41-
return false;
42-
40+
if (this == o) return true;
41+
if (o == null || getClass() != o.getClass()) return false;
4342
Company company = (Company) o;
44-
45-
if (pid != null ? !pid.equals(company.pid) : company.pid != null)
46-
return false;
47-
if (name != null ? !name.equals(company.name) : company.name != null)
48-
return false;
49-
return address != null ? address.equals(company.address) : company.address == null;
50-
43+
return Objects.equals(pid, company.pid) &&
44+
Objects.equals(name, company.name) &&
45+
Objects.equals(address, company.address);
5146
}
5247

5348
@Override
5449
public int hashCode() {
55-
int result = pid != null ? pid.hashCode() : 0;
56-
result = 31 * result + (name != null ? name.hashCode() : 0);
57-
result = 31 * result + (address != null ? address.hashCode() : 0);
58-
return result;
50+
return Objects.hash(pid, name, address);
5951
}
6052

6153
@Override

src/main/java/com/clevergang/dbtests/model/Department.java renamed to src/main/java/com/clevergang/dbtests/repository/api/data/Department.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
package com.clevergang.dbtests.model;
1+
package com.clevergang.dbtests.repository.api.data;
2+
3+
import java.util.Objects;
24

35
/**
46
* @author Bretislav Wajtr <bretislav.wajtr@clevergang.com>
@@ -42,27 +44,17 @@ public Department(Integer company_pid, String name) {
4244

4345
@Override
4446
public boolean equals(Object o) {
45-
if (this == o)
46-
return true;
47-
if (o == null || getClass() != o.getClass())
48-
return false;
49-
47+
if (this == o) return true;
48+
if (o == null || getClass() != o.getClass()) return false;
5049
Department that = (Department) o;
51-
52-
if (pid != null ? !pid.equals(that.pid) : that.pid != null)
53-
return false;
54-
if (company_pid != null ? !company_pid.equals(that.company_pid) : that.company_pid != null)
55-
return false;
56-
return name != null ? name.equals(that.name) : that.name == null;
57-
50+
return Objects.equals(pid, that.pid) &&
51+
Objects.equals(company_pid, that.company_pid) &&
52+
Objects.equals(name, that.name);
5853
}
5954

6055
@Override
6156
public int hashCode() {
62-
int result = pid != null ? pid.hashCode() : 0;
63-
result = 31 * result + (company_pid != null ? company_pid.hashCode() : 0);
64-
result = 31 * result + (name != null ? name.hashCode() : 0);
65-
return result;
57+
return Objects.hash(pid, company_pid, name);
6658
}
6759

6860
@Override

src/main/java/com/clevergang/dbtests/model/Employee.java renamed to src/main/java/com/clevergang/dbtests/repository/api/data/Employee.java

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
package com.clevergang.dbtests.model;
1+
package com.clevergang.dbtests.repository.api.data;
22

33
import java.math.BigDecimal;
4+
import java.util.Objects;
45

56
/**
67
* @author Bretislav Wajtr <bretislav.wajtr@clevergang.com>
@@ -64,36 +65,20 @@ public void setSalary(BigDecimal salary) {
6465

6566
@Override
6667
public boolean equals(Object o) {
67-
if (this == o)
68-
return true;
69-
if (o == null || getClass() != o.getClass())
70-
return false;
71-
68+
if (this == o) return true;
69+
if (o == null || getClass() != o.getClass()) return false;
7270
Employee employee = (Employee) o;
73-
74-
if (pid != null ? !pid.equals(employee.pid) : employee.pid != null)
75-
return false;
76-
if (department_pid != null ? !department_pid.equals(employee.department_pid) : employee.department_pid != null)
77-
return false;
78-
if (name != null ? !name.equals(employee.name) : employee.name != null)
79-
return false;
80-
if (surname != null ? !surname.equals(employee.surname) : employee.surname != null)
81-
return false;
82-
if (email != null ? !email.equals(employee.email) : employee.email != null)
83-
return false;
84-
return salary != null ? salary.equals(employee.salary) : employee.salary == null;
85-
71+
return Objects.equals(pid, employee.pid) &&
72+
Objects.equals(department_pid, employee.department_pid) &&
73+
Objects.equals(name, employee.name) &&
74+
Objects.equals(surname, employee.surname) &&
75+
Objects.equals(email, employee.email) &&
76+
Objects.equals(salary, employee.salary);
8677
}
8778

8879
@Override
8980
public int hashCode() {
90-
int result = pid != null ? pid.hashCode() : 0;
91-
result = 31 * result + (department_pid != null ? department_pid.hashCode() : 0);
92-
result = 31 * result + (name != null ? name.hashCode() : 0);
93-
result = 31 * result + (surname != null ? surname.hashCode() : 0);
94-
result = 31 * result + (email != null ? email.hashCode() : 0);
95-
result = 31 * result + (salary != null ? salary.hashCode() : 0);
96-
return result;
81+
return Objects.hash(pid, department_pid, name, surname, email, salary);
9782
}
9883

9984
@Override

src/main/java/com/clevergang/dbtests/model/Project.java renamed to src/main/java/com/clevergang/dbtests/repository/api/data/Project.java

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
package com.clevergang.dbtests.model;
1+
package com.clevergang.dbtests.repository.api.data;
22

33
import java.time.LocalDate;
4+
import java.util.Objects;
45

56
/**
67
* @author Bretislav Wajtr <bretislav.wajtr@clevergang.com>
@@ -36,27 +37,17 @@ public void setDate(LocalDate date) {
3637

3738
@Override
3839
public boolean equals(Object o) {
39-
if (this == o)
40-
return true;
41-
if (o == null || getClass() != o.getClass())
42-
return false;
43-
40+
if (this == o) return true;
41+
if (o == null || getClass() != o.getClass()) return false;
4442
Project project = (Project) o;
45-
46-
if (pid != null ? !pid.equals(project.pid) : project.pid != null)
47-
return false;
48-
if (name != null ? !name.equals(project.name) : project.name != null)
49-
return false;
50-
return date != null ? date.equals(project.date) : project.date == null;
51-
43+
return Objects.equals(pid, project.pid) &&
44+
Objects.equals(name, project.name) &&
45+
Objects.equals(date, project.date);
5246
}
5347

5448
@Override
5549
public int hashCode() {
56-
int result = pid != null ? pid.hashCode() : 0;
57-
result = 31 * result + (name != null ? name.hashCode() : 0);
58-
result = 31 * result + (date != null ? date.hashCode() : 0);
59-
return result;
50+
return Objects.hash(pid, name, date);
6051
}
6152

6253
@Override
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.clevergang.dbtests.repository.api.data;
2+
3+
import java.math.BigDecimal;
4+
import java.util.Objects;
5+
6+
/**
7+
* @author Bretislav Wajtr <bretislav.wajtr@ibacz.eu>
8+
*/
9+
public class ProjectsWithCostsGreaterThanOutput {
10+
11+
private String projectName;
12+
private BigDecimal totalCost;
13+
private String companyName;
14+
private BigDecimal companyCost;
15+
16+
public String getProjectName() {
17+
return projectName;
18+
}
19+
20+
public void setProjectName(String projectName) {
21+
this.projectName = projectName;
22+
}
23+
24+
public BigDecimal getTotalCost() {
25+
return totalCost;
26+
}
27+
28+
public void setTotalCost(BigDecimal totalCost) {
29+
this.totalCost = totalCost;
30+
}
31+
32+
public String getCompanyName() {
33+
return companyName;
34+
}
35+
36+
public void setCompanyName(String companyName) {
37+
this.companyName = companyName;
38+
}
39+
40+
public BigDecimal getCompanyCost() {
41+
return companyCost;
42+
}
43+
44+
public void setCompanyCost(BigDecimal companyCost) {
45+
this.companyCost = companyCost;
46+
}
47+
48+
@Override
49+
public boolean equals(Object o) {
50+
if (this == o) return true;
51+
if (o == null || getClass() != o.getClass()) return false;
52+
ProjectsWithCostsGreaterThanOutput that = (ProjectsWithCostsGreaterThanOutput) o;
53+
return Objects.equals(projectName, that.projectName) &&
54+
Objects.equals(totalCost, that.totalCost) &&
55+
Objects.equals(companyName, that.companyName) &&
56+
Objects.equals(companyCost, that.companyCost);
57+
}
58+
59+
@Override
60+
public int hashCode() {
61+
return Objects.hash(projectName, totalCost, companyName, companyCost);
62+
}
63+
64+
@Override
65+
public String toString() {
66+
return "ProjectsWithCostsGreaterThanOutput{" +
67+
"projectName='" + projectName + '\'' +
68+
", totalCost=" + totalCost +
69+
", companyName='" + companyName + '\'' +
70+
", companyCost=" + companyCost +
71+
'}';
72+
}
73+
}

src/main/java/com/clevergang/dbtests/repository/impl/jdbctemplate/JDBCDataRepositoryImpl.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.clevergang.dbtests.repository.impl.jdbctemplate;
22

3-
import com.clevergang.dbtests.model.Company;
4-
import com.clevergang.dbtests.model.Department;
5-
import com.clevergang.dbtests.model.Employee;
6-
import com.clevergang.dbtests.model.Project;
7-
import com.clevergang.dbtests.repository.DataRepository;
3+
import com.clevergang.dbtests.repository.api.DataRepository;
4+
import com.clevergang.dbtests.repository.api.data.*;
85
import org.slf4j.Logger;
96
import org.slf4j.LoggerFactory;
107
import org.springframework.beans.factory.annotation.Autowired;
@@ -153,6 +150,41 @@ public void updateEmployee(Employee employeeToUpdate) {
153150
jdbcTemplate.update(updateStatement, params);
154151
}
155152

153+
@Override
154+
public List<ProjectsWithCostsGreaterThanOutput> getProjectsWithCostsGreaterThan(int totalCostBoundary) {
155+
String query;
156+
query = "WITH project_info AS (\n" +
157+
" SELECT project.pid project_pid, project.name project_name, salary monthly_cost, company.name company_name\n" +
158+
" FROM project\n" +
159+
" JOIN projectemployee ON project.pid = projectemployee.project_pid\n" +
160+
" JOIN employee ON projectemployee.employee_pid = employee.pid\n" +
161+
" LEFT JOIN department ON employee.department_pid = department.pid\n" +
162+
" LEFT JOIN company ON department.company_pid = company.pid\n" +
163+
"),\n" +
164+
"project_cost AS (\n" +
165+
" SELECT project_pid, sum(monthly_cost) total_cost\n" +
166+
" FROM project_info GROUP BY project_pid\n" +
167+
")\n" +
168+
"SELECT project_name, total_cost, company_name, sum(monthly_cost) company_cost FROM project_info\n" +
169+
" JOIN project_cost USING (project_pid)\n" +
170+
"WHERE total_cost > :totalCostBoundary\n" +
171+
"GROUP BY project_name, total_cost, company_name";
172+
173+
Map<String, Object> params = new HashMap<>();
174+
params.put("totalCostBoundary", totalCostBoundary);
175+
176+
RowMapper<ProjectsWithCostsGreaterThanOutput> mapper = (rs, rowNum) -> {
177+
ProjectsWithCostsGreaterThanOutput row = new ProjectsWithCostsGreaterThanOutput();
178+
row.setProjectName(rs.getString("project_name"));
179+
row.setTotalCost(rs.getBigDecimal("total_cost"));
180+
row.setCompanyName(rs.getString("company_name"));
181+
row.setCompanyCost(rs.getBigDecimal("company_cost"));
182+
return row;
183+
};
184+
185+
return jdbcTemplate.query(query, params, mapper);
186+
}
187+
156188
@Override
157189
public List<Department> findDepartmentsOfCompany(Company company) {
158190
String query = "SELECT pid, company_pid, name" +

0 commit comments

Comments
 (0)