From 9003e73bd2a802f242628293df42208542cf50d6 Mon Sep 17 00:00:00 2001 From: emtunhei <emtunhei@stud.ntnu.no> Date: Thu, 24 Feb 2022 14:17:21 +0100 Subject: [PATCH] Updated the project structure and added comments --- .../java/com/application/Credentials.java | 5 - src/main/java/com/application/DB/DB.java | 78 ++++++++ .../java/com/application/DataBase/DB.java | 170 ------------------ src/main/java/com/application/Main.java | 27 +-- .../classes/com/application/Credentials.class | Bin 370 -> 0 bytes .../classes/com/application/DataBase/DB.class | Bin 8779 -> 0 bytes target/classes/com/application/Main.class | Bin 1550 -> 1568 bytes 7 files changed, 94 insertions(+), 186 deletions(-) delete mode 100644 src/main/java/com/application/Credentials.java create mode 100644 src/main/java/com/application/DB/DB.java delete mode 100644 src/main/java/com/application/DataBase/DB.java delete mode 100644 target/classes/com/application/Credentials.class delete mode 100644 target/classes/com/application/DataBase/DB.class diff --git a/src/main/java/com/application/Credentials.java b/src/main/java/com/application/Credentials.java deleted file mode 100644 index e0898e7..0000000 --- a/src/main/java/com/application/Credentials.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.application; - -public class Credentials { - String projectId = "sf-drying-optimization"; -} diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java new file mode 100644 index 0000000..4eed14a --- /dev/null +++ b/src/main/java/com/application/DB/DB.java @@ -0,0 +1,78 @@ +package com.application.DB; + +import com.google.auth.oauth2.GoogleCredentials; +import com.google.auth.oauth2.ServiceAccountCredentials; +import com.google.cloud.bigquery.BigQuery; +import com.google.cloud.bigquery.BigQueryOptions; +import com.google.cloud.bigquery.FieldValueList; +import com.google.cloud.bigquery.Job; +import com.google.cloud.bigquery.JobInfo; +import com.google.cloud.bigquery.QueryJobConfiguration; +import com.google.cloud.bigquery.TableResult; + +import java.io.File; +import java.io.FileInputStream; + +public class DB { + + 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; + } + + public static void getFromExistingTable() throws Exception { + + // 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 + BigQuery bigquery = BigQueryOptions.newBuilder(). + setCredentials(getCredentials()). + setProjectId("sf-drying-optimization") + .build().getService(); + + // 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 VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp"; + + 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 = bigquery.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("Timestamp\tVarient value"); + 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 + int variantValue = row.get("VariantValue").getNumericValue().intValue(); + String timeStamp = row.get("TimeStamp").getStringValue(); + System.out.printf("%s\t%d\n", timeStamp, variantValue); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/application/DataBase/DB.java b/src/main/java/com/application/DataBase/DB.java deleted file mode 100644 index fa8c89b..0000000 --- a/src/main/java/com/application/DataBase/DB.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.application.DataBase; - -import com.application.Credentials; - -import com.google.auth.oauth2.GoogleCredentials; -import com.google.auth.oauth2.ServiceAccountCredentials; -import com.google.cloud.bigquery.BigQuery; -import com.google.cloud.bigquery.BigQueryError; -import com.google.cloud.bigquery.BigQueryOptions; -import com.google.cloud.bigquery.FieldValueList; -import com.google.cloud.bigquery.InsertAllRequest; -import com.google.cloud.bigquery.InsertAllResponse; -import com.google.cloud.bigquery.Job; -import com.google.cloud.bigquery.JobInfo; -import com.google.cloud.bigquery.QueryJobConfiguration; -import com.google.cloud.bigquery.JobStatistics; -import com.google.cloud.bigquery.TableResult; - -import java.io.File; -import java.io.FileInputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.List; - - -public class DB { - - Credentials credentialsObject; - - private static void insertSampleData() { - // Step 1: Initialize BigQuery service - BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId("sf-drying-optimization") - .build().getService(); - - // Step 2: Create insertAll (streaming) request - InsertAllRequest insertAllRequest = getInsertRequest(); - - // Step 3: Insert data into table - InsertAllResponse response = bigquery.insertAll(insertAllRequest); - - // Step 4: Check for errors and print results - if (response.hasErrors()) { - for (Map.Entry<Long, List<BigQueryError>> entry : response.getInsertErrors() - .entrySet()) { - System.out.printf("error in entry %d: %s", entry.getKey(), - entry.getValue().toString()); - } - return; - } - System.out.println("inserted successfully"); - } - - // To create a streaming insert request, we need to specify the table and dataset id - // and create the rows we want to insert - private static InsertAllRequest getInsertRequest() { - String datasetId = "sample_dataset"; - String tableId = "vegetables"; - return InsertAllRequest.newBuilder(datasetId, tableId).addRow(getRow(1, "carrot")) - .addRow(getRow(2, "beans")).build(); - - } - - // each row is a map with the row name as the key and row value as the value - // since the value type is "Object" it can take any arbitrary type, based on - // the datatype of the row defined on BigQuery - private static Map<String, Object> getRow(int id, String vegetableName) { - Map<String, Object> rowMap = new HashMap<String, Object>(); - rowMap.put("id", id); - rowMap.put("name", vegetableName); - return rowMap; - } - - public static void main(String... args) throws Exception { - getFromExistingTable(); - } - - public 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; - } - - private static void getFromExistingTable() throws Exception { - - // 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 - BigQuery bigquery = BigQueryOptions.newBuilder(). - setCredentials(getCredentials()). - setProjectId("sf-drying-optimization") - .build().getService(); - - // 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 VariantValue, TimeStamp FROM sf-drying-optimization.124.int_sd_winccsensordata WHERE TimeStamp BETWEEN \"2020-06-09\" AND \"2020-06-29\" ORDER BY TimeStamp"; - - 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 = bigquery.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("Timestamp\tVarient value"); - 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 - int variantValue = row.get("VariantValue").getNumericValue().intValue(); - String timeStamp = row.get("TimeStamp").getStringValue(); - System.out.printf("%s\t%d\n", timeStamp, variantValue); - } - } - - private static void insertViaQuery() throws Exception { - - // Step 1: Initialize BigQuery service - BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId("sample-project-330313") - .build().getService(); - - // Step 2: Prepare query job - final String INSERT_VEGETABLES = - "INSERT INTO `sample-project-330313.sample_dataset.vegetables` (id, name) VALUES (1, 'carrot'), (2, 'beans');"; - QueryJobConfiguration queryConfig = - QueryJobConfiguration.newBuilder(INSERT_VEGETABLES).build(); - - - // Step 3: Run the job on BigQuery - Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).build()); - queryJob = queryJob.waitFor(); - 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 - // Here, we will print the total number of rows that were inserted - JobStatistics.QueryStatistics stats = queryJob.getStatistics(); - Long rowsInserted = stats.getDmlStats().getInsertedRowCount(); - System.out.printf("%d rows inserted\n", rowsInserted); - } - - -} \ 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 b20c57f..2fd00b7 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1,39 +1,44 @@ package com.application; +import com.application.DB.DB; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.control.Button; import javafx.stage.Stage; import java.io.IOException; import java.util.Objects; - +/** + * This class launches the application + * + * @author Eilert Tunheim, Karin Pettersen, Mads Arnesen + * @version 1.0.0 + */ public class Main extends Application { - Button button; + + /** + * Starts the application + * @param args + * @throws IOException + */ public static void main(String[] args) throws IOException { - //System.out.println("Hello world!"); - //Authentication test = explicit(); launch(args); } /** - * Main javafx code - * Stage = The whole window - * Scene = Content inside the stage. Put buttons and dropdown stuff + * Sets the primaryStage and sets the scene for the window. * @param primaryStage * @throws Exception */ @Override public void start(Stage primaryStage) throws Exception { - // Loading the GUI-fxml file from resources - Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/graphical_user_interface.fxml"))); + DB.getFromExistingTable(); // Loading the GUI-fxml file from resources - root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/input.fxml"))); + Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/com.application/GUI/graphical_user_interface.fxml"))); // Sets the scene and defines boundaries Scene scene = new Scene(root, 1200, 600); diff --git a/target/classes/com/application/Credentials.class b/target/classes/com/application/Credentials.class deleted file mode 100644 index 68f97c5ee7aaa1dc208d9fbcad0e9cbcdee30942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmX^0Z`VEs1_l!bF)jvH20;!6Ax;Js24Qvv5q1VqMh4D;qWrAX<Py&mMg}3Dti-ZJ z{hY+Sbp7CxqRhN>Yeoh(o6Nk-5<5l)W)00SMg|t={FGEi27aH+yi~u^+@#c^ki?{% zRFLNU<iwn?#G*_PA1cUFl95@=$RO*JoS&<oSWu9YnVeXXnV+ZcT$GxUnpcvUm{V-c z$iNkxUs{x$>Xr#INB~Jr59A;o1`Y;JMh0Hr$oPODe=k?(ka$lQ9tJiBc18wiJO(o| z2!OOh{NtYl@+E^J0}BHy0|Nsi0|UqaFpCjnJ_92I7Xt%>B?A*!j$3Ox1EZD@(^dxN rjSLJ7Obpx%3=CWhObiSR%nU3HEDSsh3=BLFr3}0bd|-q4!72p+QKC=U diff --git a/target/classes/com/application/DataBase/DB.class b/target/classes/com/application/DataBase/DB.class deleted file mode 100644 index bcdfb2c47b692138349417763b3102b135156c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8779 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 diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 69c4841e149a06ce1a54f8eb35273e6fd9cbd1cd..72d339a777587e42e0b4cf66b835e33ec457f966 100644 GIT binary patch delta 682 zcmeC<S-?|&>ff$?3=9k=3@Ka;;tU2{3}Ot1Tnt7G##{_045l0mW?T&B3>I7rmJC+x z4Axu>HVn4x40h}c_G}K54lsZKn?n<X!NtJM;K0S;$lwGboI!*Oh;RiFZtM*1><k`^ z3~V-;d6^}4j10^gnqiC+7tdt$oNUY3VdBNez!jWdT9lmXmYI{v$iV5Fn3<=Sl~|U@ z!yv&R$;05ypuo=H!^7aqAj!_)$HU;y5HR^8qq%Az4?_?`FgrsC4?`$J7$XA@NRNJA zYKeYmkPkaUI1fVvL*!&%CS7?6hA4K1XdZ?bhFBhkIEHv0h6E6i$dJUtkjx-Cc_vf7 zu4r<8u6|-cK~83JVo7Fxp1zBdzKathgGhR6iCa;Au4_eRaY<%gdPrhYPU>bh=H-m_ zVhrM-aA06&U<A38fssLqfq_Avfsuicfq{WlYdZtuMg|53CI)E+1_m~;pfH0B0|NsO zn9a%{%OJ<Vz`)5M&!E7-1lDW}*Sv#)389&bfr){EL7IVuK?Y$!Jp(I)B7+hG1A{UH z0|N^KBZCS9BZDe~8q}<{4D1Xn3=9meI~bU?wlS~>v2J5v+rhwofPrHN1Lpw-F5le@ z+>tsW3_KzXeA^iW{IprNF$ijlFz{_-5YiT5;Mv9?tgX9^K}35SgDAo+Y7CqV3=C=v z%t;KI43Z2w3>pl&47v<@3?>Zv4Au+=3=Ry23@!{tV25f!Tmbbc1A{ArI)erSBUqm% dgBAl5g9d{vgEoT>12fzgx(tjAdf;%=2LP+zVCet= delta 632 zcmZ3$)5lYP>ff$?3=9k=42fI}Vhn~{45AE1TnxqxCL9c=TnuIm=3ERG43_K+R$L6$ z3^wcxw(JacYz~tSFn|D?LlcC-#lXd2&&A-t;0Pj|K!h`hZ~+mn><n(~4DO5!Y)Pdh zCHZ-b46;61iDijt75c>@$*Fm%`pNluB}Mr;`c7bZ>xua*89gRTGIr>AGBR)l=a&{G zr@Ce4q%tya`X*-P>47x!Fi0{;@i2HXD6%tn^Dy`@_)fmcXs+tV!{E;lz|IiJ!w|#} z%*en4QmdbrTB08s<ipMo!ov{C5H{J6NmpKyA)K8df`=iJA&Q3~njwaVAr?f$F~svQ zBrr%#u4T&KEX}->F+!9<jDdlHk%56hoI!$tfq|KU5o9+5BZD*p1A{&TBUp}AYdZtu zMg|53CI%S>1_m~;AU}gF0|NsOn9a%{#~{zZz`)6%z@W&$#2`IcfK{v>q?U_;iGhJZ zgn@-Y6h*xfgE9jHg9-x!0}BHqgDL|fgBpW6NGAgW!!ibT1{MYe1}Cj;49r3-+Zb4P zFt8n9VBf*Oae#r-cQ*r9q>cy!w+I98b_RYwZI*2e0@@-ByxSNAwM7`Xw=oE5>uzHZ z)-Kt`AcAnT5(5VV1A`KS7=t>4DuV`t7K0{(A%hl!1%oz&ErSk&BZDs3fm#r&p&nvj qaAMG4&}3j_5M$6`&|=VLU}8{ZkY&(e&}CqTJ7151kwG6EJO%)rJ6F;G -- GitLab