From bde961ad64f805b06af4b8a7b83a3c944a6077d8 Mon Sep 17 00:00:00 2001 From: emtunhei <emtunhei@stud.ntnu.no> Date: Tue, 22 Feb 2022 14:41:10 +0100 Subject: [PATCH] Potential contact with bigquery --- ...services_storage_v1_rev20211201_1_32_1.xml | 13 ++ ..._auto_value_auto_value_annotations_1_9.xml | 13 ++ ...oogle_cloud_google_cloud_storage_2_4_0.xml | 13 ++ Bachelor_application.iml | 3 + pom.xml | 4 + .../application/DataBase/Authentication.java | 44 ----- .../java/com/application/DataBase/DB.java | 176 +++++++++++++++--- src/main/java/com/application/Main.java | 3 - .../classes/com/application/Credentials.class | Bin 0 -> 370 bytes .../application/DataBase/Authentication.class | Bin 3333 -> 2702 bytes .../classes/com/application/DataBase/DB.class | Bin 1126 -> 8779 bytes target/classes/com/application/Main.class | Bin 1731 -> 1550 bytes 12 files changed, 201 insertions(+), 68 deletions(-) create mode 100644 .idea/libraries/Maven__com_google_apis_google_api_services_storage_v1_rev20211201_1_32_1.xml create mode 100644 .idea/libraries/Maven__com_google_auto_value_auto_value_annotations_1_9.xml create mode 100644 .idea/libraries/Maven__com_google_cloud_google_cloud_storage_2_4_0.xml delete mode 100644 src/main/java/com/application/DataBase/Authentication.java create mode 100644 target/classes/com/application/Credentials.class diff --git a/.idea/libraries/Maven__com_google_apis_google_api_services_storage_v1_rev20211201_1_32_1.xml b/.idea/libraries/Maven__com_google_apis_google_api_services_storage_v1_rev20211201_1_32_1.xml new file mode 100644 index 0000000..361daf1 --- /dev/null +++ b/.idea/libraries/Maven__com_google_apis_google_api_services_storage_v1_rev20211201_1_32_1.xml @@ -0,0 +1,13 @@ +<component name="libraryTable"> + <library name="Maven: com.google.apis:google-api-services-storage:v1-rev20211201-1.32.1"> + <CLASSES> + <root url="jar://$MAVEN_REPOSITORY$/com/google/apis/google-api-services-storage/v1-rev20211201-1.32.1/google-api-services-storage-v1-rev20211201-1.32.1.jar!/" /> + </CLASSES> + <JAVADOC> + <root url="jar://$MAVEN_REPOSITORY$/com/google/apis/google-api-services-storage/v1-rev20211201-1.32.1/google-api-services-storage-v1-rev20211201-1.32.1-javadoc.jar!/" /> + </JAVADOC> + <SOURCES> + <root url="jar://$MAVEN_REPOSITORY$/com/google/apis/google-api-services-storage/v1-rev20211201-1.32.1/google-api-services-storage-v1-rev20211201-1.32.1-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_auto_value_auto_value_annotations_1_9.xml b/.idea/libraries/Maven__com_google_auto_value_auto_value_annotations_1_9.xml new file mode 100644 index 0000000..e85a01b --- /dev/null +++ b/.idea/libraries/Maven__com_google_auto_value_auto_value_annotations_1_9.xml @@ -0,0 +1,13 @@ +<component name="libraryTable"> + <library name="Maven: com.google.auto.value:auto-value-annotations:1.9"> + <CLASSES> + <root url="jar://$MAVEN_REPOSITORY$/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9.jar!/" /> + </CLASSES> + <JAVADOC> + <root url="jar://$MAVEN_REPOSITORY$/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9-javadoc.jar!/" /> + </JAVADOC> + <SOURCES> + <root url="jar://$MAVEN_REPOSITORY$/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_cloud_google_cloud_storage_2_4_0.xml b/.idea/libraries/Maven__com_google_cloud_google_cloud_storage_2_4_0.xml new file mode 100644 index 0000000..4aff0cf --- /dev/null +++ b/.idea/libraries/Maven__com_google_cloud_google_cloud_storage_2_4_0.xml @@ -0,0 +1,13 @@ +<component name="libraryTable"> + <library name="Maven: com.google.cloud:google-cloud-storage:2.4.0"> + <CLASSES> + <root url="jar://$MAVEN_REPOSITORY$/com/google/cloud/google-cloud-storage/2.4.0/google-cloud-storage-2.4.0.jar!/" /> + </CLASSES> + <JAVADOC> + <root url="jar://$MAVEN_REPOSITORY$/com/google/cloud/google-cloud-storage/2.4.0/google-cloud-storage-2.4.0-javadoc.jar!/" /> + </JAVADOC> + <SOURCES> + <root url="jar://$MAVEN_REPOSITORY$/com/google/cloud/google-cloud-storage/2.4.0/google-cloud-storage-2.4.0-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/Bachelor_application.iml b/Bachelor_application.iml index 25adb4d..bcd84db 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -49,5 +49,8 @@ <orderEntry type="library" name="Maven: org.threeten:threetenbp:1.5.2" level="project" /> <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.9" level="project" /> <orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" /> + <orderEntry type="library" name="Maven: com.google.cloud:google-cloud-storage:2.4.0" level="project" /> + <orderEntry type="library" name="Maven: com.google.apis:google-api-services-storage:v1-rev20211201-1.32.1" level="project" /> + <orderEntry type="library" name="Maven: com.google.auto.value:auto-value-annotations:1.9" level="project" /> </component> </module> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 63ad269..3126ade 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,10 @@ <groupId>com.google.cloud</groupId> <artifactId>google-cloud-bigquery</artifactId> </dependency> + <dependency> + <groupId>com.google.cloud</groupId> + <artifactId>google-cloud-storage</artifactId> + </dependency> </dependencies> <properties> diff --git a/src/main/java/com/application/DataBase/Authentication.java b/src/main/java/com/application/DataBase/Authentication.java deleted file mode 100644 index 76edde3..0000000 --- a/src/main/java/com/application/DataBase/Authentication.java +++ /dev/null @@ -1,44 +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.BigQueryOptions; -import com.google.cloud.bigquery.Dataset; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -public class Authentication{ - - public static void explicit() throws IOException { - // TODO(developer): Replace these variables before running the sample. - String projectId = String.valueOf(new Credentials()); - 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); - } - - // Instantiate a client. - BigQuery bigquery = - BigQueryOptions.newBuilder() - .setCredentials(credentials) - .setProjectId(projectId) - .build() - .getService(); - - // Use the client. - System.out.println("Datasets:"); - for (Dataset dataset : bigquery.listDatasets().iterateAll()) { - System.out.printf("%s%n", dataset.getDatasetId().getDataset()); - } - } - -} diff --git a/src/main/java/com/application/DataBase/DB.java b/src/main/java/com/application/DataBase/DB.java index 0e7ff35..4f33282 100644 --- a/src/main/java/com/application/DataBase/DB.java +++ b/src/main/java/com/application/DataBase/DB.java @@ -1,32 +1,166 @@ package com.application.DataBase; -import com.google.cloud.bigquery.*; +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 { + private static void insertSampleData() { + // Step 1: Initialize BigQuery service + BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId("sample-project-330313") + .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 word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus='juliuscaesar' ORDER BY word_count DESC limit 10;"; + 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("word\tword_count"); + 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 word = row.get("word").getStringValue(); + int wordCount = row.get("word_count").getNumericValue().intValue(); + System.out.printf("%s\t%d\n", word, wordCount); + } + } + + 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(); - BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService(); - String datasetName = "my_new_dataset"; - Dataset dataset = null; - DatasetInfo datasetInfo = DatasetInfo.newBuilder(datasetName).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()); + } - /* - dataset = bigquery.create(datasetInfo); - System.out.printf("Dataset %s created.%n", dataset.getDatasetId().getDataset()); + // 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); + } - QueryJobConfiguration queryConfig = - QueryJobConfiguration.newBuilder( - "SELECT VariantValue, TimeStamp " - + "FROM sf-drying-optimization.124.int_sd_winccsensordata " - + "WHERE TimeStamp BETWEEN \"2020-06-13 05:16:20\" AND" - + " \"2020-06-15 15:25:20\" ORDER BY TimeStamp") - // Use standard SQL syntax for queries. - // See: https://cloud.google.com/bigquery/sql-reference/ - .setUseLegacySql(false) - .build(); -System.out.println(queryConfig); -*/ -} +} \ 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 c23bf11..5f43526 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -1,6 +1,5 @@ package com.application; -import com.application.DataBase.Authentication; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -9,10 +8,8 @@ import javafx.scene.control.Button; import javafx.stage.Stage; import java.io.IOException; -import java.nio.file.Paths; import java.util.Objects; -import static com.application.DataBase.Authentication.explicit; public class Main extends Application { Button button; diff --git a/target/classes/com/application/Credentials.class b/target/classes/com/application/Credentials.class new file mode 100644 index 0000000000000000000000000000000000000000..68f97c5ee7aaa1dc208d9fbcad0e9cbcdee30942 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/application/DataBase/Authentication.class b/target/classes/com/application/DataBase/Authentication.class index 1c24a29d0486c9f6a5e96e7aab2e56836ed64a19..d249deb8c7741c3bc750da67f2f9f9cd0660faff 100644 GIT binary patch literal 2702 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 Nlc9j2gTa%9699+C1VsP< literal 3333 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 diff --git a/target/classes/com/application/DataBase/DB.class b/target/classes/com/application/DataBase/DB.class index b434e24fe53816adc5d6d1c6f5f4c33dad28573b..bcdfb2c47b692138349417763b3102b135156c6f 100644 GIT binary patch literal 8779 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 delta 672 zcmX@@@{A+!)W2Q(7#J8#7;Ly0cp2om7!(*3L4*=JgEA)r4}%H^gDQwt0}<+63>plY zTnt(a+90kDJA*DegB~LTM^a{bVQFenB_o5%<d5RglYN;v46PX%xKk2K5{pwy{1S6h z85x9pvJ%S@^>Y&Q()EK&iZb)ktr;2Ep-LDTltDTrT_8G;G<)Wy<ufv<gJgN2vLGSr z$t{d&lh3k?3yU#`voq-PFc>fx@-P@N7&9^`O?G5bvfyFhW8i0G;LELy&r2<jhg!tL zAiyBV!yv>U%+6rK!(hr_!OmdG!(hc=&BGwVAj-%fJ^2iyv=AeM0K&EYNm;4MllSuJ ziwUKtmbj#*C6?xtc;*$CB<3ZjGBW5+p2#c<^7CYQe)h>b`1Ki8Cp$7pnIgHCk%22O zwcM#RGbbgrh>?LE&f@XR%S$bC&PgmTPAz6+aMqa2FQg}qq*Dc|)EZ=uBa@UI7CA-+ z)+CV8j0~C}r_>`Uv1U+Y;9=lpU|?WjU;qUO0|*E(2!be3D1d1Z22lnE21W)(1~CS4 z21W)61_p*y1||kZ1_lOgt?dkqT00n+wlOdtU|`wGz^Wz0wv~Zhi*YLhhnChB2KF5c zoZA?<wlZ*UWME)mVvuxWU|<kqU}a!nU}Iom;A9YF;9?MG;9-zq;AN0vU|`^Zn9Cr| bAOqGQ3nt|l%o!LMxEL52v=}rP%vd-9>0pV? diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index 7d55c32207fc5bd82f4e0c84a73f2cd7f65254af..69c4841e149a06ce1a54f8eb35273e6fd9cbd1cd 100644 GIT binary patch delta 605 zcmX@i+sBi2>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(~4DJ*2kMeQ3 zRwSnulw{`T6|*yVOfF^YVDy~)k5O7cl0k}x!HYqWoxz)j!H2<jvLTbXsvi%7KSKaJ zLm&@B5JNB{15Z|BS)zVkYKeYmkPkaU2oFOjL)heACS4^-hH!R<2p)z=hA19}XoeUb zhFB00#}LoMkia0t$RINDfym?!O#Yh}F|T8+7iAD*U|?WmU|<kukYHe7U}j)skYtcz zU}TVHU|`T^U<AvtYHep=+{nPdz{DWKz`(!;7UXA;Wnf_70kc^d<QU``7#KJi6c`j4 zn82Ei;hJ|aFd;N^F)%SOFo-a)Fo-h9)+3pq#GuT;z@Wmwz`(-5$e_x=$e_lc4mE2T z13Lo?0|SGT);0!aA(m|ntUDOk4luCqVBk2w!0Ef2fh$r+gn?Uxfp<Ftzn?bCHU<H0 z5eD9E41(Gs4BXoogtT?HF$imKV-P_&M2UfeA(??ei9w7(ok5jBgF%ZylfjTdi@}0H zo57Yrhry9S7wknXh}BRpGB7wXXfS9pFfxcS=rCw8XfrS|s4~bh=rHIqFvFd%$H2&- I4-PN`0OXHMG5`Po delta 817 zcmeC<Im}ys>ff$?3=9k=44GUE;tVES45kcbTnu6i=3ERG43-=WR$L6$3^rU0whVUc z4E9_M4h)X$3{LC}&TI~o4lsZKn?n<X!NtJM;KIe=%HRef+(Co~i0}jvUhE9s><m7P z3~WiIB_;WJj100qS&3y6tF}6_l%y7yFfwTRB<JVqCl(asWF{w;Waj7TyCjw*IwcmT z>N}Q}WTfVmK*g;Y8Ms_4l2Z#nii+78d?(v7c9{4vGH?awmlh?bx@G31GBR-bCT8a8 zWhIs+@-Rp-NV7Be^DqQ31oAKhF(|P!1oJS2FoaJ2$Y`z_#={WK5W&t6$-@xE5Y5QI z1Ja|Pms+A98sx*y5W~X|%Mdr&mq}M%iXonzA%TY>ks*nPA(<hChanY2q%oxPFk~=D zPoBw?mZ(moCm0zxQY%1S%`9PL(AFT{^PB%NZD6byV-ROxU|?imV31&tWME)mW?%&Q zl7W#yhJk@WpMeo9$EvlRfpH@P0|OI-ECT}r8(2_~L5_iefd|ZHWsql3U|?Y2WKd*K zVqgMmc4c5>U;>HlU|{mm+QGn#Fo2JNnSp^pjDe+|L7ahuK>}=&7(_LLGJ^^O0|N^K zD}yS78UrJPI+(}Epuxb%pvj;GHGLTaI|B;?1A~*+HU<_U)@=-II~dpxFmUW(;5@*< z<-41KJ5oo4fk%XaZ##p4pEk=j20?8R2EJ_!LfRq>JlhzAwRN{Kh?Ht?V-Q8SONoJl zfq_AlL5x9*L6t$9L5o3$!H_|h!Gb}L!InXv!I8lL>{Km?)lg3}FgP)2Gw3idGKewg fFz7PqF)%TxGRQLMGZ-*1!<}!)z{p?(4nku91pAK@ -- GitLab