From d83331845d43e3a66f24c429dee956de5d9d5fe9 Mon Sep 17 00:00:00 2001
From: emtunhei <emtunhei@stud.ntnu.no>
Date: Fri, 11 Mar 2022 15:37:17 +0100
Subject: [PATCH] Added full functionality to gathering kWh! Retireves seperate
 drying periods.

---
 src/main/java/com/application/DB/DB.java   | 108 +++++++++++++--------
 src/main/java/com/application/Main.java    |   2 +-
 target/classes/com/application/DB/DB.class | Bin 10720 -> 11373 bytes
 target/classes/com/application/Main.class  | Bin 8129 -> 7985 bytes
 4 files changed, 67 insertions(+), 43 deletions(-)

diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java
index 7e81652..a2fbb8f 100644
--- a/src/main/java/com/application/DB/DB.java
+++ b/src/main/java/com/application/DB/DB.java
@@ -22,7 +22,7 @@ public class DB {
 
     private static Job queryJob;
 
-    private static SimpleDateFormat getDateFormat(){
+    private static SimpleDateFormat getDateFormat() {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
         return dateFormat;
@@ -100,68 +100,91 @@ public class DB {
 
 
     /**
-     * Retrieves information about kwh and the corresponding date
+     * Retrieves information about kWh and the corresponding date
      *
      * @return the results
      * @throws Exception returns potential error
      */
-    public static Map<String, Number> getKwh() throws Exception {
-
-        /*
-        for (Map.Entry<String, String> entry : getZeroPointDate().entrySet()) {
-            //System.out.printf("Intid: \t%s\t\t\tOuttid: \t%s\n",entry.getKey(),entry.getValue());
-
-            // Preparing a query statement
-            final String sqlStatement = "SELECT TimeStamp, VariantValue " +
-                    "FROM sf-drying-optimization.124.int_sd_winccsensordata " +
-                    "WHERE TimeStamp BETWEEN " + entry.getKey() + " AND " + entry.getValue() +
-                    "ORDER BY TimeStamp ASC";// Preparing a query statement
-
-        }
-
-         */
+    public static Map<Integer, Map> getKwh() throws Exception {
 
         // Initializing the data map to store the results
-        Map<String, Number> data = new HashMap<>();
-
+        Map<Integer, Map> finalResults = new HashMap<>();
 
+        int index = 0;
 
+        /*
         final String sqlStatement = "SELECT TimeStamp, VariantValue " +
                 "FROM sf-drying-optimization.124.int_sd_winccsensordata " +
                 "WHERE TimeStamp BETWEEN \"2021-01-30 08:51:03\" " +
                 "AND \"2021-02-15 11:10:09\" ORDER BY TimeStamp ASC";
+         */
 
+        for (Map.Entry<String, String> entry : getZeroPointDate().entrySet()) {
+            //System.out.printf("Intid: \t%s\t\t\tOuttid: \t%s\n",entry.getKey(),entry.getValue());
 
+            // Initializing the data map to store the results
+            Map<String, Number> data = new HashMap<>();
 
-        // Creates a job configuration
-        queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build());
+            // Preparing a query statement
+            final String sqlStatement = "SELECT DISTINCT TimeStamp, VariantValue " +
+                    "FROM sf-drying-optimization.124.int_sd_winccsensordata " +
+                    "WHERE TimeStamp BETWEEN " + '"'+ entry.getKey() + '"' +
+                    " AND " + '"' + entry.getValue() + '"' +
+                    " ORDER BY TimeStamp ASC";// Preparing a query statement
 
-        // Iterating through the results
-        TableResult result = queryJob.getQueryResults();
-        System.out.println("Timestamp \t KWh");
-        for (FieldValueList row : result.iterateAll()) {
+            //System.out.println(sqlStatement);
 
-            // Kwh
-            int variantValue = row.get("VariantValue").getNumericValue().intValue();
+            // Creates a job configuration
+            queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build());
 
-            // Retrieving the wanted data
-            long timeStamp = row.get("TimeStamp").getTimestampValue()/1000;
-            // Riktig format, men i string
-            String formatedTimeStamp = getDateFormat().format(timeStamp);
+            // Iterating through the results
+            TableResult result = queryJob.getQueryResults();
+            //System.out.println("Timestamp \t kWh");
 
-            // Adding the data to a list in order to sort through later
-            data.put(formatedTimeStamp, variantValue);
-        }
+            int baseline = 0;
+            for (FieldValueList row : result.iterateAll()) {
+
+                // Sets the baseline in order to reset the kWh counter
+                if (baseline == 0){
+                    baseline = row.get("VariantValue").getNumericValue().intValue();
+                }
+                //System.out.println("baseline: "+baseline);
+
+                // kWh value
+                int variantValue = row.get("VariantValue").getNumericValue().intValue()-baseline;
 
-        for (Map.Entry<String, Number> entry : data.entrySet()) {
-            System.out.printf("Timestamp: \t%s\t\t\tKWh: \t%s\n",entry.getKey(),entry.getValue());
+                // Retrieving the wanted data
+                long timeStamp = row.get("TimeStamp").getTimestampValue() / 1000;
+                // Riktig format, men i string
+                String formatedTimeStamp = getDateFormat().format(timeStamp);
+
+                // Checks for negative values,
+                if(variantValue > 0){
+                    // Adding the data to a list in order to sort through later
+                    data.put(formatedTimeStamp, variantValue);
+                }
+                //System.out.printf("Timestamp: \t%s\t\t\tkWh: \t%s\t\t\tBaseline: %s\n",formatedTimeStamp,variantValue,baseline);
+                // Checks if the data is empty
+                }
+            if(!data.isEmpty()) {
+                finalResults.put(index,data);
+                index += 1;
+            }
         }
+        // Defining a treemap to sort through the data
+        NavigableMap<Integer, Map> sortedFinalResults = new TreeMap<>(finalResults);
 
-        return data;
+/*
+        for (Map.Entry<Integer, Map> entry : sortedFinalResults.entrySet()) {
+            System.out.printf("Timestamp: \t%s\t\t\tkWh: \t%s\n",entry.getKey(),entry.getValue());
+        }
+ */
+        return sortedFinalResults;
     }
 
+
     /**
-     * Retrieves information about kwh and the corresponding date
+     * Retrieves information about kWh and the corresponding date
      *
      * @throws Exception returns potential error
      */
@@ -207,7 +230,7 @@ public class DB {
      * This function retrieves the intidtork and uttidtork dates from the database.
      * This variables are not sorted and thus this function iterates through the data in order to
      * find the last intidtork date and the corresponding uttidtork data.
-     * These values will be used to reset the kwh.
+     * These values will be used to reset the kWh.
      *
      * A possible extention of this function could be to limit the number of dring periodes.
      * This could be done with counting the number of entries in
@@ -297,9 +320,9 @@ public class DB {
 
                 // Checks if the next date is longer than 1 day,
                 // if so the current date is the last intidtork date and
-                // is the one we will use in order to reset the kwh.
+                // is the one we will use in order to reset the kWh.
                 if(next.compareTo(formatedDateNowPlus) > 0){
-                    // Storing the dates that will be used for resetting kwh.
+                    // Storing the dates that will be used for resetting kWh.
                     sortedDates.put(inTid,utTid);
                 }
             } catch (NullPointerException e){
@@ -307,6 +330,7 @@ public class DB {
                 break;
             }
         }
-        return sortedDates;
+        // Defining a treemap to sort through the data
+        return new TreeMap<>(sortedDates);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java
index 1413fe7..ae1c2ea 100644
--- a/src/main/java/com/application/Main.java
+++ b/src/main/java/com/application/Main.java
@@ -271,7 +271,7 @@ public class Main extends Application {
 
         lineChart.setTitle("Drying Process");
 
-        Map<String, Number> kwh = DB.getKwh();
+        Map<String, Number> kwh  = null;// = DB.getKwh();
         Map<String, Number> sortedKwh = new TreeMap<>(kwh);
 
         XYChart.Series series1 = new XYChart.Series();
diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class
index ec31148fa1f578a2ce3c089cb84d90f4678287d5..b744148f8c96704565f96a5c617d656f3f84964e 100644
GIT binary patch
delta 4584
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

delta 3894
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
LFtRbcVUPp>cvL`L

diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class
index fd2fd756630461a11db07cc7f98d510688c791c2..176a777b3e7297135d46851c11538e0bf6703743 100644
GIT binary patch
delta 3047
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

delta 3224
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

-- 
GitLab