From 979e4d5a23558f10e406896a3948f5b8a05b5e9a Mon Sep 17 00:00:00 2001
From: emtunhei <emtunhei@stud.ntnu.no>
Date: Mon, 7 Mar 2022 12:01:28 +0100
Subject: [PATCH] Updated DB file

---
 src/main/java/com/application/DB/DB.java     |  93 ++++++++++++++----
 src/main/java/com/application/DB/Sort.java   |  95 -------------------
 src/main/java/com/application/Main.java      |  11 ++-
 target/classes/com/application/DB/DB.class   | Bin 7024 -> 7747 bytes
 target/classes/com/application/DB/Sort.class | Bin 5670 -> 5670 bytes
 target/classes/com/application/Main.class    | Bin 7537 -> 7710 bytes
 6 files changed, 82 insertions(+), 117 deletions(-)
 delete mode 100644 src/main/java/com/application/DB/Sort.java

diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java
index 0413224..2777ec3 100644
--- a/src/main/java/com/application/DB/DB.java
+++ b/src/main/java/com/application/DB/DB.java
@@ -6,6 +6,7 @@ import com.google.cloud.bigquery.*;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -17,14 +18,14 @@ import java.util.*;
  */
 public class DB {
 
-    private static Map<String, Number> data;
-    private static QueryJobConfiguration queryConfig;
     private static Job queryJob;
+    private static SimpleDateFormat dateFormat;
 
     /**
      * Retrieves the credentials file
-     * @return
-     * @throws Exception
+     *
+     * @return the credentials
+     * @throws Exception for potential errors
      */
     private static GoogleCredentials getCredentials() throws Exception {
         File credentialsPath = new File("./src/main/resources/com.application/sf-drying-optimization-1e234ad2b0f4.json");
@@ -39,9 +40,14 @@ public class DB {
         return credentials;
     }
 
+    public static void main(String[] args) throws Exception {
+        getKwh();
+    }
+
 
     /**
      * Creates a builder
+     *
      * @return a builder
      * @throws Exception returns potential error
      */
@@ -59,6 +65,7 @@ public class DB {
 
     /**
      * Creates a job
+     *
      * @param queryConfig query configuration information
      * @return a job
      * @throws Exception returns potential error
@@ -91,39 +98,87 @@ public class DB {
      */
     public static Map<String, Number> getKwh() throws Exception {
 
-        // Initializing a data
-        data = new HashMap<>();
+        // Initializing the data map to store the results
+        Map<String, Number> data = new HashMap<>();
 
-        // Preparing a query job
+        List<List<Number>> listOfLists = new ArrayList<List<Number>>();
+
+        // 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 TimeStamp, VariantValue " +
                 "FROM sf-drying-optimization.124.int_sd_winccsensordata " +
                 "WHERE TimeStamp BETWEEN \"2021-01-25 08:51:03\" " +
                 "AND \"2021-03-04 11:10:09\" ORDER BY TimeStamp";
 
         // Creates a job configuration
-        queryConfig = QueryJobConfiguration.newBuilder(sqlStatement).build();
+        queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build());
 
-        queryJob = getJob(queryConfig);
-
-        // Step 4: Display results
-        // Print out a header line, and iterate through the
-        // query results to print each result in a new line
-        System.out.println("InTidTork \t UtTidTork");
+        // Iterating through the results
         TableResult result = queryJob.getQueryResults();
+        System.out.println("InTidTork \t UtTidTork");
         for (FieldValueList row : result.iterateAll()) {
-            // We can use the `get` method along with the column
-            // name to get the corresponding row entry
 
-            SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
-            newFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+            // Retrieving the wanted data
             long timeStamp = row.get("TimeStamp").getTimestampValue()/1000;
-            String formatedTimeStamp = newFormat.format(timeStamp);
+            String formatedTimeStamp = dateFormat.format(timeStamp);
 
             int variantValue = row.get("VariantValue").getNumericValue().intValue();
 
+            System.out.println(timeStamp);
+
+
             data.put(formatedTimeStamp, variantValue);
 
+            listOfLists.add(new ArrayList<Number>());
         }
         return data;
     }
+
+    /**
+     * Retrieves information about kwh and the corresponding date
+     *
+     * @return the results
+     * @throws Exception returns potential error
+     */
+    public static void getName() throws Exception {
+
+        // Initializing the data map to store the results
+        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`" +
+                        "WHERE Name Like \"%Gran%\" AND Name Like \"%3ex%\" AND NAME Like \"%47x150%\" AND DATE(CalculatedStart) " +
+                        "BETWEEN \"2018-08-17\" AND \"2022-08-30\" ORDER BY DATE(CalculatedStart)";
+
+        // Creates a job configuration
+        queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build());
+
+        // Iterating through the results
+        TableResult result = queryJob.getQueryResults();
+        System.out.println("Name\tCalculatedStarted\tCalculatedStop");
+        for (FieldValueList row : result.iterateAll()) {
+
+            // Retrieving the wanted data
+            String name = row.get("Name").getStringValue();
+            // The dates are returned as a 16-digit number that needs to be formatted
+            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);
+
+            System.out.printf("%s\t\t\t%s\t\t\t%s\n",name, formattedCalculatedStart, formattedCalculatedStop);
+
+        }
+        //return data;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/application/DB/Sort.java b/src/main/java/com/application/DB/Sort.java
deleted file mode 100644
index 1d8630a..0000000
--- a/src/main/java/com/application/DB/Sort.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.application.DB;
-
-import com.google.auth.oauth2.GoogleCredentials;
-import com.google.auth.oauth2.ServiceAccountCredentials;
-import com.google.cloud.bigquery.*;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-public class Sort {
-
-
-    private static GoogleCredentials getCredentials() throws Exception {
-        File credentialsPath = new File(".\\src\\main\\resources\\com.application\\sf-drying-optimization-1e234ad2b0f4.json");
-
-        // Load credentials from JSON key file. If you can't set the GOOGLE_APPLICATION_CREDENTIALS
-        // environment variable, you can explicitly load the credentials file to construct the
-        // credentials.
-        GoogleCredentials credentials;
-        try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) {
-            credentials = ServiceAccountCredentials.fromStream(serviceAccountStream);
-        }
-        return credentials;
-    }
-
-    // Step 1: Initialize BigQuery service
-    // Here we set our project ID and get the `BigQuery` service object
-    // this is the interface to our BigQuery instance that
-    // we use to execute jobs on
-    private static BigQuery getBuilder() throws Exception {
-        BigQuery bigquery = BigQueryOptions.newBuilder().
-                setCredentials(getCredentials()).
-                setProjectId("sf-drying-optimization")
-                .build().getService();
-        return bigquery;
-    }
-
-
-    public static void main(String[] args) throws Exception {
-        Sort.getFromExistingTable();
-    }
-
-
-    //getFromExistingTable sorts out treespecies, ex, width and height
-    //
-
-    public static void getFromExistingTable() throws Exception {
-
-
-        // Step 2: Prepare query job
-        // A "QueryJob" is a type of job that executes SQL queries
-        // we create a new job configuration from our SQL query and
-        final String GET_WORD_COUNT =
-                "SELECT Name, CalculatedStart, CalculatedStop FROM `sf-drying-optimization.124.int_dk_valmaticsdryingbatches`" +
-                "WHERE Name Like \"%Gran%\" AND Name Like \"%3ex%\" AND NAME Like \"%47x150%\" AND DATE(CalculatedStart) " +
-                "BETWEEN \"2018-08-17\" AND \"2022-08-30\" ORDER BY DATE(CalculatedStart)";
-
-        QueryJobConfiguration queryConfig =
-                QueryJobConfiguration.newBuilder(GET_WORD_COUNT).build();
-
-        // Step 3: Run the job on BigQuery
-        // create a `Job` instance from the job configuration using the BigQuery service
-        // the job starts executing once the `create` method executes
-
-        Job queryJob = getBuilder().create(JobInfo.newBuilder(queryConfig).build());
-        queryJob = queryJob.waitFor();
-        // the waitFor method blocks until the job completes
-        // and returns `null` if the job doesn't exist anymore
-        if (queryJob == null) {
-            throw new Exception("job no longer exists");
-        }
-        // once the job is done, check if any error occured
-        if (queryJob.getStatus().getError() != null) {
-            throw new Exception(queryJob.getStatus().getError().toString());
-        }
-
-        // Step 4: Display results
-        // Print out a header line, and iterate through the
-        // query results to print each result in a new line
-        System.out.println("Name\tCalculatedStarted\tCalculatedStop");
-        TableResult result = queryJob.getQueryResults();
-        for (FieldValueList row : result.iterateAll()) {
-            // We can use the `get` method along with the column
-            // name to get the corresponding row entry
-
-            String name = row.get("Name").getStringValue();
-            String calculatedStart = row.get("CalculatedStart").getStringValue();
-            String calculatedStop = row.get("CalculatedStop").getStringValue();
-            System.out.printf("%s\t%s\t%s\n", name,calculatedStart, calculatedStop);
-
-
-        }
-    }
-}
diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java
index eb012b3..55fe158 100644
--- a/src/main/java/com/application/Main.java
+++ b/src/main/java/com/application/Main.java
@@ -69,6 +69,7 @@ public class Main extends Application {
 
     /**
      * Sets the primaryStage and sets the scene for the window.
+     *
      * @param primaryStage
      * @throws Exception
      */
@@ -99,6 +100,9 @@ public class Main extends Application {
 
         VBox.setVgrow(this.logoBar, Priority.ALWAYS);
 
+        DB.getName();
+        System.out.println(DB.getKwh());
+
         // Sets the scene and defines boundaries
         //Scene scene = new Scene(root, 1200, 600);
         Scene scene = new Scene(root, 1200, 600);
@@ -156,6 +160,7 @@ public class Main extends Application {
 
     /**
      * This function imports the logos and defines the alignments
+     *
      * @return a logoBar containing the logos in proper alignments
      * @throws FileNotFoundException
      */
@@ -196,12 +201,12 @@ public class Main extends Application {
 
         lineChart.setTitle("Drying Process");
 
-        Map<String, Number> map = DB.getKwh();
-        Map<String, Number> treeMap = new TreeMap<>(map);
+        Map<String, Number> kwh = DB.getKwh();
+        Map<String, Number> sortedKwh = new TreeMap<>(kwh);
 
         XYChart.Series series1 = new XYChart.Series();
         series1.setName("Drying 1");
-        treeMap.forEach((key, value) -> series1.getData().add(new XYChart.Data(key,value)));
+        sortedKwh.forEach((key, value) -> series1.getData().add(new XYChart.Data(key,value)));
 
         lineChart.getData().add(series1);
         return lineChart;
diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class
index 556fc2cc052661cde9e807016e45a7abe5275738..cf5b913fe5b25df78e5f87d4e74206b7819a98bb 100644
GIT binary patch
delta 3361
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
Ln&BkFat28N@af~@

delta 2740
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
Wm|+qNC&L_uSzvkt!#ajZ43YqUq&lwv

diff --git a/target/classes/com/application/DB/Sort.class b/target/classes/com/application/DB/Sort.class
index 1a594c06b3520ce5e5d358f21b0ff1cf017bc63b..af7725eabeed8f31bef3c2fa8720615f22f08490 100644
GIT binary patch
delta 81
zcmZ3cvrK1$jHs&_12cm)11p0K0}q1}g93vygC>I;gD!(RgE@m2gCm1CLoh=iLo`DW
lLkdGMLn}i#!$gJ%hPe!p3@aI;7>+W;GMr$Do17?m6aY6+5B&fD

delta 81
zcmZ3cvrK1$jHs(I12cmK11p0i0}q2eg93vCgC>JBgD!&$gE@mcgCm0nLokCMLo|aw
lLkdFxLn}iF!$gKqhPe!33@aJJ8ICeUF`QtCo}4Ip6aX(4561ui

diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class
index a7169948028a77353b46f51b3ae3f03584f5233d..529aafa67273028ab74fc4440d51c6f3ee9d1512 100644
GIT binary patch
delta 3020
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

delta 2868
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
GR006FYcpX0

-- 
GitLab