added SQL queries

This commit is contained in:
Mehul Ahal 2023-01-12 10:03:03 +01:00 committed by LahaLuhem
parent 0213bc4606
commit b35ffac6fa
6 changed files with 91 additions and 17 deletions

View file

@ -1,8 +1,12 @@
import data.dtos.QueryDTO;
import data.enums.CustomPreparedStatementsRead;
import data.models.QueryResultsModel;
import services.AppConfigService;
import services.DatabaseService;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) {
final App app = new App();
@ -20,7 +24,7 @@ class App {
final AppConfigService appConfigService;
public void run() {
appConfigService.promptUserArguments();
final QueryResultsModel resultSetsQuery1 = databaseService.executeReadReportsEndpoint(CustomPreparedStatementsRead.HighestAndLowest10Vaccination);
//appConfigService.promptUserArguments();
final QueryResultsModel resultSetsQuery1 = databaseService.executeReadReportsEndpoint(new QueryDTO(CustomPreparedStatementsRead.HighestAndLowest10Vaccination));
}
}

View file

@ -5,13 +5,16 @@ import data.dtos.QueryDTO;
import java.sql.*;
public class DatabaseApi {
public PreparedStatement performReadQuery(QueryDTO queryDTO, Connection connection) {
try {
PreparedStatement statement = connection.prepareStatement(queryDTO.queryTemplate().statementTemplate);
statement.execute();
return statement;
} catch (SQLException e) {
throw new RuntimeException(e);
}
public PreparedStatement performReadQuery(QueryDTO queryDTO, Connection connection) throws SQLException {
// Set template
PreparedStatement statement = connection.prepareStatement(queryDTO.statement().statementTemplate);
// Add in arguments
for(int argIndex = 0; argIndex < queryDTO.templateArgs().length; argIndex++)
// parameter indexing starts at 1
statement.setString(argIndex + 1, queryDTO.templateArgs()[argIndex].toString());
statement.execute();
return statement;
}
}

View file

@ -2,6 +2,8 @@ package data.dtos;
import data.enums.CustomPreparedStatementsRead;
public record QueryDTO(CustomPreparedStatementsRead queryTemplate, Object[] placeholderReplacements) {
public record QueryDTO(CustomPreparedStatementsRead statement, Object[] templateArgs) {
public QueryDTO(CustomPreparedStatementsRead customPreparedStatementsRead) {
this(customPreparedStatementsRead, new Object[]{});
}
}

View file

@ -1,13 +1,68 @@
package data.enums;
/**
* Holds prepared data for Read-based SQL queries.
*
*/
public enum CustomPreparedStatementsRead {
DailyInfectionsAndDeathAggregate("""
WITH matched_countries AS (
SELECT c.name, c.code\s
FROM countries c
WHERE c.name LIKE CONCAT('%',?, '%')
)
SELECT recorded_date, infections, deaths
FROM cases
WHERE iso_country IN (SELECT code FROM matched_countries) AND recorded_date <= ?
ORDER BY recorded_date;
"""
),
HighestAndLowest10Vaccination("""
WITH vacc_count_per_country AS (
SELECT iso_country, SUM(daily_vaccinations) as total_vaccinations
FROM vaccinations
GROUP BY iso_country
)
SELECT name, total_vaccinations
FROM countries JOIN vacc_count_per_country
ON countries.code = vacc_count_per_country.iso_country
ORDER BY total_vaccinations DESC
LIMIT 10
;
WITH vacc_count_per_country AS (
SELECT iso_country, SUM(daily_vaccinations) as total_vaccinations
FROM vaccinations
GROUP BY iso_country
)
SELECT name, total_vaccinations
FROM countries JOIN vacc_count_per_country
ON countries.code = vacc_count_per_country.iso_country
ORDER BY total_vaccinations ASC
LIMIT 10
;
"""
),
HighestInfectionsPer100K("""
SELECT c.name, c.population, SUM(cases.infections) as total_infections, (SUM(cases.infections) * 100000) / c.population as infections_per_100k
FROM cases
INNER JOIN countries c ON cases.iso_country = c.code
GROUP BY c.name, c.population
ORDER BY infections_per_100k DESC
LIMIT 10
;
"""
),
CountriesLaggingBehind("""
SELECT c.name
FROM countries c
LEFT JOIN vaccinations v ON c.code = v.iso_country
GROUP BY c.name
HAVING SUM(v.daily_vaccinations) < c.population
;
"""
);

View file

@ -24,12 +24,13 @@ public class DatabaseService {
databaseApi = new DatabaseApi();
}
public QueryResultsModel executeReadReportsEndpoint(CustomPreparedStatementsRead customPreparedStatement) {
final QueryDTO queryDTO = new QueryDTO(customPreparedStatement, new Object[]{});
final PreparedStatement resultStatement = databaseApi.performReadQuery(queryDTO, connection);
public QueryResultsModel executeReadReportsEndpoint(QueryDTO queryDTO) {
try {
final PreparedStatement resultStatement = databaseApi.performReadQuery(queryDTO, connection);
final ArrayList<ResultSet> resultSets = new ArrayList<>();
do {
// execute and persist results in a model
resultSets.add(resultStatement.getResultSet());
}
while (resultStatement.getMoreResults());
@ -40,7 +41,7 @@ public class DatabaseService {
}
}
/**
/**
* Connect to the PostgreSQL database
*
* @return a Connection object

View file

@ -0,0 +1,9 @@
package services;
import data.models.QueryResultsModel;
public class ReportGenerationService {
public static void printResults(QueryResultsModel queryResultsModel) {
//queryResultsModel.
}
}