-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(samples): Retail Tutorials. Events import (#302)
* Add import events. * Add kokoro configuration. * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Fixes. * Change versions * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Refactoring code. * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Fix review comments. * Add google test library. Minor fixes. * Readme changes. * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Change unit tests. * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Minor changes. * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com> Co-authored-by: Neenu Shaji <[email protected]>
- Loading branch information
1 parent
9bdf4d1
commit 2cfb804
Showing
6 changed files
with
614 additions
and
0 deletions.
There are no files selected for viewing
116 changes: 116 additions & 0 deletions
116
retail/interactive-tutorials/src/main/java/events/ImportUserEventsBigQuery.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
/* | ||
* Copyright 2022 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
// [START retail_import_user_events_from_big_query] | ||
|
||
/* | ||
* Import user events into a catalog from GCS using Retail API | ||
*/ | ||
|
||
package events; | ||
|
||
import com.google.cloud.ServiceOptions; | ||
import com.google.cloud.bigquery.BigQueryException; | ||
import com.google.cloud.retail.v2.BigQuerySource; | ||
import com.google.cloud.retail.v2.ImportMetadata; | ||
import com.google.cloud.retail.v2.ImportUserEventsRequest; | ||
import com.google.cloud.retail.v2.ImportUserEventsResponse; | ||
import com.google.cloud.retail.v2.UserEventInputConfig; | ||
import com.google.cloud.retail.v2.UserEventServiceClient; | ||
import com.google.longrunning.Operation; | ||
import com.google.longrunning.OperationsClient; | ||
import java.io.IOException; | ||
|
||
public class ImportUserEventsBigQuery { | ||
|
||
public static void main(String[] args) throws IOException, InterruptedException { | ||
// TODO(developer): Replace these variables before running the sample. | ||
String projectId = ServiceOptions.getDefaultProjectId(); | ||
String defaultCatalog = | ||
String.format("projects/%s/locations/global/catalogs/default_catalog", projectId); | ||
// TO CHECK ERROR HANDLING PASTE THE INVALID CATALOG NAME HERE: defaultCatalog = | ||
// "invalid_catalog_name" | ||
String datasetId = "user_events"; | ||
String tableId = "events"; | ||
// TO CHECK ERROR HANDLING USE THE TABLE OF INVALID USER EVENTS: tableId = "events_some_invalid" | ||
|
||
importUserEventsFromBigQuery(projectId, defaultCatalog, datasetId, tableId); | ||
} | ||
|
||
public static void importUserEventsFromBigQuery( | ||
String projectId, String defaultCatalog, String datasetId, String tableId) | ||
throws IOException, InterruptedException { | ||
try { | ||
String dataSchema = "user_event"; | ||
|
||
BigQuerySource bigQuerySource = | ||
BigQuerySource.newBuilder() | ||
.setProjectId(projectId) | ||
.setDatasetId(datasetId) | ||
.setTableId(tableId) | ||
.setDataSchema(dataSchema) | ||
.build(); | ||
|
||
UserEventInputConfig inputConfig = | ||
UserEventInputConfig.newBuilder().setBigQuerySource(bigQuerySource).build(); | ||
|
||
ImportUserEventsRequest importRequest = | ||
ImportUserEventsRequest.newBuilder() | ||
.setParent(defaultCatalog) | ||
.setInputConfig(inputConfig) | ||
.build(); | ||
|
||
System.out.printf("Import user events from BigQuery source request: %s%n", importRequest); | ||
|
||
// Initialize client that will be used to send requests. This client only needs to be created | ||
// once, and can be reused for multiple requests. After completing all of your requests, call | ||
// the "close" method on the client to safely clean up any remaining background resources. | ||
try (UserEventServiceClient serviceClient = UserEventServiceClient.create()) { | ||
String operationName = | ||
serviceClient.importUserEventsCallable().call(importRequest).getName(); | ||
|
||
System.out.printf("OperationName = %s\n", operationName); | ||
OperationsClient operationsClient = serviceClient.getOperationsClient(); | ||
Operation operation = operationsClient.getOperation(operationName); | ||
|
||
while (!operation.getDone()) { | ||
// Keep polling the operation periodically until the import task is done. | ||
int awaitDuration = 30000; | ||
Thread.sleep(awaitDuration); | ||
operation = operationsClient.getOperation(operationName); | ||
} | ||
|
||
if (operation.hasMetadata()) { | ||
ImportMetadata metadata = operation.getMetadata().unpack(ImportMetadata.class); | ||
System.out.printf( | ||
"Number of successfully imported events: %s\n", metadata.getSuccessCount()); | ||
System.out.printf( | ||
"Number of failures during the importing: %s\n", metadata.getFailureCount()); | ||
} | ||
|
||
if (operation.hasResponse()) { | ||
ImportUserEventsResponse response = | ||
operation.getResponse().unpack(ImportUserEventsResponse.class); | ||
System.out.printf("Operation result: %s%n", response); | ||
} | ||
} | ||
} catch (BigQueryException e) { | ||
System.out.printf("Exception message: %s", e.getMessage()); | ||
} | ||
} | ||
} | ||
|
||
// [END retail_import_user_events_from_big_query] |
125 changes: 125 additions & 0 deletions
125
retail/interactive-tutorials/src/main/java/events/ImportUserEventsGcs.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
/* | ||
* Copyright 2022 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
// [START retail_import_user_events_from_gcs] | ||
|
||
/* | ||
* Import user events into a catalog from GCS using Retail API | ||
*/ | ||
|
||
package events; | ||
|
||
import com.google.api.gax.rpc.InvalidArgumentException; | ||
import com.google.cloud.ServiceOptions; | ||
import com.google.cloud.bigquery.BigQueryException; | ||
import com.google.cloud.retail.v2.GcsSource; | ||
import com.google.cloud.retail.v2.ImportErrorsConfig; | ||
import com.google.cloud.retail.v2.ImportMetadata; | ||
import com.google.cloud.retail.v2.ImportUserEventsRequest; | ||
import com.google.cloud.retail.v2.ImportUserEventsResponse; | ||
import com.google.cloud.retail.v2.UserEventInputConfig; | ||
import com.google.cloud.retail.v2.UserEventServiceClient; | ||
import com.google.longrunning.Operation; | ||
import com.google.longrunning.OperationsClient; | ||
import java.io.IOException; | ||
|
||
public class ImportUserEventsGcs { | ||
|
||
public static void main(String[] args) throws IOException, InterruptedException { | ||
// TODO(developer): Replace these variables before running the sample. | ||
String projectId = ServiceOptions.getDefaultProjectId(); | ||
String defaultCatalog = | ||
String.format("projects/%s/locations/global/catalogs/default_catalog", projectId); | ||
// TO CHECK ERROR HANDLING PASTE THE INVALID CATALOG NAME HERE: defaultCatalog = | ||
// "invalid_catalog_name" | ||
String gcsEventsObject = "user_events.json"; | ||
// TO CHECK ERROR HANDLING USE THE JSON WITH INVALID USER EVENT: gcsEventsObject = | ||
// "user_events_some_invalid.json" | ||
|
||
importUserEventsFromGcs(gcsEventsObject, defaultCatalog); | ||
} | ||
|
||
public static void importUserEventsFromGcs(String gcsEventsObject, String defaultCatalog) | ||
throws IOException, InterruptedException { | ||
try { | ||
String gcsBucket = String.format("gs://%s", System.getenv("EVENTS_BUCKET_NAME")); | ||
String gcsErrorsBucket = String.format("%s/error", gcsBucket); | ||
|
||
GcsSource gcsSource = | ||
GcsSource.newBuilder() | ||
.addInputUris(String.format("%s/%s", gcsBucket, gcsEventsObject)) | ||
.build(); | ||
|
||
UserEventInputConfig inputConfig = | ||
UserEventInputConfig.newBuilder().setGcsSource(gcsSource).build(); | ||
|
||
ImportErrorsConfig errorsConfig = | ||
ImportErrorsConfig.newBuilder().setGcsPrefix(gcsErrorsBucket).build(); | ||
|
||
ImportUserEventsRequest importRequest = | ||
ImportUserEventsRequest.newBuilder() | ||
.setParent(defaultCatalog) | ||
.setInputConfig(inputConfig) | ||
.setErrorsConfig(errorsConfig) | ||
.build(); | ||
|
||
System.out.printf("Import user events from google cloud source request: %s%n", importRequest); | ||
|
||
// Initialize client that will be used to send requests. This client only needs to be created | ||
// once, and can be reused for multiple requests. After completing all of your requests, call | ||
// the "close" method on the client to safely clean up any remaining background resources. | ||
try (UserEventServiceClient serviceClient = UserEventServiceClient.create()) { | ||
String operationName = | ||
serviceClient.importUserEventsCallable().call(importRequest).getName(); | ||
|
||
System.out.printf("OperationName = %s\n", operationName); | ||
|
||
OperationsClient operationsClient = serviceClient.getOperationsClient(); | ||
Operation operation = operationsClient.getOperation(operationName); | ||
|
||
while (!operation.getDone()) { | ||
// Keep polling the operation periodically until the import task is done. | ||
int awaitDuration = 30000; | ||
Thread.sleep(awaitDuration); | ||
operation = operationsClient.getOperation(operationName); | ||
} | ||
|
||
if (operation.hasMetadata()) { | ||
ImportMetadata metadata = operation.getMetadata().unpack(ImportMetadata.class); | ||
System.out.printf( | ||
"Number of successfully imported events: %s\n", metadata.getSuccessCount()); | ||
System.out.printf( | ||
"Number of failures during the importing: %s\n", metadata.getFailureCount()); | ||
} | ||
|
||
if (operation.hasResponse()) { | ||
ImportUserEventsResponse response = | ||
operation.getResponse().unpack(ImportUserEventsResponse.class); | ||
System.out.printf("Operation result: %s%n", response); | ||
} | ||
} catch (InvalidArgumentException e) { | ||
System.out.printf( | ||
"Given GCS input path was not found. %n%s%n " | ||
+ "Please run CreateTestResources class to create resources.", | ||
e.getMessage()); | ||
} | ||
} catch (BigQueryException e) { | ||
System.out.printf("Exception message: %s", e.getMessage()); | ||
} | ||
} | ||
} | ||
|
||
// [END retail_import_user_events_from_gcs] |
129 changes: 129 additions & 0 deletions
129
retail/interactive-tutorials/src/main/java/events/ImportUserEventsInline.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* | ||
* Copyright 2022 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
// [START retail_import_user_events_from_inline_source] | ||
|
||
/* | ||
* Import user events into a catalog from inline source using Retail API | ||
*/ | ||
|
||
package events; | ||
|
||
import com.google.api.gax.longrunning.OperationFuture; | ||
import com.google.cloud.ServiceOptions; | ||
import com.google.cloud.bigquery.BigQueryException; | ||
import com.google.cloud.retail.v2.ImportMetadata; | ||
import com.google.cloud.retail.v2.ImportUserEventsRequest; | ||
import com.google.cloud.retail.v2.ImportUserEventsResponse; | ||
import com.google.cloud.retail.v2.UserEvent; | ||
import com.google.cloud.retail.v2.UserEventInlineSource; | ||
import com.google.cloud.retail.v2.UserEventInputConfig; | ||
import com.google.cloud.retail.v2.UserEventServiceClient; | ||
import com.google.protobuf.Timestamp; | ||
import java.io.IOException; | ||
import java.time.Instant; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.UUID; | ||
import java.util.concurrent.ExecutionException; | ||
import java.util.concurrent.TimeUnit; | ||
|
||
public class ImportUserEventsInline { | ||
|
||
public static void main(String[] args) | ||
throws IOException, ExecutionException, InterruptedException { | ||
// TODO(developer): Replace these variables before running the sample. | ||
String projectId = ServiceOptions.getDefaultProjectId(); | ||
String defaultCatalog = | ||
String.format("projects/%s/locations/global/catalogs/default_catalog", projectId); | ||
|
||
importUserEventsFromInlineSource(defaultCatalog); | ||
} | ||
|
||
public static void importUserEventsFromInlineSource(String defaultCatalog) | ||
throws IOException, ExecutionException, InterruptedException { | ||
try { | ||
int userEventsNumber = 3; | ||
int awaitDuration = 30; | ||
List<UserEvent> userEvents = new ArrayList<>(); | ||
|
||
for (int i = 0; i < userEventsNumber; i++) { | ||
Instant time = Instant.now(); | ||
Timestamp timestamp = Timestamp.newBuilder().setSeconds(time.getEpochSecond()).build(); | ||
|
||
UserEvent userEvent = | ||
UserEvent.newBuilder() | ||
.setEventType("home-page-view") | ||
.setVisitorId(UUID.randomUUID().toString()) | ||
.setEventTime(timestamp) | ||
.build(); | ||
|
||
userEvents.add(userEvent); | ||
|
||
System.out.printf("User Event: %s%n", i); | ||
System.out.println(userEvent); | ||
} | ||
|
||
UserEventInlineSource inlineSource = | ||
UserEventInlineSource.newBuilder().addAllUserEvents(userEvents).build(); | ||
|
||
UserEventInputConfig inputConfig = | ||
UserEventInputConfig.newBuilder().setUserEventInlineSource(inlineSource).build(); | ||
|
||
ImportUserEventsRequest importRequest = | ||
ImportUserEventsRequest.newBuilder() | ||
.setParent(defaultCatalog) | ||
.setInputConfig(inputConfig) | ||
.build(); | ||
System.out.printf("Import user events from inline source request: %s%n", importRequest); | ||
|
||
// Initialize client that will be used to send requests. This client only needs to be created | ||
// once, and can be reused for multiple requests. After completing all of your requests, call | ||
// the "close" method on the client to safely clean up any remaining background resources. | ||
try (UserEventServiceClient userEventServiceClient = UserEventServiceClient.create()) { | ||
OperationFuture<ImportUserEventsResponse, ImportMetadata> importOperation = | ||
userEventServiceClient.importUserEventsAsync(importRequest); | ||
|
||
System.out.printf("The operation was started: %s%n", importOperation.getName()); | ||
System.out.println("Please wait till operation is done."); | ||
|
||
userEventServiceClient.awaitTermination(awaitDuration, TimeUnit.SECONDS); | ||
System.out.println("Import user events operation is done."); | ||
|
||
if (importOperation.getMetadata().get() != null) { | ||
System.out.printf( | ||
"Number of successfully imported events: %s%n", | ||
importOperation.getMetadata().get().getSuccessCount()); | ||
|
||
System.out.printf( | ||
"Number of failures during the importing: %s%n", | ||
importOperation.getMetadata().get().getFailureCount()); | ||
} else { | ||
System.out.println("Metadata in bigQuery operation is empty."); | ||
} | ||
if (importOperation.get() != null) { | ||
System.out.printf("Operation result: %s%n", importOperation.get()); | ||
} else { | ||
System.out.println("Operation result is empty."); | ||
} | ||
} | ||
} catch (BigQueryException e) { | ||
System.out.printf("Exception message: %s", e.getMessage()); | ||
} | ||
} | ||
} | ||
|
||
// [END retail_import_user_events_from_inline_source] |
Oops, something went wrong.