From 5f956af5f19d59e875068b4bed70b20269081563 Mon Sep 17 00:00:00 2001 From: LO Kam Tao Leo Date: Fri, 16 Dec 2022 21:05:09 +0000 Subject: [PATCH] Partial implementation of TrainAssociationDao --- src/main/java/org/leolo/nrdatad/db/BaseDao.java | 29 ++++- .../java/org/leolo/nrdatad/db/DatabaseManager.java | 2 + .../org/leolo/nrdatad/db/TrainAssociationDao.java | 38 ++++++ .../leolo/nrdatad/db/mariadb/DatabaseManager.java | 10 +- .../db/mariadb/TrainAssociationDaoImpl.java | 137 +++++++++++++++++++++ .../nrdatad/exception/NoSuchRecordException.java | 37 ++++++ .../org/leolo/nrdatad/db/test/DatabaseManager.java | 9 +- 7 files changed, 251 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/leolo/nrdatad/db/TrainAssociationDao.java create mode 100644 src/main/java/org/leolo/nrdatad/db/mariadb/TrainAssociationDaoImpl.java create mode 100644 src/main/java/org/leolo/nrdatad/exception/NoSuchRecordException.java diff --git a/src/main/java/org/leolo/nrdatad/db/BaseDao.java b/src/main/java/org/leolo/nrdatad/db/BaseDao.java index 870bced..0d5430b 100644 --- a/src/main/java/org/leolo/nrdatad/db/BaseDao.java +++ b/src/main/java/org/leolo/nrdatad/db/BaseDao.java @@ -1,14 +1,19 @@ package org.leolo.nrdatad.db; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.sql.Types; +import java.sql.*; +import java.util.Calendar; public abstract class BaseDao { + public enum ReplaceResult { + INSERTED, + UPDATED, + NO_ACTION; + } + private DatabaseManager manager; public BaseDao(DatabaseManager manager){ @@ -31,6 +36,22 @@ public abstract class BaseDao { stmt.setInt(pos, val); } + protected void setDate(PreparedStatement stmt, int pos, @Nullable java.util.Date data) throws SQLException{ + if(data==null){ + stmt.setNull(pos, Types.DATE); + } else { + stmt.setTimestamp(pos, new Timestamp(data.getTime())); + } + } + + protected void setDate(PreparedStatement stmt, int pos, @Nullable java.util.Date data, @NotNull Calendar calendar) throws SQLException{ + if(data==null){ + stmt.setNull(pos, Types.DATE); + } else { + stmt.setTimestamp(pos, new Timestamp(data.getTime()), calendar); + } + } + protected String getQueryParams(int count){ if(count <= 0){ throw new IllegalArgumentException("count must be greater than 0"); diff --git a/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java b/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java index 062177b..c5bacfe 100644 --- a/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java +++ b/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java @@ -18,4 +18,6 @@ public interface DatabaseManager { public SmartDao getSmartDao(); public TiplocDao getTiplocDao(); + + public TrainAssociationDao getTrainAssociationDao(); } diff --git a/src/main/java/org/leolo/nrdatad/db/TrainAssociationDao.java b/src/main/java/org/leolo/nrdatad/db/TrainAssociationDao.java new file mode 100644 index 0000000..f5d580e --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/TrainAssociationDao.java @@ -0,0 +1,38 @@ +package org.leolo.nrdatad.db; + +import org.leolo.nrdatad.model.ScheduleAssociation; + +import java.sql.SQLException; + +public abstract class TrainAssociationDao extends BaseDao{ + + + + public TrainAssociationDao(DatabaseManager manager) { + super(manager); + } + + public abstract void insert(ScheduleAssociation scheduleAssociation) throws SQLException; + + public abstract boolean hasTrainAssociation(String auid) throws SQLException; + + public final boolean hasTrainAssociation(ScheduleAssociation scheduleAssociation) throws SQLException { + return hasTrainAssociation(scheduleAssociation.getAuid()); + } + + public abstract void update(ScheduleAssociation scheduleAssociation) throws SQLException; + + public abstract void updateLastCheck(String auid) throws SQLException; + + public final void updateLastCheck(ScheduleAssociation scheduleAssociation) throws SQLException{ + updateLastCheck(scheduleAssociation.getAuid()); + } + + public abstract ReplaceResult replace(ScheduleAssociation scheduleAssociation) throws SQLException; + + public abstract int getHashCode(String auid) throws SQLException; + + public final int getHashCode(ScheduleAssociation scheduleAssociation) throws SQLException{ + return getHashCode(scheduleAssociation.getAuid()); + } +} 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 9a7b67e..7e24992 100644 --- a/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java @@ -3,10 +3,7 @@ package org.leolo.nrdatad.db.mariadb; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.leolo.nrdatad.ConfigurationManager; -import org.leolo.nrdatad.db.CorpusDao; -import org.leolo.nrdatad.db.MetadataDao; -import org.leolo.nrdatad.db.SmartDao; -import org.leolo.nrdatad.db.TiplocDao; +import org.leolo.nrdatad.db.*; import org.mariadb.jdbc.MariaDbPoolDataSource; import java.sql.*; @@ -83,4 +80,9 @@ public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager{ public TiplocDao getTiplocDao() { return new TiplocDaoImpl(this); } + + @Override + public TrainAssociationDao getTrainAssociationDao() { + return null; + } } diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/TrainAssociationDaoImpl.java b/src/main/java/org/leolo/nrdatad/db/mariadb/TrainAssociationDaoImpl.java new file mode 100644 index 0000000..3209516 --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/TrainAssociationDaoImpl.java @@ -0,0 +1,137 @@ +package org.leolo.nrdatad.db.mariadb; + +import org.leolo.nrdatad.db.DatabaseManager; +import org.leolo.nrdatad.db.TrainAssociationDao; +import org.leolo.nrdatad.exception.NoSuchRecordException; +import org.leolo.nrdatad.model.ScheduleAssociation; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TrainAssociationDaoImpl extends TrainAssociationDao { + + public TrainAssociationDaoImpl(DatabaseManager manager) { + super(manager); + } + + @Override + public void insert(ScheduleAssociation scheduleAssociation) throws SQLException { + try ( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO train_association (" + + "auid, main_uid, asso_uid, start_date, end_date, " + //1-5 + "asso_days, asso_type, date_ind, asso_loc, base_suffix, " + //6-10 + "asso_suffix, stp_ind, hash_code, last_chk) " + //11-14 + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())") + ){ + setString(pstmt, 1, scheduleAssociation.getAuid()); + setString(pstmt, 2, scheduleAssociation.getMainUid()); + setString(pstmt, 3, scheduleAssociation.getAssoUid()); + setDate (pstmt, 4, scheduleAssociation.getStartDate()); + setDate (pstmt, 5, scheduleAssociation.getEndDate()); + setString(pstmt, 6, scheduleAssociation.getAssoDays()); + setString(pstmt, 7, scheduleAssociation.getAssociationCategory().getCode()); + setInt (pstmt, 8, scheduleAssociation.getAssociationDate()); + setString(pstmt, 9, scheduleAssociation.getAssociationLocation()); + setString(pstmt, 10, scheduleAssociation.getBaseLocationSuffix()); + setString(pstmt, 11, scheduleAssociation.getAssocLocationSuffix()); + setString(pstmt, 12, scheduleAssociation.getStpIndicator().getCode()); + setInt (pstmt, 13, scheduleAssociation.hashCode()); + pstmt.executeUpdate(); + conn.commit(); + } + } + + @Override + public boolean hasTrainAssociation(String auid) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM train_association WHERE auid = ?") + ){ + setString(pstmt, 1, auid); + try(ResultSet rs = pstmt.executeQuery()){ + return rs.next(); + } + } + } + + @Override + public void update(ScheduleAssociation scheduleAssociation) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("UPDATE train_association SET " + + "main_uid=?, asso_uid=?, start_date=?, end_date=?, asso_days=?," + + "asso_type=?,date_ind=?,asso_loc=?,base_suffix=?, asso_suffix=?," + + "stp_ind=?, hash_code=?,last_chk=NOW() WHERE auid=?") + ){ + setString(pstmt, 1, scheduleAssociation.getMainUid()); + setString(pstmt, 2, scheduleAssociation.getAssoUid()); + setDate (pstmt, 3, scheduleAssociation.getStartDate()); + setDate (pstmt, 4, scheduleAssociation.getEndDate()); + setString(pstmt, 5, scheduleAssociation.getAssoDays()); + setString(pstmt, 6, scheduleAssociation.getAssociationCategory().getCode()); + setInt (pstmt, 7, scheduleAssociation.getAssociationDate()); + setString(pstmt, 8, scheduleAssociation.getAssociationLocation()); + setString(pstmt, 9, scheduleAssociation.getBaseLocationSuffix()); + setString(pstmt, 10, scheduleAssociation.getAssocLocationSuffix()); + setString(pstmt, 11, scheduleAssociation.getStpIndicator().getCode()); + setInt (pstmt, 12, scheduleAssociation.hashCode()); + setString(pstmt, 13, scheduleAssociation.getAuid()); + pstmt.executeUpdate(); + conn.commit(); + } + } + + @Override + public void updateLastCheck(String auid) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("UPDATE train_association SET last_chk = NOW() WHERE auid = ?") + ){ + setString(pstmt,1, auid); + pstmt.executeUpdate(); + conn.commit(); + } + } + + @Override + public ReplaceResult replace(ScheduleAssociation scheduleAssociation) throws SQLException { + Object checkResult = _getHashCode(scheduleAssociation.getAuid()); + if(checkResult==null){ + insert(scheduleAssociation); + return ReplaceResult.INSERTED; + } else if (((int)checkResult) == scheduleAssociation.hashCode()){ + updateLastCheck(scheduleAssociation); + return ReplaceResult.NO_ACTION; + } else { + update(scheduleAssociation); + return ReplaceResult.UPDATED; + } + } + + @Override + public int getHashCode(String auid) throws SQLException { + Object result = _getHashCode(auid); + if(result instanceof Integer){ + return (Integer) result; + } + throw new NoSuchRecordException(); + } + + private Object _getHashCode(String auid) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT hash_code FROM train_association WHERE auid = ?") + ){ + setString(pstmt, 1, auid); + try (ResultSet rs = pstmt.executeQuery()){ + if(rs.next()){ + return rs.getInt(1); + } + } + } + return null; + } +} diff --git a/src/main/java/org/leolo/nrdatad/exception/NoSuchRecordException.java b/src/main/java/org/leolo/nrdatad/exception/NoSuchRecordException.java new file mode 100644 index 0000000..430707f --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/exception/NoSuchRecordException.java @@ -0,0 +1,37 @@ +package org.leolo.nrdatad.exception; + +import java.sql.SQLException; + +public class NoSuchRecordException extends SQLException { + + public NoSuchRecordException(String reason, String SQLState, int vendorCode) { + super(reason, SQLState, vendorCode); + } + + public NoSuchRecordException(String reason, String SQLState) { + super(reason, SQLState); + } + + public NoSuchRecordException(String reason) { + super(reason); + } + + public NoSuchRecordException() { + } + + public NoSuchRecordException(Throwable cause) { + super(cause); + } + + public NoSuchRecordException(String reason, Throwable cause) { + super(reason, cause); + } + + public NoSuchRecordException(String reason, String sqlState, Throwable cause) { + super(reason, sqlState, cause); + } + + public NoSuchRecordException(String reason, String sqlState, int vendorCode, Throwable cause) { + super(reason, sqlState, vendorCode, cause); + } +} diff --git a/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java b/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java index 8248409..7d7dc43 100644 --- a/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java +++ b/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java @@ -1,9 +1,7 @@ package org.leolo.nrdatad.db.test; -import org.leolo.nrdatad.db.CorpusDao; +import org.leolo.nrdatad.db.*; import org.leolo.nrdatad.db.MetadataDao; -import org.leolo.nrdatad.db.SmartDao; -import org.leolo.nrdatad.db.TiplocDao; import java.sql.Connection; import java.sql.SQLException; @@ -35,6 +33,11 @@ public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager { } @Override + public TrainAssociationDao getTrainAssociationDao() { + return null; + } + + @Override public MetadataDao getMetadataDao() { return null; }