From 95682d7204d7b38b20a8906aac3c958cd0516509 Mon Sep 17 00:00:00 2001 From: LO Kam Tao Leo Date: Sun, 4 Dec 2022 17:04:18 +0000 Subject: [PATCH] Refactoring the code --- .../org/leolo/nrdatad/db/mariadb/CorpusDao.java | 379 --------------------- .../leolo/nrdatad/db/mariadb/CorpusDaoImpl.java | 379 +++++++++++++++++++++ .../leolo/nrdatad/db/mariadb/DatabaseManager.java | 6 +- .../org/leolo/nrdatad/db/mariadb/MetadataDao.java | 116 ------- .../leolo/nrdatad/db/mariadb/MetadataDaoImpl.java | 116 +++++++ .../org/leolo/nrdatad/db/mariadb/SmartDao.java | 322 ----------------- .../org/leolo/nrdatad/db/mariadb/SmartDaoImpl.java | 322 +++++++++++++++++ 7 files changed, 820 insertions(+), 820 deletions(-) delete mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDao.java create mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDaoImpl.java delete mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java create mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDaoImpl.java delete mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/SmartDao.java create mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/SmartDaoImpl.java diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDao.java b/src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDao.java deleted file mode 100644 index 31092b7..0000000 --- a/src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDao.java +++ /dev/null @@ -1,379 +0,0 @@ -package org.leolo.nrdatad.db.mariadb; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.NotNull; -import org.leolo.nrdatad.db.DatabaseManager; -import org.leolo.nrdatad.db.ParameterStore; -import org.leolo.nrdatad.db.SearchMode; -import org.leolo.nrdatad.model.Corpus; - -import java.sql.*; -import java.util.*; - -public class CorpusDao extends org.leolo.nrdatad.db.CorpusDao { - - Logger log = LogManager.getLogger(); - - public CorpusDao(DatabaseManager manager) { - super(manager); - } - - @Override - public Collection executeQuery(org.leolo.nrdatad.db.CorpusDao.Query query) throws SQLException { - Vector corpuses = new Vector<>(); - ParameterStore params = new ParameterStore(); - StringBuilder sql = new StringBuilder(); - if(query.getSearchMode()== SearchMode.MATCH_ALL_GROUP || query.getSearchMode()==SearchMode.MATCH_ANY){ - sql.append("SELECT * FROM corpus WHERE "); - String keyWord; - if(query.getSearchMode() == SearchMode.MATCH_ALL_GROUP){ - sql.append("1=1 "); - keyWord = "AND "; - }else{ - sql.append("1=0 "); - keyWord = "OR "; - } - if(query.getStanox().size()>0){ - sql.append(keyWord).append("stanox IN (") - .append(getQueryParams(query.getStanox().size())).append(") "); - params.addAll(query.getStanox()); - } - if(query.getUicCode().size()>0){ - sql.append(keyWord).append("uic_code IN (") - .append(getQueryParams(query.getUicCode().size())).append(") "); - params.addAll(query.getUicCode()); - } - if(query.getCrsCode().size()>0){ - sql.append(keyWord).append("crs_code IN (") - .append(getQueryParams(query.getCrsCode().size())).append(") "); - params.addAll(query.getCrsCode()); - } - if(query.getTiplocCode().size()>0){ - sql.append(keyWord).append("tiploc_code IN (") - .append(getQueryParams(query.getTiplocCode().size())).append(") "); - params.addAll(query.getTiplocCode()); - } - if(query.getNlcCode().size()>0){ - sql.append(keyWord).append("nlc_code IN(") - .append(getQueryParams(query.getNlcCode().size())).append(") "); - params.addAll(query.getNlcCode()); - } - if(query.getDescription().size()>0){ - sql.append(keyWord).append("("); - boolean hasDesc = false; - for(String str:query.getDescription()){ - if(hasDesc){ - sql.append("OR "); - } - sql.append("(`desc` LIKE ? OR short_desc LIKE ? ) "); - hasDesc = true; - params.add("%"+str+"%"); - params.add("%"+str+"%"); - } - sql.append(") "); - } - log.atDebug().log("SQL={}",sql); - }else{ - log.always().log("Search mode {} is yet to be implemented.", query.getSearchMode()); - } - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement(sql.toString()) - ){ - for(int i=1;i<=params.size();i++){ - log.atDebug().log("Param {} = {}", i, params.get(i)); - setString(pstmt, i, params.get(i)); - } - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - corpuses.add(parseCORPUS(rs)); - } - } - } - return corpuses; - } - - @Override - public void add(@NotNull Corpus corpus) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "INSERT INTO corpus (stanox, uic_code, crs_code, tiploc_code, nlc_code, `desc`, short_desc) " + - "VALUES (?,?,?,?,?,?,?)") - ){ - setString(pstmt, 1, corpus.getStanoxCode()); - setString(pstmt, 2, corpus.getUicCode()); - setString(pstmt, 3, corpus.getCrsCode()); - setString(pstmt, 4, corpus.getTiplocCode()); - setString(pstmt, 5, corpus.getNlcCode()); - setString(pstmt, 6, corpus.getLongDescription()); - setString(pstmt, 7, corpus.getShortDescription()); - pstmt.executeUpdate(); - conn.commit(); - } - } - - @Override - public void addAll(@NotNull Collection datas) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "INSERT INTO corpus (stanox, uic_code, crs_code, tiploc_code, nlc_code, `desc`, short_desc) " + - "VALUES (?,?,?,?,?,?,?)") - ){ - for(Corpus corpus:datas) { - setString(pstmt, 1, corpus.getStanoxCode()); - setString(pstmt, 2, corpus.getUicCode()); - setString(pstmt, 3, corpus.getCrsCode()); - setString(pstmt, 4, corpus.getTiplocCode()); - setString(pstmt, 5, corpus.getNlcCode()); - setString(pstmt, 6, corpus.getLongDescription()); - setString(pstmt, 7, corpus.getShortDescription()); - pstmt.addBatch(); - } - pstmt.executeBatch(); - conn.commit(); - } - } - - - @Override - public void replaceAll(@NotNull Collection datas) throws SQLException { - int totalCount = 0, insertCount = 0, updateCount = 0; - HashSet pendingInsert = new HashSet<>(); - try( - Connection conn = getConnection(); - PreparedStatement psIns = conn.prepareStatement( - "INSERT INTO corpus (stanox, uic_code, crs_code, tiploc_code, `desc`, short_desc, nlc_code) " + - "VALUES (?,?,?,?,?,?,?)"); - PreparedStatement psUpd = conn.prepareStatement( - "UPDATE corpus " + - "SET stanox=?, uic_code=?, crs_code=?, tiploc_code=?, `desc`=?, short_desc=? " + - "WHERE nlc_code = ?" - ) - ){ - for(Corpus corpus:datas){ - totalCount++; - Corpus existing = searchCORPUSByNlcCode(corpus.getNlcCode()); - PreparedStatement stmt = null; - if(corpus.equals(existing)){ - continue; - }else if(existing==null){ - if(pendingInsert.contains(corpus.getNlcCode())){ - continue; - } - pendingInsert.add(corpus.getNlcCode()); - stmt = psIns; - insertCount++; - }else{ - stmt = psUpd; - updateCount++; - } - setString(stmt, 1, corpus.getStanoxCode()); - setString(stmt, 2, corpus.getUicCode()); - setString(stmt, 3, corpus.getCrsCode()); - setString(stmt, 4, corpus.getTiplocCode()); - setString(stmt, 5, corpus.getLongDescription()); - setString(stmt, 6, corpus.getShortDescription()); - setString(stmt, 7, corpus.getNlcCode()); - stmt.addBatch(); - } - if(insertCount>0){ - psIns.executeBatch(); - log.atInfo().log("Inserted {} CORPUS records", insertCount); - } - if(updateCount>0){ - psUpd.executeBatch(); - log.atInfo().log("Updated {} CORPUS records", updateCount); - } - if(insertCount==0 && updateCount==0){ - log.atInfo().log("CORPUS data already up to date. "); - }else{ - conn.commit(); - log.atInfo().log("Done committing CORPUS data"); - } - } - } - - @Override - public void truncateTable() throws SQLException { - try( - Connection conn = getConnection(); - Statement stmt = conn.createStatement() - ){ - stmt.executeQuery("TRUNCATE TABLE corpus"); - } - } - - @Override - public boolean hasNlcCode(String nlcCode) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM corpus WHERE nlc_code = ?") - ){ - pstmt.setString(1, nlcCode); - try(ResultSet rs = pstmt.executeQuery()){ - return rs.next(); - } - } - } - - @Override - public void update(Corpus corpus) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "UPDATE corpus " + - "SET stanox=?, uic_code=?, crs_code=?, tiploc_code=?, `desc`=?, short_desc=? " + - "WHERE nlc_code = ?" - ) - ){ - setString(pstmt, 1, corpus.getStanoxCode()); - setString(pstmt, 2, corpus.getUicCode()); - setString(pstmt, 3, corpus.getCrsCode()); - setString(pstmt, 4, corpus.getTiplocCode()); - setString(pstmt, 5, corpus.getLongDescription()); - setString(pstmt, 6, corpus.getShortDescription()); - setString(pstmt, 7, corpus.getNlcCode()); - pstmt.executeUpdate(); - } - } - - @Override - public Collection searchCORPUSByStanoxCode(String stanoxCode) throws SQLException { - Collection corpuses = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE stanox = ?") - ){ - pstmt.setString(1, stanoxCode); - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - corpuses.add(parseCORPUS(rs)); - } - } - } - return corpuses; - } - - @Override - public Collection searchCORPUSByUicCode(String uicCode) throws SQLException { - Collection corpuses = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE uic_code = ?") - ){ - pstmt.setString(1, uicCode); - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - corpuses.add(parseCORPUS(rs)); - } - } - } - return corpuses; - } - - @Override - public Collection searchCORPUSByCrsCode(String crsCode) throws SQLException { - Collection corpuses = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE crs_code = ?") - ){ - pstmt.setString(1, crsCode); - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - corpuses.add(parseCORPUS(rs)); - } - } - } - return corpuses; - } - - @Override - public Collection searchCORPUSByTiplocCode(String tiplocCode) throws SQLException { - Collection corpuses = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE tiploc_code = ?") - ){ - pstmt.setString(1, tiplocCode); - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - corpuses.add(parseCORPUS(rs)); - } - } - } - return corpuses; - } - - @Override - public Corpus searchCORPUSByNlcCode(String nlcCode) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE nlc_code = ?") - ){ - pstmt.setString(1, nlcCode); - try(ResultSet rs = pstmt.executeQuery()){ - if(rs.next()){ - return parseCORPUS(rs); - } - } - } - return null; - } - - @Override - public List searchCORPUSByName(String name) throws SQLException { - - List corpuses = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "SELECT * FROM corpus WHERE " + - "match(`desc`) against (?) OR " + - "match(short_desc) against (?) " + - "ORDER BY match(`desc`) against (?)+match(short_desc) against (?)" - ) - ){ - pstmt.setString(1, name); - pstmt.setString(2, name); - pstmt.setString(3, name); - pstmt.setString(4, name); - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - corpuses.add(parseCORPUS(rs)); - } - } - } - return corpuses; - } - - private Corpus parseCORPUS(ResultSet rs) throws SQLException{ - Corpus corpus = new Corpus(); - corpus.setStanoxCode(rs.getString("stanox")); - corpus.setUicCode(rs.getString("uic_code")); - corpus.setCrsCode(rs.getString("crs_code")); - corpus.setTiplocCode(rs.getString("tiploc_code")); - corpus.setNlcCode(rs.getString("nlc_code")); - corpus.setLongDescription(rs.getString("desc")); - corpus.setShortDescription(rs.getString("short_desc")); - return corpus; - } - - @Override - public Corpus delete(String nlcCode) throws SQLException { - Corpus deletedEntry = searchCORPUSByNlcCode(nlcCode); - if(deletedEntry!=null){ - try( - Connection conn = getConnection(); - PreparedStatement stmt = conn.prepareStatement("DELETE FROM corpus WHERE nlc_code = ?") - ){ - stmt.setString(1, nlcCode); - stmt.executeUpdate(); - } - } - return deletedEntry; - } -} diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDaoImpl.java b/src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDaoImpl.java new file mode 100644 index 0000000..eab1e1f --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/CorpusDaoImpl.java @@ -0,0 +1,379 @@ +package org.leolo.nrdatad.db.mariadb; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.leolo.nrdatad.db.DatabaseManager; +import org.leolo.nrdatad.db.ParameterStore; +import org.leolo.nrdatad.db.SearchMode; +import org.leolo.nrdatad.model.Corpus; + +import java.sql.*; +import java.util.*; + +public class CorpusDaoImpl extends org.leolo.nrdatad.db.CorpusDao { + + Logger log = LogManager.getLogger(); + + public CorpusDaoImpl(DatabaseManager manager) { + super(manager); + } + + @Override + public Collection executeQuery(org.leolo.nrdatad.db.CorpusDao.Query query) throws SQLException { + Vector corpuses = new Vector<>(); + ParameterStore params = new ParameterStore(); + StringBuilder sql = new StringBuilder(); + if(query.getSearchMode()== SearchMode.MATCH_ALL_GROUP || query.getSearchMode()==SearchMode.MATCH_ANY){ + sql.append("SELECT * FROM corpus WHERE "); + String keyWord; + if(query.getSearchMode() == SearchMode.MATCH_ALL_GROUP){ + sql.append("1=1 "); + keyWord = "AND "; + }else{ + sql.append("1=0 "); + keyWord = "OR "; + } + if(query.getStanox().size()>0){ + sql.append(keyWord).append("stanox IN (") + .append(getQueryParams(query.getStanox().size())).append(") "); + params.addAll(query.getStanox()); + } + if(query.getUicCode().size()>0){ + sql.append(keyWord).append("uic_code IN (") + .append(getQueryParams(query.getUicCode().size())).append(") "); + params.addAll(query.getUicCode()); + } + if(query.getCrsCode().size()>0){ + sql.append(keyWord).append("crs_code IN (") + .append(getQueryParams(query.getCrsCode().size())).append(") "); + params.addAll(query.getCrsCode()); + } + if(query.getTiplocCode().size()>0){ + sql.append(keyWord).append("tiploc_code IN (") + .append(getQueryParams(query.getTiplocCode().size())).append(") "); + params.addAll(query.getTiplocCode()); + } + if(query.getNlcCode().size()>0){ + sql.append(keyWord).append("nlc_code IN(") + .append(getQueryParams(query.getNlcCode().size())).append(") "); + params.addAll(query.getNlcCode()); + } + if(query.getDescription().size()>0){ + sql.append(keyWord).append("("); + boolean hasDesc = false; + for(String str:query.getDescription()){ + if(hasDesc){ + sql.append("OR "); + } + sql.append("(`desc` LIKE ? OR short_desc LIKE ? ) "); + hasDesc = true; + params.add("%"+str+"%"); + params.add("%"+str+"%"); + } + sql.append(") "); + } + log.atDebug().log("SQL={}",sql); + }else{ + log.always().log("Search mode {} is yet to be implemented.", query.getSearchMode()); + } + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement(sql.toString()) + ){ + for(int i=1;i<=params.size();i++){ + log.atDebug().log("Param {} = {}", i, params.get(i)); + setString(pstmt, i, params.get(i)); + } + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + corpuses.add(parseCORPUS(rs)); + } + } + } + return corpuses; + } + + @Override + public void add(@NotNull Corpus corpus) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "INSERT INTO corpus (stanox, uic_code, crs_code, tiploc_code, nlc_code, `desc`, short_desc) " + + "VALUES (?,?,?,?,?,?,?)") + ){ + setString(pstmt, 1, corpus.getStanoxCode()); + setString(pstmt, 2, corpus.getUicCode()); + setString(pstmt, 3, corpus.getCrsCode()); + setString(pstmt, 4, corpus.getTiplocCode()); + setString(pstmt, 5, corpus.getNlcCode()); + setString(pstmt, 6, corpus.getLongDescription()); + setString(pstmt, 7, corpus.getShortDescription()); + pstmt.executeUpdate(); + conn.commit(); + } + } + + @Override + public void addAll(@NotNull Collection datas) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "INSERT INTO corpus (stanox, uic_code, crs_code, tiploc_code, nlc_code, `desc`, short_desc) " + + "VALUES (?,?,?,?,?,?,?)") + ){ + for(Corpus corpus:datas) { + setString(pstmt, 1, corpus.getStanoxCode()); + setString(pstmt, 2, corpus.getUicCode()); + setString(pstmt, 3, corpus.getCrsCode()); + setString(pstmt, 4, corpus.getTiplocCode()); + setString(pstmt, 5, corpus.getNlcCode()); + setString(pstmt, 6, corpus.getLongDescription()); + setString(pstmt, 7, corpus.getShortDescription()); + pstmt.addBatch(); + } + pstmt.executeBatch(); + conn.commit(); + } + } + + + @Override + public void replaceAll(@NotNull Collection datas) throws SQLException { + int totalCount = 0, insertCount = 0, updateCount = 0; + HashSet pendingInsert = new HashSet<>(); + try( + Connection conn = getConnection(); + PreparedStatement psIns = conn.prepareStatement( + "INSERT INTO corpus (stanox, uic_code, crs_code, tiploc_code, `desc`, short_desc, nlc_code) " + + "VALUES (?,?,?,?,?,?,?)"); + PreparedStatement psUpd = conn.prepareStatement( + "UPDATE corpus " + + "SET stanox=?, uic_code=?, crs_code=?, tiploc_code=?, `desc`=?, short_desc=? " + + "WHERE nlc_code = ?" + ) + ){ + for(Corpus corpus:datas){ + totalCount++; + Corpus existing = searchCORPUSByNlcCode(corpus.getNlcCode()); + PreparedStatement stmt = null; + if(corpus.equals(existing)){ + continue; + }else if(existing==null){ + if(pendingInsert.contains(corpus.getNlcCode())){ + continue; + } + pendingInsert.add(corpus.getNlcCode()); + stmt = psIns; + insertCount++; + }else{ + stmt = psUpd; + updateCount++; + } + setString(stmt, 1, corpus.getStanoxCode()); + setString(stmt, 2, corpus.getUicCode()); + setString(stmt, 3, corpus.getCrsCode()); + setString(stmt, 4, corpus.getTiplocCode()); + setString(stmt, 5, corpus.getLongDescription()); + setString(stmt, 6, corpus.getShortDescription()); + setString(stmt, 7, corpus.getNlcCode()); + stmt.addBatch(); + } + if(insertCount>0){ + psIns.executeBatch(); + log.atInfo().log("Inserted {} CORPUS records", insertCount); + } + if(updateCount>0){ + psUpd.executeBatch(); + log.atInfo().log("Updated {} CORPUS records", updateCount); + } + if(insertCount==0 && updateCount==0){ + log.atInfo().log("CORPUS data already up to date. "); + }else{ + conn.commit(); + log.atInfo().log("Done committing CORPUS data"); + } + } + } + + @Override + public void truncateTable() throws SQLException { + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement() + ){ + stmt.executeQuery("TRUNCATE TABLE corpus"); + } + } + + @Override + public boolean hasNlcCode(String nlcCode) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM corpus WHERE nlc_code = ?") + ){ + pstmt.setString(1, nlcCode); + try(ResultSet rs = pstmt.executeQuery()){ + return rs.next(); + } + } + } + + @Override + public void update(Corpus corpus) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "UPDATE corpus " + + "SET stanox=?, uic_code=?, crs_code=?, tiploc_code=?, `desc`=?, short_desc=? " + + "WHERE nlc_code = ?" + ) + ){ + setString(pstmt, 1, corpus.getStanoxCode()); + setString(pstmt, 2, corpus.getUicCode()); + setString(pstmt, 3, corpus.getCrsCode()); + setString(pstmt, 4, corpus.getTiplocCode()); + setString(pstmt, 5, corpus.getLongDescription()); + setString(pstmt, 6, corpus.getShortDescription()); + setString(pstmt, 7, corpus.getNlcCode()); + pstmt.executeUpdate(); + } + } + + @Override + public Collection searchCORPUSByStanoxCode(String stanoxCode) throws SQLException { + Collection corpuses = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE stanox = ?") + ){ + pstmt.setString(1, stanoxCode); + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + corpuses.add(parseCORPUS(rs)); + } + } + } + return corpuses; + } + + @Override + public Collection searchCORPUSByUicCode(String uicCode) throws SQLException { + Collection corpuses = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE uic_code = ?") + ){ + pstmt.setString(1, uicCode); + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + corpuses.add(parseCORPUS(rs)); + } + } + } + return corpuses; + } + + @Override + public Collection searchCORPUSByCrsCode(String crsCode) throws SQLException { + Collection corpuses = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE crs_code = ?") + ){ + pstmt.setString(1, crsCode); + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + corpuses.add(parseCORPUS(rs)); + } + } + } + return corpuses; + } + + @Override + public Collection searchCORPUSByTiplocCode(String tiplocCode) throws SQLException { + Collection corpuses = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE tiploc_code = ?") + ){ + pstmt.setString(1, tiplocCode); + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + corpuses.add(parseCORPUS(rs)); + } + } + } + return corpuses; + } + + @Override + public Corpus searchCORPUSByNlcCode(String nlcCode) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM corpus WHERE nlc_code = ?") + ){ + pstmt.setString(1, nlcCode); + try(ResultSet rs = pstmt.executeQuery()){ + if(rs.next()){ + return parseCORPUS(rs); + } + } + } + return null; + } + + @Override + public List searchCORPUSByName(String name) throws SQLException { + + List corpuses = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT * FROM corpus WHERE " + + "match(`desc`) against (?) OR " + + "match(short_desc) against (?) " + + "ORDER BY match(`desc`) against (?)+match(short_desc) against (?)" + ) + ){ + pstmt.setString(1, name); + pstmt.setString(2, name); + pstmt.setString(3, name); + pstmt.setString(4, name); + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + corpuses.add(parseCORPUS(rs)); + } + } + } + return corpuses; + } + + private Corpus parseCORPUS(ResultSet rs) throws SQLException{ + Corpus corpus = new Corpus(); + corpus.setStanoxCode(rs.getString("stanox")); + corpus.setUicCode(rs.getString("uic_code")); + corpus.setCrsCode(rs.getString("crs_code")); + corpus.setTiplocCode(rs.getString("tiploc_code")); + corpus.setNlcCode(rs.getString("nlc_code")); + corpus.setLongDescription(rs.getString("desc")); + corpus.setShortDescription(rs.getString("short_desc")); + return corpus; + } + + @Override + public Corpus delete(String nlcCode) throws SQLException { + Corpus deletedEntry = searchCORPUSByNlcCode(nlcCode); + if(deletedEntry!=null){ + try( + Connection conn = getConnection(); + PreparedStatement stmt = conn.prepareStatement("DELETE FROM corpus WHERE nlc_code = ?") + ){ + stmt.setString(1, nlcCode); + stmt.executeUpdate(); + } + } + return deletedEntry; + } +} diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java b/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java index cc94d1b..c79479b 100644 --- a/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java @@ -65,16 +65,16 @@ public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager{ @Override public MetadataDao getMetadataDao() { - return new org.leolo.nrdatad.db.mariadb.MetadataDao(this); + return new MetadataDaoImpl(this); } @Override public CorpusDao getCORPUSDao() { - return new org.leolo.nrdatad.db.mariadb.CorpusDao(this); + return new CorpusDaoImpl(this); } @Override public SmartDao getSmartDao() { - return new org.leolo.nrdatad.db.mariadb.SmartDao(this); + return new SmartDaoImpl(this); } } diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java b/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java deleted file mode 100644 index 6bfb918..0000000 --- a/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.leolo.nrdatad.db.mariadb; - -import org.jetbrains.annotations.NotNull; - -import java.sql.*; -import java.util.HashSet; -import java.util.Set; -import java.util.TreeMap; -import java.util.function.BiConsumer; - -public class MetadataDao extends org.leolo.nrdatad.db.MetadataDao { - - private static Object SYNC_TOKEN = new Object(); - - public MetadataDao(DatabaseManager manager){ - super(manager); - } - - @Override - public String getMetadata(String key, String defaultValue) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT value FROM metadata WHERE `key` = ?") - ){ - pstmt.setString(1, key); - try(ResultSet rs = pstmt.executeQuery()){ - if(rs.next()){ - return rs.getString(1); - } - } - } - return defaultValue; - } - - @Override - public void updateMetadata(@NotNull String key, @NotNull String value) throws SQLException { - synchronized (SYNC_TOKEN) { - if (containsKey(key)) { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("UPDATE metadata SET value = ? WHERE `key` = ?") - ){ - pstmt.setString(1, value); - pstmt.setString(2, key); - pstmt.executeUpdate(); - } - } else { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("INSERT INTO metadata (`key`, value) VALUES (?,?)") - ){ - pstmt.setString(1, key); - pstmt.setString(2, value); - pstmt.executeUpdate(); - - } - - } - } - } - - @Override - public Set getKeys() throws SQLException { - HashSet set = new HashSet<>(); - try( - Connection conn = getConnection(); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT `key` FROM metadata") - ){ - while(rs.next()){ - set.add(rs.getString(1)); - } - } - return set; - } - - @Override - public void forEach(BiConsumer action) throws SQLException { - TreeMap map = new TreeMap<>(); - try( - Connection conn = getConnection(); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT `key`, value FROM metadata") - ){ - while(rs.next()){ - map.put(rs.getString(1), rs.getString(2)); - } - } - map.forEach(action); - } - - @Override - public boolean containsKey(String key) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM metadata WHERE `key` = ?") - ){ - pstmt.setString(1, key); - try(ResultSet rs = pstmt.executeQuery()){ - return rs.next(); - } - } - } - - @Override - public int entryCount() throws SQLException { - try( - Connection conn = getConnection(); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery("SELECT COUNT(1) FROM metadata") - ){ - rs.next(); - return rs.getInt(1); - } - } -} diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDaoImpl.java b/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDaoImpl.java new file mode 100644 index 0000000..8a5d5e1 --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDaoImpl.java @@ -0,0 +1,116 @@ +package org.leolo.nrdatad.db.mariadb; + +import org.jetbrains.annotations.NotNull; + +import java.sql.*; +import java.util.HashSet; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.BiConsumer; + +public class MetadataDaoImpl extends org.leolo.nrdatad.db.MetadataDao { + + private static Object SYNC_TOKEN = new Object(); + + public MetadataDaoImpl(DatabaseManager manager){ + super(manager); + } + + @Override + public String getMetadata(String key, String defaultValue) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT value FROM metadata WHERE `key` = ?") + ){ + pstmt.setString(1, key); + try(ResultSet rs = pstmt.executeQuery()){ + if(rs.next()){ + return rs.getString(1); + } + } + } + return defaultValue; + } + + @Override + public void updateMetadata(@NotNull String key, @NotNull String value) throws SQLException { + synchronized (SYNC_TOKEN) { + if (containsKey(key)) { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("UPDATE metadata SET value = ? WHERE `key` = ?") + ){ + pstmt.setString(1, value); + pstmt.setString(2, key); + pstmt.executeUpdate(); + } + } else { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO metadata (`key`, value) VALUES (?,?)") + ){ + pstmt.setString(1, key); + pstmt.setString(2, value); + pstmt.executeUpdate(); + + } + + } + } + } + + @Override + public Set getKeys() throws SQLException { + HashSet set = new HashSet<>(); + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT `key` FROM metadata") + ){ + while(rs.next()){ + set.add(rs.getString(1)); + } + } + return set; + } + + @Override + public void forEach(BiConsumer action) throws SQLException { + TreeMap map = new TreeMap<>(); + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT `key`, value FROM metadata") + ){ + while(rs.next()){ + map.put(rs.getString(1), rs.getString(2)); + } + } + map.forEach(action); + } + + @Override + public boolean containsKey(String key) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM metadata WHERE `key` = ?") + ){ + pstmt.setString(1, key); + try(ResultSet rs = pstmt.executeQuery()){ + return rs.next(); + } + } + } + + @Override + public int entryCount() throws SQLException { + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT COUNT(1) FROM metadata") + ){ + rs.next(); + return rs.getInt(1); + } + } +} diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/SmartDao.java b/src/main/java/org/leolo/nrdatad/db/mariadb/SmartDao.java deleted file mode 100644 index 33cce28..0000000 --- a/src/main/java/org/leolo/nrdatad/db/mariadb/SmartDao.java +++ /dev/null @@ -1,322 +0,0 @@ -package org.leolo.nrdatad.db.mariadb; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.leolo.nrdatad.db.DatabaseManager; -import org.leolo.nrdatad.db.ParameterStore; -import org.leolo.nrdatad.db.SearchMode; -import org.leolo.nrdatad.model.Smart; -import org.leolo.nrdatad.model.SmartEvent; -import org.leolo.nrdatad.model.SmartStepType; -import org.leolo.nrdatad.util.Range; - -import java.sql.*; -import java.util.Collection; -import java.util.Vector; - -public class SmartDao extends org.leolo.nrdatad.db.SmartDao { - Logger log = LogManager.getLogger(); - - public SmartDao(DatabaseManager manager) { - super(manager); - } - - @Override - public void add(Smart smart) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "INSERT INTO smart (" + - "td, from_berth, to_berth, from_line, to_line, breth_offset, platform, event, route, " + - "stanox, station_name, step_type, comment" + - ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)") - ){ - setString(pstmt, 1, smart.getTd()); - setString(pstmt, 2, smart.getFromBerth()); - setString(pstmt, 3, smart.getToBerth()); - setString(pstmt, 4, smart.getFromLine()); - setString(pstmt, 5, smart.getToLine()); - setInt (pstmt, 6, smart.getBerthOffset()); - setString(pstmt, 7, smart.getPlatform()); - setString(pstmt, 8, smart.getEvent().getCode()); - setString(pstmt, 9, smart.getRoute()); - setString(pstmt, 10, smart.getStanox()); - setString(pstmt, 11, smart.getStationName()); - setString(pstmt, 12, smart.getStepType().getCode()); - setString(pstmt, 13, smart.getComment()); - pstmt.executeUpdate(); - conn.commit(); - } - } - - @Override - public void addAll(Collection smarts) throws SQLException { - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "INSERT INTO smart (" + - "td, from_berth, to_berth, from_line, to_line, breth_offset, platform, event, route, " + - "stanox, station_name, step_type, comment" + - ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)") - ){ - for(Smart smart:smarts){ - setString(pstmt, 1, smart.getTd()); - setString(pstmt, 2, smart.getFromBerth()); - setString(pstmt, 3, smart.getToBerth()); - setString(pstmt, 4, smart.getFromLine()); - setString(pstmt, 5, smart.getToLine()); - setInt (pstmt, 6, smart.getBerthOffset()); - setString(pstmt, 7, smart.getPlatform()); - setString(pstmt, 8, smart.getEvent().getCode()); - setString(pstmt, 9, smart.getRoute()); - setString(pstmt, 10, smart.getStanox()); - setString(pstmt, 11, smart.getStationName()); - setString(pstmt, 12, smart.getStepType().getCode()); - setString(pstmt, 13, smart.getComment()); - pstmt.addBatch(); - } - pstmt.executeBatch(); - conn.commit(); - } - } - - @Override - public void truncateTable() throws SQLException { - try( - Connection conn = getConnection(); - Statement stmt = conn.createStatement() - ){ - stmt.executeUpdate("TRUNCATE TABLE smart"); - } - } - - private Smart parseResultSet(ResultSet rs) throws SQLException{ - Smart smart = new Smart(); - smart.setSmartId(rs.getInt("smart_id")); - smart.setTd(rs.getString("td")); - smart.setFromBerth(rs.getString("from_berth")); - smart.setToBerth(rs.getString("to_berth")); - smart.setFromLine(rs.getString("from_line")); - smart.setToLine(rs.getString("to_line")); - smart.setBerthOffset(rs.getInt("berth_offset")); - smart.setPlatform(rs.getString("platform")); - smart.setEvent(SmartEvent.parseCode(rs.getString("event"))); - smart.setRoute(rs.getString("route")); - smart.setStanox(rs.getString("stanox")); - smart.setStationName(rs.getString("station_name")); - smart.setStepType(SmartStepType.parseCode(rs.getString("step_type"))); - smart.setComment(rs.getString("comment")); - return smart; - } - - @Override - public Collection searchSmartByBerth(String fromBerth, String toBerth) throws SQLException { - Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM smart WHERE from_berth = ? AND to_berth = ?"); - ){ - pstmt.setString(1, fromBerth); - pstmt.setString(2, toBerth); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection searchFromByBerth(String fromBerth) throws SQLException { - Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM smart WHERE from_berth =?"); - ){ - pstmt.setString(1, fromBerth); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection searchToBerth(String toBerth) throws SQLException {Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM smart WHERE to_berth = ?"); - ){ - pstmt.setString(1, toBerth); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection searchSmartByBerthLine(String fromBerth, String toBerth, String fromLine, String toLine) throws SQLException { - Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "SELECT * FROM smart WHERE from_berth = ? AND to_berth = ? AND from_line = ? AND to_line = ?"); - ){ - pstmt.setString(1, fromBerth); - pstmt.setString(2, toBerth); - pstmt.setString(3, fromLine); - pstmt.setString(4, toLine); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection searchSmartByFromBerthLine(String fromBerth, String fromLine) throws SQLException { - Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "SELECT * FROM smart WHERE from_berth = ? AND to_berth = ? AND from_line = ? AND to_line = ?"); - ){ - pstmt.setString(1, fromBerth); - pstmt.setString(2, fromLine); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection searchSmartByToBerthLine(String toBerth, String toLine) throws SQLException { - Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "SELECT * FROM smart WHERE from_berth = ? AND to_berth = ? AND from_line = ? AND to_line = ?"); - ){ - pstmt.setString(1, toBerth); - pstmt.setString(2, toLine); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection searchSmartByStanox(String stanox) throws SQLException {Vector vector = new Vector<>(); - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement( - "SELECT * FROM smart WHERE stanox = ?"); - ){ - pstmt.setString(1, stanox); - try(ResultSet rs = pstmt.executeQuery()){ - vector.add(parseResultSet(rs)); - } - } - return vector; - } - - @Override - public Collection executeQuery(Query query) throws SQLException { - Vector smarts = new Vector<>(); - ParameterStore ps = new ParameterStore(); - StringBuilder sql = new StringBuilder(); - if(query.getSearchMode()== SearchMode.MATCH_ALL_GROUP || query.getSearchMode()==SearchMode.MATCH_ANY){ - sql.append("SELECT * FROM smart WHERE "); - String keyWord; - if(query.getSearchMode() == SearchMode.MATCH_ALL_GROUP){ - sql.append("1=1 "); - keyWord = "AND "; - }else{ - sql.append("1=0 "); - keyWord = "OR "; - } - if(query.getTd().size()>0){ - sql.append(keyWord).append("td IN (").append(getQueryParams(query.getTd().size())).append(") "); - ps.addAll(query.getTd()); - } - if(query.getFromBerth().size()>0){ - sql.append(keyWord).append("from_berth IN(").append(getQueryParams(query.getFromBerth().size())).append(") "); - ps.addAll(query.getFromBerth()); - } - if(query.getToBerth().size()>0){ - sql.append(keyWord).append("to_berth IN(").append(getQueryParams(query.getToBerth().size())).append(") "); - ps.addAll(query.getToBerth()); - } - if(query.getFromLine().size()>0){ - sql.append(keyWord).append("from_line IN(").append(getQueryParams(query.getFromLine().size())).append(") "); - ps.addAll(query.getFromLine()); - } - if (query.getToLine().size()>0){ - sql.append(keyWord).append("to_line (").append(getQueryParams(query.getToLine().size())).append(") "); - ps.addAll(query.getToLine()); - } - if (query.getBerthOffset().size()>0){ - sql.append(keyWord).append("(1=0 "); - for(Range range: query.getBerthOffset()){ - sql.append("OR (berth_offset BETWEEN ? AND ?) "); - ps.addObject(range.getLowerBound()); - ps.addObject(range.getUpperBound()); - } - sql.append(") "); - } - if(query.getPlatform().size()>0){ - sql.append(keyWord).append("platform IN(").append(getQueryParams(query.getPlatform().size())).append(") "); - ps.addAll(query.getPlatform()); - } - if(query.getEvent().size()>0){ - sql.append(keyWord).append("event IN(").append(getQueryParams(query.getEvent().size())).append(") "); - ps.addAllObject(query.getEvent()); - } - if(query.getRoute().size()>0){ - sql.append(keyWord).append("route IN(").append(getQueryParams(query.getRoute().size())).append(") "); - ps.addAll(query.getRoute()); - } - if(query.getStanox().size()>0){ - sql.append(keyWord).append("stanox IN(").append(getQueryParams(query.getStanox().size())).append(") "); - ps.addAll(query.getStanox()); - } - if(query.getStationName().size()>0){ - sql.append(keyWord).append("(1=0 "); - for(String stationName: query.getStationName()){ - sql.append("OR station_name LIKE ? "); - ps.add("%"+stationName+"%"); - } - sql.append(") "); - } - if(query.getStepType().size()>0){ - sql.append(keyWord).append("step_type IN(").append(getQueryParams(query.getStepType().size())).append(") "); - ps.addAllObject(query.getStepType()); - } - if(query.getComment().size()>0){ - sql.append(keyWord).append("(1=0 "); - for(String comment: query.getComment()){ - sql.append("OR comment LIKE ? "); - ps.add("%"+comment+"%"); - } - sql.append(") "); - } - } - try( - Connection conn = getConnection(); - PreparedStatement pstmt = conn.prepareStatement(sql.toString()) - ){ - for(int i=1;i<=ps.size();i++){ - log.atDebug().log("Param {} = {}", i, ps.get(i)); - setString(pstmt, i, ps.get(i)); - } - try(ResultSet rs = pstmt.executeQuery()){ - while(rs.next()){ - smarts.add(parseResultSet(rs)); - } - } - } - return smarts; - } -} diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/SmartDaoImpl.java b/src/main/java/org/leolo/nrdatad/db/mariadb/SmartDaoImpl.java new file mode 100644 index 0000000..dd25cf9 --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/SmartDaoImpl.java @@ -0,0 +1,322 @@ +package org.leolo.nrdatad.db.mariadb; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.leolo.nrdatad.db.DatabaseManager; +import org.leolo.nrdatad.db.ParameterStore; +import org.leolo.nrdatad.db.SearchMode; +import org.leolo.nrdatad.model.Smart; +import org.leolo.nrdatad.model.SmartEvent; +import org.leolo.nrdatad.model.SmartStepType; +import org.leolo.nrdatad.util.Range; + +import java.sql.*; +import java.util.Collection; +import java.util.Vector; + +public class SmartDaoImpl extends org.leolo.nrdatad.db.SmartDao { + Logger log = LogManager.getLogger(); + + public SmartDaoImpl(DatabaseManager manager) { + super(manager); + } + + @Override + public void add(Smart smart) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "INSERT INTO smart (" + + "td, from_berth, to_berth, from_line, to_line, breth_offset, platform, event, route, " + + "stanox, station_name, step_type, comment" + + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)") + ){ + setString(pstmt, 1, smart.getTd()); + setString(pstmt, 2, smart.getFromBerth()); + setString(pstmt, 3, smart.getToBerth()); + setString(pstmt, 4, smart.getFromLine()); + setString(pstmt, 5, smart.getToLine()); + setInt (pstmt, 6, smart.getBerthOffset()); + setString(pstmt, 7, smart.getPlatform()); + setString(pstmt, 8, smart.getEvent().getCode()); + setString(pstmt, 9, smart.getRoute()); + setString(pstmt, 10, smart.getStanox()); + setString(pstmt, 11, smart.getStationName()); + setString(pstmt, 12, smart.getStepType().getCode()); + setString(pstmt, 13, smart.getComment()); + pstmt.executeUpdate(); + conn.commit(); + } + } + + @Override + public void addAll(Collection smarts) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "INSERT INTO smart (" + + "td, from_berth, to_berth, from_line, to_line, breth_offset, platform, event, route, " + + "stanox, station_name, step_type, comment" + + ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)") + ){ + for(Smart smart:smarts){ + setString(pstmt, 1, smart.getTd()); + setString(pstmt, 2, smart.getFromBerth()); + setString(pstmt, 3, smart.getToBerth()); + setString(pstmt, 4, smart.getFromLine()); + setString(pstmt, 5, smart.getToLine()); + setInt (pstmt, 6, smart.getBerthOffset()); + setString(pstmt, 7, smart.getPlatform()); + setString(pstmt, 8, smart.getEvent().getCode()); + setString(pstmt, 9, smart.getRoute()); + setString(pstmt, 10, smart.getStanox()); + setString(pstmt, 11, smart.getStationName()); + setString(pstmt, 12, smart.getStepType().getCode()); + setString(pstmt, 13, smart.getComment()); + pstmt.addBatch(); + } + pstmt.executeBatch(); + conn.commit(); + } + } + + @Override + public void truncateTable() throws SQLException { + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement() + ){ + stmt.executeUpdate("TRUNCATE TABLE smart"); + } + } + + private Smart parseResultSet(ResultSet rs) throws SQLException{ + Smart smart = new Smart(); + smart.setSmartId(rs.getInt("smart_id")); + smart.setTd(rs.getString("td")); + smart.setFromBerth(rs.getString("from_berth")); + smart.setToBerth(rs.getString("to_berth")); + smart.setFromLine(rs.getString("from_line")); + smart.setToLine(rs.getString("to_line")); + smart.setBerthOffset(rs.getInt("berth_offset")); + smart.setPlatform(rs.getString("platform")); + smart.setEvent(SmartEvent.parseCode(rs.getString("event"))); + smart.setRoute(rs.getString("route")); + smart.setStanox(rs.getString("stanox")); + smart.setStationName(rs.getString("station_name")); + smart.setStepType(SmartStepType.parseCode(rs.getString("step_type"))); + smart.setComment(rs.getString("comment")); + return smart; + } + + @Override + public Collection searchSmartByBerth(String fromBerth, String toBerth) throws SQLException { + Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM smart WHERE from_berth = ? AND to_berth = ?"); + ){ + pstmt.setString(1, fromBerth); + pstmt.setString(2, toBerth); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection searchFromByBerth(String fromBerth) throws SQLException { + Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM smart WHERE from_berth =?"); + ){ + pstmt.setString(1, fromBerth); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection searchToBerth(String toBerth) throws SQLException {Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM smart WHERE to_berth = ?"); + ){ + pstmt.setString(1, toBerth); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection searchSmartByBerthLine(String fromBerth, String toBerth, String fromLine, String toLine) throws SQLException { + Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT * FROM smart WHERE from_berth = ? AND to_berth = ? AND from_line = ? AND to_line = ?"); + ){ + pstmt.setString(1, fromBerth); + pstmt.setString(2, toBerth); + pstmt.setString(3, fromLine); + pstmt.setString(4, toLine); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection searchSmartByFromBerthLine(String fromBerth, String fromLine) throws SQLException { + Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT * FROM smart WHERE from_berth = ? AND to_berth = ? AND from_line = ? AND to_line = ?"); + ){ + pstmt.setString(1, fromBerth); + pstmt.setString(2, fromLine); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection searchSmartByToBerthLine(String toBerth, String toLine) throws SQLException { + Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT * FROM smart WHERE from_berth = ? AND to_berth = ? AND from_line = ? AND to_line = ?"); + ){ + pstmt.setString(1, toBerth); + pstmt.setString(2, toLine); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection searchSmartByStanox(String stanox) throws SQLException {Vector vector = new Vector<>(); + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT * FROM smart WHERE stanox = ?"); + ){ + pstmt.setString(1, stanox); + try(ResultSet rs = pstmt.executeQuery()){ + vector.add(parseResultSet(rs)); + } + } + return vector; + } + + @Override + public Collection executeQuery(Query query) throws SQLException { + Vector smarts = new Vector<>(); + ParameterStore ps = new ParameterStore(); + StringBuilder sql = new StringBuilder(); + if(query.getSearchMode()== SearchMode.MATCH_ALL_GROUP || query.getSearchMode()==SearchMode.MATCH_ANY){ + sql.append("SELECT * FROM smart WHERE "); + String keyWord; + if(query.getSearchMode() == SearchMode.MATCH_ALL_GROUP){ + sql.append("1=1 "); + keyWord = "AND "; + }else{ + sql.append("1=0 "); + keyWord = "OR "; + } + if(query.getTd().size()>0){ + sql.append(keyWord).append("td IN (").append(getQueryParams(query.getTd().size())).append(") "); + ps.addAll(query.getTd()); + } + if(query.getFromBerth().size()>0){ + sql.append(keyWord).append("from_berth IN(").append(getQueryParams(query.getFromBerth().size())).append(") "); + ps.addAll(query.getFromBerth()); + } + if(query.getToBerth().size()>0){ + sql.append(keyWord).append("to_berth IN(").append(getQueryParams(query.getToBerth().size())).append(") "); + ps.addAll(query.getToBerth()); + } + if(query.getFromLine().size()>0){ + sql.append(keyWord).append("from_line IN(").append(getQueryParams(query.getFromLine().size())).append(") "); + ps.addAll(query.getFromLine()); + } + if (query.getToLine().size()>0){ + sql.append(keyWord).append("to_line (").append(getQueryParams(query.getToLine().size())).append(") "); + ps.addAll(query.getToLine()); + } + if (query.getBerthOffset().size()>0){ + sql.append(keyWord).append("(1=0 "); + for(Range range: query.getBerthOffset()){ + sql.append("OR (berth_offset BETWEEN ? AND ?) "); + ps.addObject(range.getLowerBound()); + ps.addObject(range.getUpperBound()); + } + sql.append(") "); + } + if(query.getPlatform().size()>0){ + sql.append(keyWord).append("platform IN(").append(getQueryParams(query.getPlatform().size())).append(") "); + ps.addAll(query.getPlatform()); + } + if(query.getEvent().size()>0){ + sql.append(keyWord).append("event IN(").append(getQueryParams(query.getEvent().size())).append(") "); + ps.addAllObject(query.getEvent()); + } + if(query.getRoute().size()>0){ + sql.append(keyWord).append("route IN(").append(getQueryParams(query.getRoute().size())).append(") "); + ps.addAll(query.getRoute()); + } + if(query.getStanox().size()>0){ + sql.append(keyWord).append("stanox IN(").append(getQueryParams(query.getStanox().size())).append(") "); + ps.addAll(query.getStanox()); + } + if(query.getStationName().size()>0){ + sql.append(keyWord).append("(1=0 "); + for(String stationName: query.getStationName()){ + sql.append("OR station_name LIKE ? "); + ps.add("%"+stationName+"%"); + } + sql.append(") "); + } + if(query.getStepType().size()>0){ + sql.append(keyWord).append("step_type IN(").append(getQueryParams(query.getStepType().size())).append(") "); + ps.addAllObject(query.getStepType()); + } + if(query.getComment().size()>0){ + sql.append(keyWord).append("(1=0 "); + for(String comment: query.getComment()){ + sql.append("OR comment LIKE ? "); + ps.add("%"+comment+"%"); + } + sql.append(") "); + } + } + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement(sql.toString()) + ){ + for(int i=1;i<=ps.size();i++){ + log.atDebug().log("Param {} = {}", i, ps.get(i)); + setString(pstmt, i, ps.get(i)); + } + try(ResultSet rs = pstmt.executeQuery()){ + while(rs.next()){ + smarts.add(parseResultSet(rs)); + } + } + } + return smarts; + } +}