diff --git a/fda-query-service/services/src/main/java/at/tuwien/mapper/QueryMapper.java b/fda-query-service/services/src/main/java/at/tuwien/mapper/QueryMapper.java index 4cc8b381908beb8914085ba19e09c432e1c8f2cc..f56c15c42a309f326ece44b3e6081a11d3d7b259 100644 --- a/fda-query-service/services/src/main/java/at/tuwien/mapper/QueryMapper.java +++ b/fda-query-service/services/src/main/java/at/tuwien/mapper/QueryMapper.java @@ -174,10 +174,23 @@ public interface QueryMapper { if (timestamp == null) { throw new IllegalArgumentException("Timestamp must be provided"); } - return "SELECT COUNT(*) FROM " + query.toLowerCase(Locale.ROOT).split("from ")[1] + - " FOR SYSTEM_TIME AS OF TIMESTAMP '" + - LocalDateTime.ofInstant(timestamp, ZoneId.of("Europe/Vienna")) + - "';"; + StringBuilder sb = new StringBuilder(); + sb.append("SELECT COUNT(*) FROM"); + if(query.contains("where")) { + sb.append(query.toLowerCase(Locale.ROOT).split("from ")[1].split("where")[0]); + } else { + sb.append(query.toLowerCase(Locale.ROOT).split("from ")[1]); + } + sb.append("FOR SYSTEM_TIME AS OF TIMESTAMP '"); + sb.append(LocalDateTime.ofInstant(timestamp, ZoneId.of("Europe/Vienna"))); + sb.append("' "); + if(query.contains("where")) { + sb.append("where "); + sb.append(query.toLowerCase(Locale.ROOT).split("from ")[1].split("where")[1]); + } + sb.append(";"); + log.debug(sb.toString()); + return sb.toString(); } default String queryToRawTimestampedQuery(String query, Database database, Instant timestamp, Long page, Long size) throws ImageNotSupportedException { @@ -186,18 +199,29 @@ public interface QueryMapper { throw new ImageNotSupportedException("Currently only MariaDB is supported"); } if (timestamp == null) { - timestamp = Instant.now(); + throw new IllegalArgumentException("Please provide a timestamp before"); + } + StringBuilder sb = new StringBuilder(); + if(query.contains("where")) { + sb.append(query.toLowerCase(Locale.ROOT).split("where")[0]); + } else { + sb.append(query.toLowerCase(Locale.ROOT)); + } + sb.append("FOR SYSTEM_TIME AS OF TIMESTAMP '"); + sb.append(LocalDateTime.ofInstant(timestamp, ZoneId.of("Europe/Vienna"))); + sb.append("' "); + if(query.contains("where")) { + sb.append("where"); + sb.append(query.toLowerCase(Locale.ROOT).split("from ")[1].split("where")[1]); } if(size != null && page != null && size > 0 && page >=0) { - return query + - " FOR SYSTEM_TIME AS OF TIMESTAMP '" + - LocalDateTime.ofInstant(timestamp, ZoneId.of("Europe/Vienna")) + - "' LIMIT " + size + " OFFSET " + (page*size) + - ";"; + sb.append(" LIMIT " + size + " OFFSET " + (page*size)); } - return query + - " FOR SYSTEM_TIME AS OF TIMESTAMP '" + - LocalDateTime.ofInstant(timestamp, ZoneId.of("Europe/Vienna")) + "';"; + sb.append(";"); + + log.debug(sb.toString()); + + return sb.toString(); }