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
zcmZn;-e+Hb>ff$?3=9k=j9FX^K@9WR85VFbEaYNfVpzn^u$YU1m0<}N!%~K2Al7nr
zh80{4oD3_u7y=nqaWSlBSOa3M<znDxSjWz=o`Yc%h`AX=YynAcWoOt1Qn8(jVF$xb
zE{0tUyV)7`a5IQ7>|<xx&&6<n;b1*G!yyia!(0q942wVlN4OY{G92S#IL>f_o#7-G
zgA&7h4u(@)45t~+urr+HVo+mP#KCZmi{U)O1ulk*43|L0U*=>8WVpi4a1~_0bxwvG
z3^zF#ZgDZ(X1K$}aF^j8H^Y5~2iyz~86JU%$LtJGI2fLCF_<wt<6_8s&hUbZ;U&W>
z4u;oU49^+furh!F^9wG9w+!#N7~V5{;9~g5@CihG=3@B5@Rgh48^d=Fh94XZKe-rw
zG5iLp`NP5RmxJLS2g83ZhUbh79E^+{j7;o|%v=oqj4bSotn7?zllL>~Pp)Osnf#71
zZt_Z|hg=KT8QIwx7PB*~*gS<<f{~G9@>-Vc$ub<uB3vnnC8=(uC8b5Fj10_0`Q?lZ
zT9Xx7q$l5&;+pKjsxWyLhk=-wPgY`CqJBwgMTx!(NPT`$Zeq#gL{`_y=UDxP*cmz5
z8M)XQx!D<c*co}*8Tlq>v2C1e$L=r16`WsMl$`38nUl)M!0zIt2Qr9<A)Fy%G8b1o
z2M<FyBR?a9_+(pVad!|$fSpm0hf#=8n1@k>A%c-X7^Gf5CowNwKP00lzdSK1CzXd$
zlu?X_p`4+Dol%^JQG!vDharw3o`+G2QHGJhaPmiHrOE3>*(ZPI5)t6>%*#tHa?VLC
zE>10GWDuL|$R#Gk!zjxr$HOSksKCRh$f(4~pajw*!NX9%P{_`x3^G!MolzB}LXD9@
z2P8SUhg*VKol#@*a&AR74jx8LMy<)`xb=m#8Fknhb$J-|81>m14R{z08I2|j@QBF>
zS5{V5>iYWXrlcr%cv$7;S``<wGjj1T8Z(+q-p?sNS&gTH$;fo_0v<6ILtP__$-8)z
zrA<LLo3S&RgKW0oVJKoK=3xkC2w`L}1-oH_r0`^2UU6<qMk{tkYaT`$M%&5$yi#g*
zJdE~?{OpXpJd6&Ej_iz1JdDnaF6@kaJdCc4Zaj?cj2?^(8j}x7sZ8F?D_ZZ#=*7<H
z&BN%!=*!ON$HVB)7{JKD8IqZs8eEc?TfoB@$QZ=V7|g>M!WhcV$j!sh#u&!V7|z2O
z!5GQI7{wUP&KLudjAdu!<YA0sjAvv(_HIT7#Jh|P%%LI9?2HLKjERg%JdDYVDU6Il
z!LFNi_#7FTQyGmW7w}u@g)^oxGKePU=jtaG6y#(kCzfR9=jppR>AN^FG6*1I-#;lU
zHMwLmzfdfr(&W1`O1g{;B4AmxM2Vs)xTGjEFP)J=b@E4MsmTW<xhGE&5}(W{EU~#?
zIFykwWAjsyM&`-8W!xF{!73aiMK@2A_`%4@l9yUh!pI<^G1*W?bn{XvV@3&ah;5m<
zsro+o$%#3jd;kiw$&RvplW$1pPnHrcmE=oLErD1XmY7qT%E-W?;iVbI&X_s5T+UxP
zkRgbHfq{vE3lymg3=CWhp$uUR3=HfHjG!FBz{n6e`JtRxeG~%&0~-S)0|SEuLo@>e
z0}q(Z$`Hd43)U6K5YNEG5Xr#6=*Pg!z|O$Hkg=PADN=}eI|GaNZU)v!t?dkKzKni4
zI~dq~bdE82>mFke)!D|tv7EudibYqFWg7$6at2d~h@KUTB#WOU%YG|Xons8Ly2lvm
zp=yP!*mNb?z-rk+Y9(3sYj0p+Wl&;JW6)&aWDsSLVz7qN&I}9;z6^m3Aq<=h)(ox;
zAU-n#$Rl!K2dXe|F=#P}GH5eMG3YQ@GiWh5Gw3j+G3bIlsKvm-AjP1_kid}0z{pT9
z%n;0w#E=XQsW^rdhExUyhBO8ysB{_w149G@$A1P*1{QXPbasXec7{xLhAaj~c7`mj
z{|szkVFn~YcXo!X{|o{QZ0ro_FmbpB=Kl;#3``J%7#J9`85rsrSQr=?WEeOZau{+U
z0nK2{zzB(i9Sq#z8^N&%@*Jr0Vqh?2U|}!<dju9!c?|gwv!F(Cfr=KWQEm)O;9_5H
z2LsOz2HtH9d<Pi#g#@-S2p(YI-^L)ct)4;n0E5T|1_lO3a0rSqfGP?H24)6F20jKS
z1`!5l23ZCNkW=Bt7cmq=jbFmR47R{?2ZN~A4hFGp4C2gt86<WxNHR0{Xfy9+klMx|
z?W291fp<59Or((Pb_Tiq+S?f9w=pOjV-N+2)kC@47!<*hAeSJ=WiW#XLkNQ`LpXyX
zLj;31Lo|aaLkxpELmW5=#2~galrWSsFffQPn1T~KBLgVfI2oA!Fle(glu08wo)c7(
zGcbeG^BM*g2HtuG28K1e8I&ToGbnotsqA1-_1Vp!7Ad5%ok87KNW)J^V+VugHU_O7
z4BDF+bT%>QFz;p1-NvA2#j=S(U&vq^gCQt|8|`E;W@NBpm1Nz?V8X~SlOYPkGG$~q
zz+h&@CdnpbzKy|R8-wLG1}igmNj4#CFxN(e!L~lvoI^*9V+Vu%HU<YPE=ex!9Sn|E
z+>+c}+Zddzc(f$BMA>&RIPYX|VP*(l{(q4cD1cbNQRT!S0FHMKhCBv7hI|GIh9U-O
zh6)BvhH3^=h8hN2hFXSrh6aW_hGvF3hE|47hIWRD44n)!8G0F(GxRa6VwlYk4f1~h
z12;n+gC#>HLlpx%Lmk+F8U_xAP6j!KT826XE{2H=Vhr^R4Gi22Ga2|88W|cGco^at
zJQ$i7ni<#_I2e{Nv@o<XFfi~j%wuR{XlGz#kYJd?5X#WOz{DU8wzQ6cnZcByoS}=M
zn}LO)2U^f@Fw}#z_JZ>q1A`m`(|-m}P}b>VXXs~Vn8403k)2@@JHuoKhF=T`NbxuY
zoGYd>a579|h=3$U#w83a415d>3>#t5364nD?F{NZ+CpwS7~HopcnEp=3V9;OXgwlI
z{XjA5wT;10cN+sVLRlnPpb;7mVnHL6RgzW68ytf^R&0{2LcU-&C^mD=*(F(p{E+yZ
z+G6a`$mP}+<AgGKb~E@#im`8J2&lK>UH*SAD3c>c>T(7ShSdy03~Lyq88$M=F>Ghh
zVc5lB&aj)oo?#C|0>gfW9EO7oH4KLsdKiu{OlLUCu!!L}!&-(j3>z5EfpbP00~bRM
zgCoOqhB^i|h8hM#h8YYs4D1X&42ldh8EP0f8KyIcG0bA9uVdh5Sj521Fq@%{frlZ1
z!518<tPC6sE1{7p#4sNmm5dB>43il;8R{6A7|a=}z){JJ6qO+LbD%LP4T?!G23B^4
zKJ;izMT$ly2K%|-n4HG|3IZbrHU@r%)eIXLI2j}uL>Trma5CsJh%j7Z;AE6$OlR1@
T!pX3UVF#GL$Z(!v1A`<0wW4T_

-- 
GitLab