From 96d0c351e121aabd78a078cb67ce05087574fa78 Mon Sep 17 00:00:00 2001 From: emtunhei <emtunhei@stud.ntnu.no> Date: Fri, 11 Mar 2022 11:36:22 +0100 Subject: [PATCH] Added functional functionality to compare dates and finds the date that will reset kwh to 0! --- src/main/java/com/application/DB/DB.java | 138 +++++++++++++++------ target/classes/com/application/DB/DB.class | Bin 8126 -> 10627 bytes 2 files changed, 102 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index ca1ceb1..600fb7c 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -24,7 +24,12 @@ import java.util.*; public class DB { private static Job queryJob; - private static SimpleDateFormat dateFormat; + + private static SimpleDateFormat getDateFormat(){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + return dateFormat; + } /** * Retrieves the credentials file @@ -46,7 +51,9 @@ public class DB { } public static void main(String[] args) throws Exception { - getKwh(); + //getKwh(); + //getName(); + getZeroPointDate(); } @@ -106,15 +113,11 @@ public class DB { // Initializing the data map to store the results Map<String, Number> data = new HashMap<>(); - // Initializing the date format - DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - // Preparing a query statement final String sqlStatement = "SELECT TimeStamp, VariantValue " + "FROM sf-drying-optimization.124.int_sd_winccsensordata " + - "WHERE TimeStamp BETWEEN \"2021-01-25 08:51:03\" " + - "AND \"2021-01-28 11:10:09\" ORDER BY TimeStamp ASC"; + "WHERE TimeStamp BETWEEN \"2021-01-30 08:51:03\" " + + "AND \"2021-02-15 11:10:09\" ORDER BY TimeStamp ASC"; // Creates a job configuration queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build()); @@ -130,35 +133,19 @@ public class DB { // Retrieving the wanted data long timeStamp = row.get("TimeStamp").getTimestampValue()/1000; // Riktig format, men i string - String formatedTimeStamp = dateFormat.format(timeStamp); - // Format the date to LocalDateTime datatype - LocalDateTime date = LocalDateTime.parse(formatedTimeStamp, format); - // Creates a future date to compare against - LocalDateTime dateFuture = date.plusDays(1); - - //System.out.println(date); + String formatedTimeStamp = getDateFormat().format(timeStamp); + // Adding the data to a list in order to sort through later data.put(formatedTimeStamp, variantValue); } -/* - NavigableMap<String, Number> sortedData = new TreeMap<>(data); - - for (Map.Entry<String, Number> entry : sortedData.entrySet()) { - String key = entry.getKey(); - String next = sortedData.higherEntry(entry.getKey()).getKey(); // next - - //System.out.println("Nå: "+key); - //System.out.printf("Neste: %s\n\n",next); - } - */ + //NavigableMap<String, Number> sortedData = new TreeMap<>(data); return data; } /** * Retrieves information about kwh and the corresponding date * - * @return the results * @throws Exception returns potential error */ public static void getName() throws Exception { @@ -167,12 +154,6 @@ public class DB { Map<Object,ArrayList<Object>> data = new HashMap<>(); - // Initializing the date format - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - - - // Preparing a query statement final String sqlStatement = "SELECT Name, CalculatedStart, CalculatedStop FROM `sf-drying-optimization.124.int_dk_valmaticsdryingbatches`" + @@ -193,15 +174,100 @@ public class DB { long calculatedStart = row.get("CalculatedStart").getTimestampValue()/1000; long calculatedStop = row.get("CalculatedStop").getTimestampValue()/1000; // Formatting the dates - String formattedCalculatedStart = dateFormat.format(calculatedStart); - String formattedCalculatedStop = dateFormat.format(calculatedStop); + String formattedCalculatedStart = getDateFormat().format(calculatedStart); + String formattedCalculatedStop = getDateFormat().format(calculatedStop); java.sql.Timestamp timestamp = new Timestamp(calculatedStart); //System.out.println(timestamp); - //System.out.printf("%s\t\t\t%s\t\t\t%s\n",name, formattedCalculatedStart, formattedCalculatedStop); + System.out.printf("%s\t\t\t%s\t\t\t%s\n",name, formattedCalculatedStart, formattedCalculatedStop); } //return data; } + + private static void getZeroPointDate() throws Exception{ + + // Initializing a date format in the data type DateTimeFormatter + // Required for iterating through the dates. + DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // Initializing the data map to store the results + Map<String, String> dates = new HashMap<>(); + + // Preparing a query statement + final String sqlStatement = + "SELECT InTidTork, UtTidTork FROM `sf-drying-optimization.124.int_gs_ds_sipalpackages`" + + "WHERE Tork Like \"%5%\" AND InTidTork BETWEEN \"2021-01-30 08:51:03\" " + + "AND \"2022-03-15 11:10:09\" ORDER BY InTidTork ASC"; + + // Creates a job configuration + queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build()); + + // Iterating through the results + TableResult result = queryJob.getQueryResults(); + System.out.println("InTidTork\t\t\tUtTidTork"); + for (FieldValueList row : result.iterateAll()) { + + // Defining variables + String formatedInTidTork; + String formatedUtTidTork; + + // Retrieving the wanted data + // InTidTork: + if(!row.get("InTidTork").isNull()){ + long InTidTorkLong = row.get("InTidTork").getTimestampValue()/1000; + // Formating the data from long to a string in the correct date format + formatedInTidTork = getDateFormat().format(InTidTorkLong); + } else { + formatedInTidTork = ""; + } + + // UtTidTork: + if(!row.get("UtTidTork").isNull()){ + long utTidTorkLong = row.get("UtTidTork").getTimestampValue()/1000; + // Formating the data from long to a string in the correct date format + formatedUtTidTork = getDateFormat().format(utTidTorkLong); + } else { + formatedUtTidTork = ""; + } + + dates.put(formatedInTidTork,formatedUtTidTork); + //System.out.printf("%s\t\t\t%s\n",formatedInTidTork,formatedUtTidTork); + } + NavigableMap<String, String> dataSet = new TreeMap<>(dates); + + /* + for (Map.Entry<String, String> entry : dataSet.entrySet()) { + System.out.printf("Key: %s\t\t\tValue: %s\n",entry.getKey(),entry.getValue()); + } + */ + + // Iterating through the data in order to find and set a zeropoint for the dates. + for (Map.Entry<String, String> entry : dataSet.entrySet()) { + + // Retrieving the entry key + String key = entry.getKey(); + + // Format the date to LocalDateTime datatype + LocalDateTime date = LocalDateTime.parse(key, format); + // Creates a future date to compare against + LocalDateTime dateNowPlus = date.plusDays(1); + String formatedDateNowPlus = format.format(dateNowPlus); + + try { + String next = dataSet.higherEntry(entry.getKey()).getKey(); // next + + System.out.printf("Current date: %s\t\t\tPluss 1: %s\t\t\tNext date: %s\n",key,formatedDateNowPlus,next); + + //System.out.printf("Neste: %s\n\n",next); + if(next.compareTo(formatedDateNowPlus) > 0){ + System.out.printf("Inni if!!@@, Er next mindre enn formated?\nNext, skal være større: %s\nFormated, skal være mindre: %s\n\n",next,formatedDateNowPlus); + } + } catch (NullPointerException e){ + System.out.println(e.getMessage()); + } + } + + } } \ No newline at end of file diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index f55cd733a771a5caab5806fc12243e1ebbed11d6..4f39a5616a61964b092c667dfb23974502bcd92a 100644 GIT binary patch delta 5316 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 UESwCV7(Re#Mpi~<hL;SI0N19-&j0`b delta 3052 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 T!pX3UVF#GL$Z(!v1A`<0wW4T_ -- GitLab