From 88c590ad41ea6ff6e4d4c80899d3a5506a2fed58 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Tue, 21 Apr 2026 18:12:04 +0000 Subject: [PATCH 01/10] feat(retail): add Vertex AI Search for commerce snippets --- retail/snippets/README.md | 26 ++++ retail/snippets/pom.xml | 73 ++++++++++ .../main/java/com/example/search/Search.java | 67 ++++++++++ .../java/com/example/search/SearchOffset.java | 70 ++++++++++ .../com/example/search/SearchPagination.java | 81 ++++++++++++ .../java/com/example/search/SearchIT.java | 91 +++++++++++++ .../com/example/search/SearchOffsetIT.java | 106 +++++++++++++++ .../example/search/SearchPaginationIT.java | 101 ++++++++++++++ .../test/java/com/example/search/Utils.java | 125 ++++++++++++++++++ 9 files changed, 740 insertions(+) create mode 100644 retail/snippets/README.md create mode 100644 retail/snippets/pom.xml create mode 100644 retail/snippets/src/main/java/com/example/search/Search.java create mode 100644 retail/snippets/src/main/java/com/example/search/SearchOffset.java create mode 100644 retail/snippets/src/main/java/com/example/search/SearchPagination.java create mode 100644 retail/snippets/src/test/java/com/example/search/SearchIT.java create mode 100644 retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java create mode 100644 retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java create mode 100644 retail/snippets/src/test/java/com/example/search/Utils.java diff --git a/retail/snippets/README.md b/retail/snippets/README.md new file mode 100644 index 00000000000..9c44aecbfae --- /dev/null +++ b/retail/snippets/README.md @@ -0,0 +1,26 @@ +# Vertex AI Search for commerce Samples + +This directory contains Java samples for [Vertex AI Search for commerce](https://cloud.google.com/retail/docs/search-basic#search). + +## Prerequisites + +To run these samples, you must have: + +1. **A Google Cloud Project** with the [Vertex AI Search for commerce API](https://console.cloud.google.com/apis/library/retail.googleapis.com) enabled. +2. **Vertex AI Search for commerce** set up with a valid catalog and serving configuration (placement). +3. **Authentication**: These samples use [Application Default Credentials (ADC)](https://cloud.google.com/docs/authentication/provide-credentials-adc). + - If running locally, you can set up ADC by running: + ```bash + gcloud auth application-default login + ``` +4. **IAM Roles**: The service account or user running the samples needs the `roles/retail.viewer` (Retail Viewer) role or higher. + +## Samples + +- **[Search.java](src/main/java/com/example/search/Search.java)**: Basic search request showing both text search and browse search (using categories). +- **[SearchPagination.java](src/main/java/com/example/search/SearchPagination.java)**: Shows how to use `next_page_token` to paginate through search results. +- **[SearchOffset.java](src/main/java/com/example/search/SearchOffset.java)**: Shows how to use `offset` to skip a specified number of results. + +## Documentation + +For more information, see the [Vertex AI Search for commerce documentation](https://docs.cloud.google.com/retail/docs/search-basic#search). \ No newline at end of file diff --git a/retail/snippets/pom.xml b/retail/snippets/pom.xml new file mode 100644 index 00000000000..c35e816282b --- /dev/null +++ b/retail/snippets/pom.xml @@ -0,0 +1,73 @@ + + + + 4.0.0 + com.example.retail + retail-samples + 1.0-SNAPSHOT + + + + shared-configuration + com.google.cloud.samples + 1.2.2 + + + + 21 + 21 + + + + + + libraries-bom + com.google.cloud + import + pom + 26.80.0 + + + + + + + com.google.cloud + google-cloud-retail + 2.93.0 + + + + + truth + com.google.truth + test + 1.4.5 + + + org.junit.jupiter + junit-jupiter + 5.14.3 + test + + + diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java new file mode 100644 index 00000000000..2ec7bb28dc9 --- /dev/null +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -0,0 +1,67 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +// [START retail_v2_search_request] + +import com.google.cloud.retail.v2.BranchName; +import com.google.cloud.retail.v2.Product; +import com.google.cloud.retail.v2.SearchRequest; +import com.google.cloud.retail.v2.SearchResponse; +import com.google.cloud.retail.v2.SearchResponse.SearchResult; +import com.google.cloud.retail.v2.SearchServiceClient; +import com.google.cloud.retail.v2.SearchServiceClient.SearchPagedResponse; +import com.google.cloud.retail.v2.ServingConfigName; +import java.io.IOException; + +public class Search { + public static void main(String[] args) throws IOException { + String projectId = "my-project-id"; + String visitorId = "my-visitor-id"; + String query = "my search query"; + + search(projectId, visitorId, query); + } + + public static void search(String projectId, String visitorId, String query) throws IOException { + try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { + ServingConfigName servingConfigName = + ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + BranchName branchName = + BranchName.of(projectId, "global", "default_catalog", "default_branch"); + SearchRequest searchRequest = + SearchRequest.newBuilder() + .setPlacement(servingConfigName.toString()) + .setBranch(branchName.toString()) + .setVisitorId(visitorId) + .setQuery(query) + .setPageSize(10) + .build(); + SearchPagedResponse response = searchServiceClient.search(searchRequest); + + SearchResponse searchResponse = response.getPage().getResponse(); + + System.out.println("Found " + searchResponse.getResultsCount() + " results"); + for (SearchResult searchResult : searchResponse.getResultsList()) { + Product product = searchResult.getProduct(); + System.out.println("---- Search Result ----"); + System.out.println("Product Name: " + product.getName()); + } + } + } +} +// [END retail_v2_search_request] diff --git a/retail/snippets/src/main/java/com/example/search/SearchOffset.java b/retail/snippets/src/main/java/com/example/search/SearchOffset.java new file mode 100644 index 00000000000..94738924603 --- /dev/null +++ b/retail/snippets/src/main/java/com/example/search/SearchOffset.java @@ -0,0 +1,70 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +// [START retail_v2_search_offset] + +import com.google.cloud.retail.v2.BranchName; +import com.google.cloud.retail.v2.Product; +import com.google.cloud.retail.v2.SearchRequest; +import com.google.cloud.retail.v2.SearchResponse; +import com.google.cloud.retail.v2.SearchResponse.SearchResult; +import com.google.cloud.retail.v2.SearchServiceClient; +import com.google.cloud.retail.v2.SearchServiceClient.SearchPagedResponse; +import com.google.cloud.retail.v2.ServingConfigName; +import java.io.IOException; + +public class SearchOffset { + public static void main(String[] args) throws IOException { + String projectId = "my-project-id"; + String visitorId = "my-visitor-id"; + String query = "my search query"; + int offset = 10; + + searchWithOffset(projectId, visitorId, query, offset); + } + + public static void searchWithOffset(String projectId, String visitorId, String query, int offset) + throws IOException { + try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { + ServingConfigName servingConfigName = + ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + BranchName branchName = + BranchName.of(projectId, "global", "default_catalog", "default_branch"); + SearchRequest searchRequest = + SearchRequest.newBuilder() + .setPlacement(servingConfigName.toString()) + .setBranch(branchName.toString()) + .setVisitorId(visitorId) + .setQuery(query) + .setPageSize(10) + .setOffset(offset) + .build(); + SearchPagedResponse response = searchServiceClient.search(searchRequest); + + SearchResponse searchResponse = response.getPage().getResponse(); + + System.out.println("Found " + searchResponse.getResultsCount() + " results"); + for (SearchResult searchResult : searchResponse.getResultsList()) { + Product product = searchResult.getProduct(); + System.out.println("---- Search Result ----"); + System.out.println("Product Name: " + product.getName()); + } + } + } +} +// [END retail_v2_search_offset] diff --git a/retail/snippets/src/main/java/com/example/search/SearchPagination.java b/retail/snippets/src/main/java/com/example/search/SearchPagination.java new file mode 100644 index 00000000000..492db9bcfa5 --- /dev/null +++ b/retail/snippets/src/main/java/com/example/search/SearchPagination.java @@ -0,0 +1,81 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +// [START retail_v2_search_pagination] + +import com.google.cloud.retail.v2.BranchName; +import com.google.cloud.retail.v2.Product; +import com.google.cloud.retail.v2.SearchRequest; +import com.google.cloud.retail.v2.SearchResponse.SearchResult; +import com.google.cloud.retail.v2.SearchServiceClient; +import com.google.cloud.retail.v2.SearchServiceClient.SearchPage; +import com.google.cloud.retail.v2.SearchServiceClient.SearchPagedResponse; +import com.google.cloud.retail.v2.ServingConfigName; +import java.io.IOException; + +public class SearchPagination { + public static void main(String[] args) throws IOException { + String projectId = "my-project-id"; + String visitorId = "my-visitor-id"; + String query = "my search query"; + int pageSize = 10; + + searchWithPagination(projectId, visitorId, query, pageSize); + } + + public static void searchWithPagination( + String projectId, String visitorId, String query, int pageSize) throws IOException { + try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { + ServingConfigName servingConfigName = + ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + BranchName branchName = + BranchName.of(projectId, "global", "default_catalog", "default_branch"); + SearchRequest request = + SearchRequest.newBuilder() + .setPlacement(servingConfigName.toString()) + .setBranch(branchName.toString()) + .setVisitorId(visitorId) + .setQuery(query) + .setPageSize(pageSize) + .build(); + int currentPage = 0; + while (true) { + SearchPagedResponse response = searchServiceClient.search(request); + + SearchPage page = response.getPage(); + currentPage++; + System.out.println("\nResults of page number " + currentPage + ":"); + System.out.println("Found " + page.getResponse().getResultsCount() + " results"); + for (SearchResult searchResult : page.getResponse().getResultsList()) { + System.out.println("Search Result: \n" + searchResult); + Product product = searchResult.getProduct(); + System.out.println("---- Search Result ----"); + System.out.println("Product Name: " + product.getName()); + } + + if (page.hasNextPage()) { + request = request.toBuilder().setPageToken(page.getNextPageToken()).build(); + } else { + System.out.println("\nNo more available pages."); + break; + } + } + } + } +} +// [END retail_v2_search_pagination] diff --git a/retail/snippets/src/test/java/com/example/search/SearchIT.java b/retail/snippets/src/test/java/com/example/search/SearchIT.java new file mode 100644 index 00000000000..fca9db59719 --- /dev/null +++ b/retail/snippets/src/test/java/com/example/search/SearchIT.java @@ -0,0 +1,91 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import com.google.cloud.retail.v2.Product; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.List; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class SearchIT { + private static PrintStream origPrintStream; + private static ByteArrayOutputStream bout; + + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String VISITOR_ID = "test_visitor"; + private static final int NUM_PRODUCTS_TO_TEST = 2; + private static final String PRODUCT_TITLE = "Hot Java Testing"; + private static List productsToTest; + + private static void requireEnvVar(String varName) { + assertNotNull( + "Environment variable " + varName + " is required to perform these tests.", + System.getenv(varName)); + } + + @BeforeAll + public static void setUp() throws InterruptedException, IOException { + requireEnvVar("GOOGLE_CLOUD_PROJECT"); + + // Create products to be searched + productsToTest = Utils.createProductsToTest(NUM_PRODUCTS_TO_TEST, PROJECT_ID, PRODUCT_TITLE); + Utils.waitForProductsToBeIndexed(PROJECT_ID, productsToTest, PRODUCT_TITLE); + + origPrintStream = System.out; + bout = new ByteArrayOutputStream(); + System.setOut(new PrintStream(bout)); + } + + @AfterAll + public static void tearDown() throws IOException { + // Clean up products created for testing + for (Product product : productsToTest) { + Utils.deleteProduct(product.getName()); + } + + System.setOut(origPrintStream); + } + + @Test + public void testSearch() throws Exception { + Search.search(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE); + String output = bout.toString(); + assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results"); + assertThat(output).contains("Product Name:"); + } + + @Test + public void testSearchWithoutQueryString() throws Exception { + Search.search(PROJECT_ID, VISITOR_ID, ""); + String output = bout.toString(); + assertThat(output).contains("Product Name:"); + } + + @Test + public void testSearch_productsNotFound() throws Exception { + Search.search(PROJECT_ID, VISITOR_ID, "INVALID_QUERY_VALUE_FOR_TEST"); + String output = bout.toString(); + assertThat(output).contains("Found " + 0 + " results"); + } +} diff --git a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java new file mode 100644 index 00000000000..72c5c006cd0 --- /dev/null +++ b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java @@ -0,0 +1,106 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.cloud.retail.v2.Product; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.List; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class SearchOffsetIT { + private static PrintStream origPrintStream; + private static ByteArrayOutputStream bout; + + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String VISITOR_ID = "test_visitor"; + private static final int NUM_PRODUCTS_TO_TEST = 2; + private static final String PRODUCT_TITLE = "Hot Java Testing"; + private static List productsToTest; + + private static void requireEnvVar(String varName) { + assertNotNull( + "Environment variable " + varName + " is required to perform these tests.", + System.getenv(varName)); + } + + @BeforeAll + public static void setUp() throws InterruptedException, IOException { + requireEnvVar("GOOGLE_CLOUD_PROJECT"); + + // Create products to be searched + productsToTest = Utils.createProductsToTest(NUM_PRODUCTS_TO_TEST, PROJECT_ID, PRODUCT_TITLE); + Utils.waitForProductsToBeIndexed(PROJECT_ID, productsToTest, PRODUCT_TITLE); + + origPrintStream = System.out; + bout = new ByteArrayOutputStream(); + System.setOut(new PrintStream(bout)); + } + + @AfterAll + public static void tearDown() throws IOException { + // Clean up products created for testing + for (Product product : productsToTest) { + Utils.deleteProduct(product.getName()); + } + + System.setOut(origPrintStream); + } + + @Test + public void testSearchWithOffset() throws Exception { + int offset = 1; + SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); + String output = bout.toString(); + assertThat(output).contains("Found " + (NUM_PRODUCTS_TO_TEST - offset) + " results"); + assertThat(output).contains("Product Name:"); + } + + @Test + public void testSearchWithOffset_offsetEqualsZero() throws Exception { + int offset = 0; + SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); + String output = bout.toString(); + assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results"); + assertThat(output).contains("Product Name:"); + } + + @Test + public void testSearchWithOffset_offsetTooLarge_foundZeroResults() throws Exception { + int offset = 5; + SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); + String output = bout.toString(); + assertThat(output).contains("Found 0 results"); + } + + @Test + public void testSearchWithOffset_negativeOffset_throwsInvalidArgumentException() + throws Exception { + int offset = -1; + assertThrows( + InvalidArgumentException.class, + () -> SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset)); + } +} diff --git a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java new file mode 100644 index 00000000000..ae5a9c6bf45 --- /dev/null +++ b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java @@ -0,0 +1,101 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.google.api.gax.rpc.InvalidArgumentException; +import com.google.cloud.retail.v2.Product; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.List; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class SearchPaginationIT { + private static PrintStream origPrintStream; + private static ByteArrayOutputStream bout; + + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String VISITOR_ID = "test_visitor"; + private static final int NUM_PRODUCTS_TO_TEST = 2; + private static final String PRODUCT_TITLE = "Hot Java Testing"; + private static List productsToTest; + + private static void requireEnvVar(String varName) { + assertNotNull( + "Environment variable " + varName + " is required to perform these tests.", + System.getenv(varName)); + } + + @BeforeAll + public static void setUp() throws InterruptedException, IOException { + requireEnvVar("GOOGLE_CLOUD_PROJECT"); + + // Create products to be searched + productsToTest = Utils.createProductsToTest(NUM_PRODUCTS_TO_TEST, PROJECT_ID, PRODUCT_TITLE); + Utils.waitForProductsToBeIndexed(PROJECT_ID, productsToTest, PRODUCT_TITLE); + + origPrintStream = System.out; + bout = new ByteArrayOutputStream(); + System.setOut(new PrintStream(bout)); + } + + @AfterAll + public static void tearDown() throws IOException { + // Clean up products created for testing + for (Product product : productsToTest) { + Utils.deleteProduct(product.getName()); + } + + System.setOut(origPrintStream); + } + + @Test + public void testSearchWithPaginationAndMultiplePages() throws Exception { + SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, 1); + String output = bout.toString(); + assertThat(output).contains("Results of page number 1:"); + assertThat(output).contains("Found 1 results"); + assertThat(output).contains("Results of page number 2:"); + assertThat(output).contains("Found 1 results"); + assertThat(output).contains("No more available pages."); + } + + @Test + public void testSearchWithPaginationAndSinglePage() throws Exception { + SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, 10); + String output = bout.toString(); + assertThat(output).contains("Results of page number 1:"); + assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results"); + assertThat(output).contains("No more available pages."); + } + + @Test + public void testSearchWithPagination_negativePageSize_throwsInvalidArgumentException() + throws Exception { + int pageSize = -1; + assertThrows( + InvalidArgumentException.class, + () -> + SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, pageSize)); + } +} diff --git a/retail/snippets/src/test/java/com/example/search/Utils.java b/retail/snippets/src/test/java/com/example/search/Utils.java new file mode 100644 index 00000000000..d32ec5cc9dd --- /dev/null +++ b/retail/snippets/src/test/java/com/example/search/Utils.java @@ -0,0 +1,125 @@ +/* + * Copyright 2026 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. + */ + +package com.example.search; + +import com.google.cloud.retail.v2.BranchName; +import com.google.cloud.retail.v2.CreateProductRequest; +import com.google.cloud.retail.v2.DeleteProductRequest; +import com.google.cloud.retail.v2.PriceInfo; +import com.google.cloud.retail.v2.Product; +import com.google.cloud.retail.v2.Product.Availability; +import com.google.cloud.retail.v2.Product.Type; +import com.google.cloud.retail.v2.ProductServiceClient; +import com.google.cloud.retail.v2.SearchRequest; +import com.google.cloud.retail.v2.SearchServiceClient; +import com.google.cloud.retail.v2.SearchServiceClient.SearchPagedResponse; +import com.google.cloud.retail.v2.ServingConfigName; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class Utils { + + public static List createProductsToTest( + int amount, String projectId, String productTitle) throws IOException { + List productIds = new ArrayList<>(); + for (int i = 0; i < amount; i++) { + productIds.add(UUID.randomUUID().toString()); + } + return createProducts(projectId, productIds, productTitle); + } + + public static List createProducts( + String projectId, List productIds, String productTitle) throws IOException { + BranchName branchName = BranchName.of(projectId, "global", "default_catalog", "default_branch"); + + float price = 8.0f; + float originalPrice = 12.0f; + + PriceInfo priceInfo = + PriceInfo.newBuilder() + .setPrice(price) + .setOriginalPrice(originalPrice) + .setCurrencyCode("USD") + .build(); + + Product generatedProduct = + Product.newBuilder() + .setTitle(productTitle) + .setType(Type.PRIMARY) + .addCategories("Beverages") + .addBrands("Google") + .setPriceInfo(priceInfo) + .setAvailability(Availability.IN_STOCK) + .build(); + List createdProducts = new ArrayList<>(); + try (ProductServiceClient serviceClient = ProductServiceClient.create()) { + for (String productId : productIds) { + CreateProductRequest createProductRequest = + CreateProductRequest.newBuilder() + .setProduct(generatedProduct) + .setProductId(productId) + .setParent(branchName.toString()) + .build(); + + createdProducts.add(serviceClient.createProduct(createProductRequest)); + } + } + return createdProducts; + } + + public static void deleteProduct(String productName) throws IOException { + DeleteProductRequest deleteProductRequest = + DeleteProductRequest.newBuilder().setName(productName).build(); + + try (ProductServiceClient serviceClient = ProductServiceClient.create()) { + serviceClient.deleteProduct(deleteProductRequest); + } + } + + public static int amountOfProductsReadyToTest(String projectId, String query) throws IOException { + try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { + ServingConfigName servingConfigName = + ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + BranchName branchName = + BranchName.of(projectId, "global", "default_catalog", "default_branch"); + SearchRequest searchRequest = + SearchRequest.newBuilder() + .setPlacement(servingConfigName.toString()) + .setBranch(branchName.toString()) + .setVisitorId("test_visitor") + .setQuery(query) + .setPageSize(2) + .build(); + SearchPagedResponse response = searchServiceClient.search(searchRequest); + + return response.getPage().getResponse().getResultsCount(); + } + } + + public static void waitForProductsToBeIndexed( + String projectId, List products, String productTitle) + throws InterruptedException, IOException { + for (int i = 0; i < 3; i++) { + Thread.sleep(10000); + if (amountOfProductsReadyToTest(projectId, productTitle) >= products.size()) { + break; + } + } + } +} From 8453828a5b230d78e78dc0aad3d4aff27169ebab Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Wed, 22 Apr 2026 17:08:56 +0000 Subject: [PATCH 02/10] Clean up --- .../src/main/java/com/example/search/Search.java | 2 +- .../src/main/java/com/example/search/SearchOffset.java | 2 +- .../main/java/com/example/search/SearchPagination.java | 4 ++-- .../src/test/java/com/example/search/SearchIT.java | 4 ++-- .../src/test/java/com/example/search/SearchOffsetIT.java | 7 ++++--- .../test/java/com/example/search/SearchPaginationIT.java | 6 +++--- .../snippets/src/test/java/com/example/search/Utils.java | 9 +++++---- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java index 2ec7bb28dc9..3d09e7705e0 100644 --- a/retail/snippets/src/main/java/com/example/search/Search.java +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -55,7 +55,7 @@ public static void search(String projectId, String visitorId, String query) thro SearchResponse searchResponse = response.getPage().getResponse(); - System.out.println("Found " + searchResponse.getResultsCount() + " results"); + System.out.println("Found " + searchResponse.getResultsCount() + " results in current page"); for (SearchResult searchResult : searchResponse.getResultsList()) { Product product = searchResult.getProduct(); System.out.println("---- Search Result ----"); diff --git a/retail/snippets/src/main/java/com/example/search/SearchOffset.java b/retail/snippets/src/main/java/com/example/search/SearchOffset.java index 94738924603..1a8edd681da 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchOffset.java +++ b/retail/snippets/src/main/java/com/example/search/SearchOffset.java @@ -58,7 +58,7 @@ public static void searchWithOffset(String projectId, String visitorId, String q SearchResponse searchResponse = response.getPage().getResponse(); - System.out.println("Found " + searchResponse.getResultsCount() + " results"); + System.out.println("Found " + searchResponse.getResultsCount() + " results in current page"); for (SearchResult searchResult : searchResponse.getResultsList()) { Product product = searchResult.getProduct(); System.out.println("---- Search Result ----"); diff --git a/retail/snippets/src/main/java/com/example/search/SearchPagination.java b/retail/snippets/src/main/java/com/example/search/SearchPagination.java index 492db9bcfa5..ec69a83fd04 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchPagination.java +++ b/retail/snippets/src/main/java/com/example/search/SearchPagination.java @@ -60,9 +60,9 @@ public static void searchWithPagination( SearchPage page = response.getPage(); currentPage++; System.out.println("\nResults of page number " + currentPage + ":"); - System.out.println("Found " + page.getResponse().getResultsCount() + " results"); + System.out.println( + "Found " + page.getResponse().getResultsCount() + " results in current page"); for (SearchResult searchResult : page.getResponse().getResultsList()) { - System.out.println("Search Result: \n" + searchResult); Product product = searchResult.getProduct(); System.out.println("---- Search Result ----"); System.out.println("Product Name: " + product.getName()); diff --git a/retail/snippets/src/test/java/com/example/search/SearchIT.java b/retail/snippets/src/test/java/com/example/search/SearchIT.java index fca9db59719..52718658490 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchIT.java @@ -71,7 +71,7 @@ public static void tearDown() throws IOException { public void testSearch() throws Exception { Search.search(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE); String output = bout.toString(); - assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results"); + assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); assertThat(output).contains("Product Name:"); } @@ -86,6 +86,6 @@ public void testSearchWithoutQueryString() throws Exception { public void testSearch_productsNotFound() throws Exception { Search.search(PROJECT_ID, VISITOR_ID, "INVALID_QUERY_VALUE_FOR_TEST"); String output = bout.toString(); - assertThat(output).contains("Found " + 0 + " results"); + assertThat(output).contains("Found " + 0 + " results in current page"); } } diff --git a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java index 72c5c006cd0..06d39c9793c 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java @@ -74,7 +74,8 @@ public void testSearchWithOffset() throws Exception { int offset = 1; SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); String output = bout.toString(); - assertThat(output).contains("Found " + (NUM_PRODUCTS_TO_TEST - offset) + " results"); + assertThat(output) + .contains("Found " + (NUM_PRODUCTS_TO_TEST - offset) + " results in current page"); assertThat(output).contains("Product Name:"); } @@ -83,7 +84,7 @@ public void testSearchWithOffset_offsetEqualsZero() throws Exception { int offset = 0; SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); String output = bout.toString(); - assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results"); + assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); assertThat(output).contains("Product Name:"); } @@ -92,7 +93,7 @@ public void testSearchWithOffset_offsetTooLarge_foundZeroResults() throws Except int offset = 5; SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); String output = bout.toString(); - assertThat(output).contains("Found 0 results"); + assertThat(output).contains("Found 0 results in current page"); } @Test diff --git a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java index ae5a9c6bf45..5af535ee448 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java @@ -74,9 +74,9 @@ public void testSearchWithPaginationAndMultiplePages() throws Exception { SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, 1); String output = bout.toString(); assertThat(output).contains("Results of page number 1:"); - assertThat(output).contains("Found 1 results"); + assertThat(output).contains("Found 1 results in current page"); assertThat(output).contains("Results of page number 2:"); - assertThat(output).contains("Found 1 results"); + assertThat(output).contains("Found 1 results in current page"); assertThat(output).contains("No more available pages."); } @@ -85,7 +85,7 @@ public void testSearchWithPaginationAndSinglePage() throws Exception { SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, 10); String output = bout.toString(); assertThat(output).contains("Results of page number 1:"); - assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results"); + assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); assertThat(output).contains("No more available pages."); } diff --git a/retail/snippets/src/test/java/com/example/search/Utils.java b/retail/snippets/src/test/java/com/example/search/Utils.java index d32ec5cc9dd..24f2fd9f5e6 100644 --- a/retail/snippets/src/test/java/com/example/search/Utils.java +++ b/retail/snippets/src/test/java/com/example/search/Utils.java @@ -92,7 +92,8 @@ public static void deleteProduct(String productName) throws IOException { } } - public static int amountOfProductsReadyToTest(String projectId, String query) throws IOException { + public static boolean areProductsReadyToTest(String projectId, String query, int amountOfProducts) + throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { ServingConfigName servingConfigName = ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); @@ -104,11 +105,11 @@ public static int amountOfProductsReadyToTest(String projectId, String query) th .setBranch(branchName.toString()) .setVisitorId("test_visitor") .setQuery(query) - .setPageSize(2) + .setPageSize(amountOfProducts) .build(); SearchPagedResponse response = searchServiceClient.search(searchRequest); - return response.getPage().getResponse().getResultsCount(); + return response.getPage().getResponse().getResultsCount() >= amountOfProducts; } } @@ -117,7 +118,7 @@ public static void waitForProductsToBeIndexed( throws InterruptedException, IOException { for (int i = 0; i < 3; i++) { Thread.sleep(10000); - if (amountOfProductsReadyToTest(projectId, productTitle) >= products.size()) { + if (areProductsReadyToTest(projectId, productTitle, products.size())) { break; } } From 7d4ced5b49aff531ebf37a253bd434974922886d Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Wed, 22 Apr 2026 23:14:25 +0000 Subject: [PATCH 03/10] Add search by categories --- .../snippets/src/main/java/com/example/search/Search.java | 7 +++++-- .../src/test/java/com/example/search/SearchIT.java | 7 ++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java index 3d09e7705e0..be1fa9aaa17 100644 --- a/retail/snippets/src/main/java/com/example/search/Search.java +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -27,17 +27,19 @@ import com.google.cloud.retail.v2.SearchServiceClient.SearchPagedResponse; import com.google.cloud.retail.v2.ServingConfigName; import java.io.IOException; +import java.util.List; public class Search { public static void main(String[] args) throws IOException { String projectId = "my-project-id"; String visitorId = "my-visitor-id"; String query = "my search query"; + List categories = List.of("category"); - search(projectId, visitorId, query); + search(projectId, visitorId, query, categories); } - public static void search(String projectId, String visitorId, String query) throws IOException { + public static void search(String projectId, String visitorId, String query, List categories) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { ServingConfigName servingConfigName = ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); @@ -49,6 +51,7 @@ public static void search(String projectId, String visitorId, String query) thro .setBranch(branchName.toString()) .setVisitorId(visitorId) .setQuery(query) + .addAllPageCategories(categories) .setPageSize(10) .build(); SearchPagedResponse response = searchServiceClient.search(searchRequest); diff --git a/retail/snippets/src/test/java/com/example/search/SearchIT.java b/retail/snippets/src/test/java/com/example/search/SearchIT.java index 52718658490..d5c88d71c35 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchIT.java @@ -36,6 +36,7 @@ public class SearchIT { private static final String VISITOR_ID = "test_visitor"; private static final int NUM_PRODUCTS_TO_TEST = 2; private static final String PRODUCT_TITLE = "Hot Java Testing"; + private static final List CATEGORIES = List.of("Beverages"); private static List productsToTest; private static void requireEnvVar(String varName) { @@ -69,7 +70,7 @@ public static void tearDown() throws IOException { @Test public void testSearch() throws Exception { - Search.search(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE); + Search.search(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, CATEGORIES); String output = bout.toString(); assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); assertThat(output).contains("Product Name:"); @@ -77,14 +78,14 @@ public void testSearch() throws Exception { @Test public void testSearchWithoutQueryString() throws Exception { - Search.search(PROJECT_ID, VISITOR_ID, ""); + Search.search(PROJECT_ID, VISITOR_ID, "", CATEGORIES); String output = bout.toString(); assertThat(output).contains("Product Name:"); } @Test public void testSearch_productsNotFound() throws Exception { - Search.search(PROJECT_ID, VISITOR_ID, "INVALID_QUERY_VALUE_FOR_TEST"); + Search.search(PROJECT_ID, VISITOR_ID, "INVALID_QUERY_VALUE_FOR_TEST", CATEGORIES); String output = bout.toString(); assertThat(output).contains("Found " + 0 + " results in current page"); } From 9df438cb8e1bf2bc790c0901cbe22ad7cdd340a7 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Wed, 22 Apr 2026 23:22:15 +0000 Subject: [PATCH 04/10] Remove dependency version --- retail/snippets/pom.xml | 1 - retail/snippets/src/main/java/com/example/search/Search.java | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/retail/snippets/pom.xml b/retail/snippets/pom.xml index c35e816282b..0066e78fb56 100644 --- a/retail/snippets/pom.xml +++ b/retail/snippets/pom.xml @@ -53,7 +53,6 @@ com.google.cloud google-cloud-retail - 2.93.0 diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java index be1fa9aaa17..587eabc2da2 100644 --- a/retail/snippets/src/main/java/com/example/search/Search.java +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -39,7 +39,9 @@ public static void main(String[] args) throws IOException { search(projectId, visitorId, query, categories); } - public static void search(String projectId, String visitorId, String query, List categories) throws IOException { + public static void search( + String projectId, String visitorId, String query, List categories) + throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { ServingConfigName servingConfigName = ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); From 549df15746da4e34e9ff20fe622336e7d1ae4167 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Fri, 24 Apr 2026 17:04:30 +0000 Subject: [PATCH 05/10] Add description to samples --- .../src/main/java/com/example/search/Search.java | 12 ++++++++++++ .../main/java/com/example/search/SearchOffset.java | 11 +++++++++++ .../java/com/example/search/SearchPagination.java | 11 +++++++++++ 3 files changed, 34 insertions(+) diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java index 587eabc2da2..66559bb6be6 100644 --- a/retail/snippets/src/main/java/com/example/search/Search.java +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -39,6 +39,18 @@ public static void main(String[] args) throws IOException { search(projectId, visitorId, query, categories); } + /** + * Search for products using Vertex AI Search for commerce. + * + * Performs a search request for a specific placement. Handles both text search (using query) + * and browse search (using page_categories). + * + * @param projectId The Google Cloud project ID. + * @param visitorId A unique identifier for the user. + * @param query The search term for text search. + * @param categories The categories for browse search. + * @throws IOException + */ public static void search( String projectId, String visitorId, String query, List categories) throws IOException { diff --git a/retail/snippets/src/main/java/com/example/search/SearchOffset.java b/retail/snippets/src/main/java/com/example/search/SearchOffset.java index 1a8edd681da..4fb5e198c70 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchOffset.java +++ b/retail/snippets/src/main/java/com/example/search/SearchOffset.java @@ -38,6 +38,17 @@ public static void main(String[] args) throws IOException { searchWithOffset(projectId, visitorId, query, offset); } + /** + * Search for products with an offset using Vertex AI Search for commerce. + * + * Performs a search request starting from a specified position. + * + * @param projectId The Google Cloud project ID. + * @param visitorId A unique identifier for the user. + * @param query The search term for text search. + * @param offset The number of results to skip. + * @throws IOException + */ public static void searchWithOffset(String projectId, String visitorId, String query, int offset) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { diff --git a/retail/snippets/src/main/java/com/example/search/SearchPagination.java b/retail/snippets/src/main/java/com/example/search/SearchPagination.java index ec69a83fd04..f18e3136a7f 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchPagination.java +++ b/retail/snippets/src/main/java/com/example/search/SearchPagination.java @@ -38,6 +38,17 @@ public static void main(String[] args) throws IOException { searchWithPagination(projectId, visitorId, query, pageSize); } + /** + * Search for products with pagination using Vertex AI Search for commerce. + * + * Performs a search request, then uses the next_page_token to get the next page. + * + * @param projectId The Google Cloud project ID. + * @param visitorId A unique identifier for the user. + * @param query The search term for text search. + * @param pageSize The amount of results per page. + * @throws IOException + */ public static void searchWithPagination( String projectId, String visitorId, String query, int pageSize) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { From a2babab51b2188e8a45bf5d26213c24393c1a666 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Fri, 24 Apr 2026 17:05:30 +0000 Subject: [PATCH 06/10] Refactor deletion of products to test --- .../src/test/java/com/example/search/SearchIT.java | 4 +--- .../test/java/com/example/search/SearchOffsetIT.java | 4 +--- .../java/com/example/search/SearchPaginationIT.java | 4 +--- .../src/test/java/com/example/search/Utils.java | 12 +++++++----- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/retail/snippets/src/test/java/com/example/search/SearchIT.java b/retail/snippets/src/test/java/com/example/search/SearchIT.java index d5c88d71c35..18b4be5e28b 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchIT.java @@ -61,9 +61,7 @@ public static void setUp() throws InterruptedException, IOException { @AfterAll public static void tearDown() throws IOException { // Clean up products created for testing - for (Product product : productsToTest) { - Utils.deleteProduct(product.getName()); - } + Utils.deleteProducts(productsToTest); System.setOut(origPrintStream); } diff --git a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java index 06d39c9793c..e747042a3c3 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java @@ -62,9 +62,7 @@ public static void setUp() throws InterruptedException, IOException { @AfterAll public static void tearDown() throws IOException { // Clean up products created for testing - for (Product product : productsToTest) { - Utils.deleteProduct(product.getName()); - } + Utils.deleteProducts(productsToTest); System.setOut(origPrintStream); } diff --git a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java index 5af535ee448..19bbd5b17ae 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java @@ -62,9 +62,7 @@ public static void setUp() throws InterruptedException, IOException { @AfterAll public static void tearDown() throws IOException { // Clean up products created for testing - for (Product product : productsToTest) { - Utils.deleteProduct(product.getName()); - } + Utils.deleteProducts(productsToTest); System.setOut(origPrintStream); } diff --git a/retail/snippets/src/test/java/com/example/search/Utils.java b/retail/snippets/src/test/java/com/example/search/Utils.java index 24f2fd9f5e6..d4519782ac5 100644 --- a/retail/snippets/src/test/java/com/example/search/Utils.java +++ b/retail/snippets/src/test/java/com/example/search/Utils.java @@ -83,12 +83,14 @@ public static List createProducts( return createdProducts; } - public static void deleteProduct(String productName) throws IOException { - DeleteProductRequest deleteProductRequest = - DeleteProductRequest.newBuilder().setName(productName).build(); - + public static void deleteProducts(List products) throws IOException { try (ProductServiceClient serviceClient = ProductServiceClient.create()) { - serviceClient.deleteProduct(deleteProductRequest); + for (Product product : products) { + DeleteProductRequest deleteProductRequest = + DeleteProductRequest.newBuilder().setName(product.getName()).build(); + + serviceClient.deleteProduct(deleteProductRequest); + } } } From 30cb5a3ff87c715c12dfd70af6dc1fd1e0bd51e3 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Fri, 24 Apr 2026 17:22:52 +0000 Subject: [PATCH 07/10] Refactor method to wait for products to be ready --- .../java/com/example/search/SearchIT.java | 2 +- .../com/example/search/SearchOffsetIT.java | 2 +- .../example/search/SearchPaginationIT.java | 2 +- .../test/java/com/example/search/Utils.java | 26 ++++++++----------- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/retail/snippets/src/test/java/com/example/search/SearchIT.java b/retail/snippets/src/test/java/com/example/search/SearchIT.java index 18b4be5e28b..4e1fc5b146e 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchIT.java @@ -51,7 +51,7 @@ public static void setUp() throws InterruptedException, IOException { // Create products to be searched productsToTest = Utils.createProductsToTest(NUM_PRODUCTS_TO_TEST, PROJECT_ID, PRODUCT_TITLE); - Utils.waitForProductsToBeIndexed(PROJECT_ID, productsToTest, PRODUCT_TITLE); + Utils.waitForProductsToBeReadyToTest(PROJECT_ID, productsToTest, PRODUCT_TITLE); origPrintStream = System.out; bout = new ByteArrayOutputStream(); diff --git a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java index e747042a3c3..f6a6fa5b222 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java @@ -52,7 +52,7 @@ public static void setUp() throws InterruptedException, IOException { // Create products to be searched productsToTest = Utils.createProductsToTest(NUM_PRODUCTS_TO_TEST, PROJECT_ID, PRODUCT_TITLE); - Utils.waitForProductsToBeIndexed(PROJECT_ID, productsToTest, PRODUCT_TITLE); + Utils.waitForProductsToBeReadyToTest(PROJECT_ID, productsToTest, PRODUCT_TITLE); origPrintStream = System.out; bout = new ByteArrayOutputStream(); diff --git a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java index 19bbd5b17ae..6d8ae9562f0 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java @@ -52,7 +52,7 @@ public static void setUp() throws InterruptedException, IOException { // Create products to be searched productsToTest = Utils.createProductsToTest(NUM_PRODUCTS_TO_TEST, PROJECT_ID, PRODUCT_TITLE); - Utils.waitForProductsToBeIndexed(PROJECT_ID, productsToTest, PRODUCT_TITLE); + Utils.waitForProductsToBeReadyToTest(PROJECT_ID, productsToTest, PRODUCT_TITLE); origPrintStream = System.out; bout = new ByteArrayOutputStream(); diff --git a/retail/snippets/src/test/java/com/example/search/Utils.java b/retail/snippets/src/test/java/com/example/search/Utils.java index d4519782ac5..3d53ae60a89 100644 --- a/retail/snippets/src/test/java/com/example/search/Utils.java +++ b/retail/snippets/src/test/java/com/example/search/Utils.java @@ -94,8 +94,9 @@ public static void deleteProducts(List products) throws IOException { } } - public static boolean areProductsReadyToTest(String projectId, String query, int amountOfProducts) - throws IOException { + public static void waitForProductsToBeReadyToTest( + String projectId, List products, String productTitle) + throws InterruptedException, IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { ServingConfigName servingConfigName = ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); @@ -106,22 +107,17 @@ public static boolean areProductsReadyToTest(String projectId, String query, int .setPlacement(servingConfigName.toString()) .setBranch(branchName.toString()) .setVisitorId("test_visitor") - .setQuery(query) - .setPageSize(amountOfProducts) + .setQuery(productTitle) + .setPageSize(products.size()) .build(); - SearchPagedResponse response = searchServiceClient.search(searchRequest); - return response.getPage().getResponse().getResultsCount() >= amountOfProducts; - } - } + for (int i = 0; i < 3; i++) { + Thread.sleep(10000); - public static void waitForProductsToBeIndexed( - String projectId, List products, String productTitle) - throws InterruptedException, IOException { - for (int i = 0; i < 3; i++) { - Thread.sleep(10000); - if (areProductsReadyToTest(projectId, productTitle, products.size())) { - break; + SearchPagedResponse response = searchServiceClient.search(searchRequest); + if (response.getPage().getResponse().getResultsCount() == products.size()) { + break; + } } } } From 838fdc1f4e24215377076c91bf5a8003e81ba0b3 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Fri, 24 Apr 2026 17:31:03 +0000 Subject: [PATCH 08/10] Fix lint issue --- retail/snippets/src/main/java/com/example/search/Search.java | 1 - .../snippets/src/main/java/com/example/search/SearchOffset.java | 1 - .../src/main/java/com/example/search/SearchPagination.java | 1 - 3 files changed, 3 deletions(-) diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java index 66559bb6be6..5d1d7e32a40 100644 --- a/retail/snippets/src/main/java/com/example/search/Search.java +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -49,7 +49,6 @@ public static void main(String[] args) throws IOException { * @param visitorId A unique identifier for the user. * @param query The search term for text search. * @param categories The categories for browse search. - * @throws IOException */ public static void search( String projectId, String visitorId, String query, List categories) diff --git a/retail/snippets/src/main/java/com/example/search/SearchOffset.java b/retail/snippets/src/main/java/com/example/search/SearchOffset.java index 4fb5e198c70..0eb918e0893 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchOffset.java +++ b/retail/snippets/src/main/java/com/example/search/SearchOffset.java @@ -47,7 +47,6 @@ public static void main(String[] args) throws IOException { * @param visitorId A unique identifier for the user. * @param query The search term for text search. * @param offset The number of results to skip. - * @throws IOException */ public static void searchWithOffset(String projectId, String visitorId, String query, int offset) throws IOException { diff --git a/retail/snippets/src/main/java/com/example/search/SearchPagination.java b/retail/snippets/src/main/java/com/example/search/SearchPagination.java index f18e3136a7f..acb0d749fe9 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchPagination.java +++ b/retail/snippets/src/main/java/com/example/search/SearchPagination.java @@ -47,7 +47,6 @@ public static void main(String[] args) throws IOException { * @param visitorId A unique identifier for the user. * @param query The search term for text search. * @param pageSize The amount of results per page. - * @throws IOException */ public static void searchWithPagination( String projectId, String visitorId, String query, int pageSize) throws IOException { From 5e98e89d82c49640c92838668c5de959f80e047b Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Fri, 24 Apr 2026 19:02:59 +0000 Subject: [PATCH 09/10] Use placementId variable --- .../src/main/java/com/example/search/Search.java | 12 +++++++----- .../main/java/com/example/search/SearchOffset.java | 12 +++++++----- .../java/com/example/search/SearchPagination.java | 12 +++++++----- .../src/test/java/com/example/search/SearchIT.java | 7 ++++--- .../test/java/com/example/search/SearchOffsetIT.java | 9 +++++---- .../java/com/example/search/SearchPaginationIT.java | 7 ++++--- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/retail/snippets/src/main/java/com/example/search/Search.java b/retail/snippets/src/main/java/com/example/search/Search.java index 5d1d7e32a40..42305cb1000 100644 --- a/retail/snippets/src/main/java/com/example/search/Search.java +++ b/retail/snippets/src/main/java/com/example/search/Search.java @@ -32,11 +32,12 @@ public class Search { public static void main(String[] args) throws IOException { String projectId = "my-project-id"; + String placementId = "default_search"; String visitorId = "my-visitor-id"; String query = "my search query"; List categories = List.of("category"); - search(projectId, visitorId, query, categories); + search(projectId, placementId, visitorId, query, categories); } /** @@ -46,21 +47,22 @@ public static void main(String[] args) throws IOException { * and browse search (using page_categories). * * @param projectId The Google Cloud project ID. + * @param placementId The placement name for the search. * @param visitorId A unique identifier for the user. * @param query The search term for text search. * @param categories The categories for browse search. */ public static void search( - String projectId, String visitorId, String query, List categories) + String projectId, String placementId, String visitorId, String query, List categories) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { - ServingConfigName servingConfigName = - ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + ServingConfigName placementName = + ServingConfigName.of(projectId, "global", "default_catalog", placementId); BranchName branchName = BranchName.of(projectId, "global", "default_catalog", "default_branch"); SearchRequest searchRequest = SearchRequest.newBuilder() - .setPlacement(servingConfigName.toString()) + .setPlacement(placementName.toString()) .setBranch(branchName.toString()) .setVisitorId(visitorId) .setQuery(query) diff --git a/retail/snippets/src/main/java/com/example/search/SearchOffset.java b/retail/snippets/src/main/java/com/example/search/SearchOffset.java index 0eb918e0893..e3e75040fb7 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchOffset.java +++ b/retail/snippets/src/main/java/com/example/search/SearchOffset.java @@ -31,11 +31,12 @@ public class SearchOffset { public static void main(String[] args) throws IOException { String projectId = "my-project-id"; + String placementId = "default_search"; String visitorId = "my-visitor-id"; String query = "my search query"; int offset = 10; - searchWithOffset(projectId, visitorId, query, offset); + searchWithOffset(projectId, placementId, visitorId, query, offset); } /** @@ -44,20 +45,21 @@ public static void main(String[] args) throws IOException { * Performs a search request starting from a specified position. * * @param projectId The Google Cloud project ID. + * @param placementId The placement name for the search. * @param visitorId A unique identifier for the user. * @param query The search term for text search. * @param offset The number of results to skip. */ - public static void searchWithOffset(String projectId, String visitorId, String query, int offset) + public static void searchWithOffset(String projectId, String placementId, String visitorId, String query, int offset) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { - ServingConfigName servingConfigName = - ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + ServingConfigName placementName = + ServingConfigName.of(projectId, "global", "default_catalog", placementId); BranchName branchName = BranchName.of(projectId, "global", "default_catalog", "default_branch"); SearchRequest searchRequest = SearchRequest.newBuilder() - .setPlacement(servingConfigName.toString()) + .setPlacement(placementName.toString()) .setBranch(branchName.toString()) .setVisitorId(visitorId) .setQuery(query) diff --git a/retail/snippets/src/main/java/com/example/search/SearchPagination.java b/retail/snippets/src/main/java/com/example/search/SearchPagination.java index acb0d749fe9..c1e5c30cb60 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchPagination.java +++ b/retail/snippets/src/main/java/com/example/search/SearchPagination.java @@ -31,11 +31,12 @@ public class SearchPagination { public static void main(String[] args) throws IOException { String projectId = "my-project-id"; + String placementId = "default_search"; String visitorId = "my-visitor-id"; String query = "my search query"; int pageSize = 10; - searchWithPagination(projectId, visitorId, query, pageSize); + searchWithPagination(projectId, placementId, visitorId, query, pageSize); } /** @@ -44,20 +45,21 @@ public static void main(String[] args) throws IOException { * Performs a search request, then uses the next_page_token to get the next page. * * @param projectId The Google Cloud project ID. + * @param placementId The placement name for the search. * @param visitorId A unique identifier for the user. * @param query The search term for text search. * @param pageSize The amount of results per page. */ public static void searchWithPagination( - String projectId, String visitorId, String query, int pageSize) throws IOException { + String projectId, String placementId, String visitorId, String query, int pageSize) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { - ServingConfigName servingConfigName = - ServingConfigName.of(projectId, "global", "default_catalog", "default_search"); + ServingConfigName placementName = + ServingConfigName.of(projectId, "global", "default_catalog", placementId); BranchName branchName = BranchName.of(projectId, "global", "default_catalog", "default_branch"); SearchRequest request = SearchRequest.newBuilder() - .setPlacement(servingConfigName.toString()) + .setPlacement(placementName.toString()) .setBranch(branchName.toString()) .setVisitorId(visitorId) .setQuery(query) diff --git a/retail/snippets/src/test/java/com/example/search/SearchIT.java b/retail/snippets/src/test/java/com/example/search/SearchIT.java index 4e1fc5b146e..5333b9ed34f 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchIT.java @@ -33,6 +33,7 @@ public class SearchIT { private static ByteArrayOutputStream bout; private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PLACEMENT_ID = "default_search"; private static final String VISITOR_ID = "test_visitor"; private static final int NUM_PRODUCTS_TO_TEST = 2; private static final String PRODUCT_TITLE = "Hot Java Testing"; @@ -68,7 +69,7 @@ public static void tearDown() throws IOException { @Test public void testSearch() throws Exception { - Search.search(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, CATEGORIES); + Search.search(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, CATEGORIES); String output = bout.toString(); assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); assertThat(output).contains("Product Name:"); @@ -76,14 +77,14 @@ public void testSearch() throws Exception { @Test public void testSearchWithoutQueryString() throws Exception { - Search.search(PROJECT_ID, VISITOR_ID, "", CATEGORIES); + Search.search(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, "", CATEGORIES); String output = bout.toString(); assertThat(output).contains("Product Name:"); } @Test public void testSearch_productsNotFound() throws Exception { - Search.search(PROJECT_ID, VISITOR_ID, "INVALID_QUERY_VALUE_FOR_TEST", CATEGORIES); + Search.search(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, "INVALID_QUERY_VALUE_FOR_TEST", CATEGORIES); String output = bout.toString(); assertThat(output).contains("Found " + 0 + " results in current page"); } diff --git a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java index f6a6fa5b222..a1da44d9130 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java @@ -35,6 +35,7 @@ public class SearchOffsetIT { private static ByteArrayOutputStream bout; private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PLACEMENT_ID = "default_search"; private static final String VISITOR_ID = "test_visitor"; private static final int NUM_PRODUCTS_TO_TEST = 2; private static final String PRODUCT_TITLE = "Hot Java Testing"; @@ -70,7 +71,7 @@ public static void tearDown() throws IOException { @Test public void testSearchWithOffset() throws Exception { int offset = 1; - SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); + SearchOffset.searchWithOffset(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, offset); String output = bout.toString(); assertThat(output) .contains("Found " + (NUM_PRODUCTS_TO_TEST - offset) + " results in current page"); @@ -80,7 +81,7 @@ public void testSearchWithOffset() throws Exception { @Test public void testSearchWithOffset_offsetEqualsZero() throws Exception { int offset = 0; - SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); + SearchOffset.searchWithOffset(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, offset); String output = bout.toString(); assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); assertThat(output).contains("Product Name:"); @@ -89,7 +90,7 @@ public void testSearchWithOffset_offsetEqualsZero() throws Exception { @Test public void testSearchWithOffset_offsetTooLarge_foundZeroResults() throws Exception { int offset = 5; - SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset); + SearchOffset.searchWithOffset(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, offset); String output = bout.toString(); assertThat(output).contains("Found 0 results in current page"); } @@ -100,6 +101,6 @@ public void testSearchWithOffset_negativeOffset_throwsInvalidArgumentException() int offset = -1; assertThrows( InvalidArgumentException.class, - () -> SearchOffset.searchWithOffset(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, offset)); + () -> SearchOffset.searchWithOffset(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, offset)); } } diff --git a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java index 6d8ae9562f0..aacca89a113 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java @@ -35,6 +35,7 @@ public class SearchPaginationIT { private static ByteArrayOutputStream bout; private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PLACEMENT_ID = "default_search"; private static final String VISITOR_ID = "test_visitor"; private static final int NUM_PRODUCTS_TO_TEST = 2; private static final String PRODUCT_TITLE = "Hot Java Testing"; @@ -69,7 +70,7 @@ public static void tearDown() throws IOException { @Test public void testSearchWithPaginationAndMultiplePages() throws Exception { - SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, 1); + SearchPagination.searchWithPagination(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, 1); String output = bout.toString(); assertThat(output).contains("Results of page number 1:"); assertThat(output).contains("Found 1 results in current page"); @@ -80,7 +81,7 @@ public void testSearchWithPaginationAndMultiplePages() throws Exception { @Test public void testSearchWithPaginationAndSinglePage() throws Exception { - SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, 10); + SearchPagination.searchWithPagination(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, 10); String output = bout.toString(); assertThat(output).contains("Results of page number 1:"); assertThat(output).contains("Found " + NUM_PRODUCTS_TO_TEST + " results in current page"); @@ -94,6 +95,6 @@ public void testSearchWithPagination_negativePageSize_throwsInvalidArgumentExcep assertThrows( InvalidArgumentException.class, () -> - SearchPagination.searchWithPagination(PROJECT_ID, VISITOR_ID, PRODUCT_TITLE, pageSize)); + SearchPagination.searchWithPagination(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, pageSize)); } } From 4111e6984e0a0acc0b144b38fa16d61b9a282d50 Mon Sep 17 00:00:00 2001 From: FRANCISCO JAVIER ALARCON ESPARZA Date: Fri, 24 Apr 2026 19:05:48 +0000 Subject: [PATCH 10/10] Fix lint issues --- .../src/main/java/com/example/search/SearchOffset.java | 3 ++- .../src/main/java/com/example/search/SearchPagination.java | 3 ++- .../src/test/java/com/example/search/SearchOffsetIT.java | 4 +++- .../src/test/java/com/example/search/SearchPaginationIT.java | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/retail/snippets/src/main/java/com/example/search/SearchOffset.java b/retail/snippets/src/main/java/com/example/search/SearchOffset.java index e3e75040fb7..df9cbff4ecb 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchOffset.java +++ b/retail/snippets/src/main/java/com/example/search/SearchOffset.java @@ -50,7 +50,8 @@ public static void main(String[] args) throws IOException { * @param query The search term for text search. * @param offset The number of results to skip. */ - public static void searchWithOffset(String projectId, String placementId, String visitorId, String query, int offset) + public static void searchWithOffset( + String projectId, String placementId, String visitorId, String query, int offset) throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { ServingConfigName placementName = diff --git a/retail/snippets/src/main/java/com/example/search/SearchPagination.java b/retail/snippets/src/main/java/com/example/search/SearchPagination.java index c1e5c30cb60..1ef5534bf2d 100644 --- a/retail/snippets/src/main/java/com/example/search/SearchPagination.java +++ b/retail/snippets/src/main/java/com/example/search/SearchPagination.java @@ -51,7 +51,8 @@ public static void main(String[] args) throws IOException { * @param pageSize The amount of results per page. */ public static void searchWithPagination( - String projectId, String placementId, String visitorId, String query, int pageSize) throws IOException { + String projectId, String placementId, String visitorId, String query, int pageSize) + throws IOException { try (SearchServiceClient searchServiceClient = SearchServiceClient.create()) { ServingConfigName placementName = ServingConfigName.of(projectId, "global", "default_catalog", placementId); diff --git a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java index a1da44d9130..3c5a5fb6484 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchOffsetIT.java @@ -101,6 +101,8 @@ public void testSearchWithOffset_negativeOffset_throwsInvalidArgumentException() int offset = -1; assertThrows( InvalidArgumentException.class, - () -> SearchOffset.searchWithOffset(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, offset)); + () -> + SearchOffset.searchWithOffset( + PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, offset)); } } diff --git a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java index aacca89a113..e1640bfdebb 100644 --- a/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java +++ b/retail/snippets/src/test/java/com/example/search/SearchPaginationIT.java @@ -95,6 +95,7 @@ public void testSearchWithPagination_negativePageSize_throwsInvalidArgumentExcep assertThrows( InvalidArgumentException.class, () -> - SearchPagination.searchWithPagination(PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, pageSize)); + SearchPagination.searchWithPagination( + PROJECT_ID, PLACEMENT_ID, VISITOR_ID, PRODUCT_TITLE, pageSize)); } }