diff --git a/samples/preview-snippets/pom.xml b/samples/preview-snippets/pom.xml index fa7e330ab3..5fc72205dc 100644 --- a/samples/preview-snippets/pom.xml +++ b/samples/preview-snippets/pom.xml @@ -33,7 +33,7 @@ com.google.cloud google-cloud-firestore-bom - 3.33.4 + 3.40.0 pom import @@ -45,7 +45,7 @@ com.google.firebase firebase-admin - 9.7.0 + 9.8.0 diff --git a/samples/preview-snippets/src/main/java/com/example/firestore/PipelineSnippets.java b/samples/preview-snippets/src/main/java/com/example/firestore/PipelineSnippets.java index 6e43745bc5..28d86ae5cd 100644 --- a/samples/preview-snippets/src/main/java/com/example/firestore/PipelineSnippets.java +++ b/samples/preview-snippets/src/main/java/com/example/firestore/PipelineSnippets.java @@ -32,12 +32,16 @@ import com.google.cloud.firestore.Query; import com.google.cloud.firestore.QuerySnapshot; import com.google.cloud.firestore.pipeline.stages.Aggregate; +import com.google.cloud.firestore.pipeline.stages.CollectionGroupOptions; +import com.google.cloud.firestore.pipeline.stages.CollectionHints; import com.google.cloud.firestore.pipeline.stages.FindNearest; import com.google.cloud.firestore.pipeline.stages.FindNearestOptions; import com.google.cloud.firestore.pipeline.stages.Sample; +import com.google.cloud.firestore.pipeline.stages.Search; import com.google.cloud.firestore.pipeline.stages.UnnestOptions; import java.util.Arrays; import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ExecutionException; class PipelineSnippets { @@ -3115,4 +3119,274 @@ void distinctExpressionsExample() throws ExecutionException, InterruptedExceptio // [END distinct_expressions] System.out.println(cities.getResults()); } + + void searchBasicQuery() { + // [START search_basic_query] + firestore.collection("restaurants").add(new HashMap() {{ + put("name", "Waffle Place"); + put("description", "A cozy place for fresh waffles."); + }}); + // [END search_basic_query] + } + + void searchExactMatch() { + // [START search_exact_match] + firestore.collection("restaurants").add(new HashMap() {{ + put("name", "Waffle Place"); + put("description", "A cozy place for fresh waffles."); + }}); + // [END search_exact_match] + } + + void searchTwoTerms() { + // [START search_two_terms] + firestore.collection("restaurants").add(new HashMap() {{ + put("name", "Morning Diner"); + put("description", "Start your day with waffles and eggs."); + }}); + // [END search_two_terms] + } + + void searchExcludeTerm() { + // [START search_exclude_term] + firestore.collection("restaurants").add(new HashMap() {{ + put("name", "City Coffee"); + put("description", "Premium coffee and pastries."); + }}); + // [END search_exclude_term] + } + + void searchScore() { + // [START search_score] + firestore.collection("restaurants").add(new HashMap() {{ + put("name", "The Waffle Hub"); + put("description", "Everything waffles!"); + }}); + // [END search_score] + } + + void searchExamples() throws ExecutionException, InterruptedException { + // [START search_basic] + Pipeline.Snapshot results1 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(documentMatches("waffles"))) + .execute().get(); + // [END search_basic] + System.out.println(results1.getResults()); + + // [START search_exact] + Pipeline.Snapshot results2 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(documentMatches("\"belgian waffles\""))) + .execute().get(); + // [END search_exact] + System.out.println(results2.getResults()); + + // [START search_two_terms] + Pipeline.Snapshot results3 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(documentMatches("waffles eggs"))) + .execute().get(); + // [END search_two_terms] + System.out.println(results3.getResults()); + + // [START search_exclude_term] + Pipeline.Snapshot results4 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(documentMatches("-waffles"))) + .execute().get(); + // [END search_exclude_term] + System.out.println(results4.getResults()); + + // [START search_special_fields] + Pipeline.Snapshot results5 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(field("menu").regexMatch("waffles")) + .withAddFields(score().as("score"))) + .execute().get(); + // [END search_special_fields] + System.out.println(results5.getResults()); + + // [START search_score_sort] + Pipeline.Snapshot results6 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(documentMatches("waffles")) + .withSort(score().descending())) + .execute().get(); + // [END search_score_sort] + System.out.println(results6.getResults()); + + // [START search_geospatial] + Pipeline.Snapshot results7 = + firestore.pipeline().collection("restaurants") + .search(Search.withQuery(documentMatches("\"belgian waffles\""))) + .execute().get(); + // [END search_geospatial] + System.out.println(results7.getResults()); + } + + void defineStage() { + // [START define_stage] + firestore.collection("authors").document("author_123").set(new HashMap() {{ + put("id", "author_123"); + put("name", "Jane Austen"); + }}); + // [END define_stage] + } + + void toArrayExpressionStage() { + // [START to_array_expression_stage] + firestore.collection("projects").document("project_1").set(new HashMap() {{ + put("id", "project_1"); + put("name", "Alpha Build"); + }}); + firestore.collection("tasks").add(new HashMap() {{ + put("project_id", "project_1"); + put("title", "System Architecture"); + }}); + firestore.collection("tasks").add(new HashMap() {{ + put("project_id", "project_1"); + put("title", "Database Schema Design"); + }}); + // [END to_array_expression_stage] + } + + void toScalarExpressionStage() { + // [START to_scalar_expression_stage] + firestore.collection("authors").document("author_202").set(new HashMap() {{ + put("id", "author_202"); + put("name", "Charles Dickens"); + }}); + firestore.collection("books").add(new HashMap() {{ + put("author_id", "author_202"); + put("title", "Great Expectations"); + put("rating", 4.8); + }}); + firestore.collection("books").add(new HashMap() {{ + put("author_id", "author_202"); + put("title", "Oliver Twist"); + put("rating", 4.5); + }}); + // [END to_scalar_expression_stage] + } + + void subqueryExamples() throws ExecutionException, InterruptedException { + // [START define_example] + Pipeline.Snapshot results = firestore.pipeline().collection("authors") + .define( + field("id").as("currentAuthorId") + ) + // [END define_example] + .addFields( + firestore.pipeline().collection("books") + .where(field("author_id").equal(variable("currentAuthorId"))) + .aggregate(average("rating").as("avgRating")) + .toScalarExpression() + .as("averageBookRating") + ) + .execute().get(); + System.out.println(results.getResults()); + + // [START to_array_expression] + Pipeline.Snapshot arrayResults = firestore.pipeline().collection("projects") + .define( + field("id").as("parentId") + ) + .addFields( + firestore.pipeline().collection("tasks") + .where(field("project_id").equal(variable("parentId"))) + .select(field("title")) + .toArrayExpression() + .as("taskTitles") + ) + .execute().get(); + // [END to_array_expression] + System.out.println(arrayResults.getResults()); + + // [START to_scalar_expression] + Pipeline.Snapshot scalarResults = firestore.pipeline().collection("authors") + .define( + field("id").as("currentAuthorId") + ) + .addFields( + firestore.pipeline().collection("books") + .where(field("author_id").equal(variable("currentAuthorId"))) + .aggregate(average("rating").as("avgRating")) + .toScalarExpression() + .as("averageBookRating") + ) + .execute().get(); + // [END to_scalar_expression] + System.out.println(scalarResults.getResults()); + } + + void forceIndexExamples() throws ExecutionException, InterruptedException { + // [START force_index] + // Force Planner to use Index ID CICAgOi36pgK + Pipeline.Snapshot results1 = + firestore.pipeline() + .collectionGroup("customers", new CollectionGroupOptions() + .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK"))) + .limit(100) + .execute().get(); + // [END force_index] + System.out.println(results1.getResults()); + + // [START force_scan] + // Force Planner to only do a collection scan + Pipeline.Snapshot results2 = + firestore.pipeline() + .collectionGroup("customers", new CollectionGroupOptions() + .withHints(new CollectionHints().withForceIndex("primary"))) + .limit(100) + .execute().get(); + // [END force_scan] + System.out.println(results2.getResults()); + } + + void updateDmlExample() { + // [START update_dml_example] + firestore.collection("users").document("userID").set(new HashMap() {{ + put("id", "userID"); + put("preferences", new HashMap()); + put("color", "#FFFFFF"); + }}); + // [END update_dml_example] + } + + void deleteDmlExample() { + // [START delete_dml_example] + firestore.collection("users").document("userID").set(new HashMap() {{ + put("id", "userID"); + put("address", new HashMap() {{ + put("country", "USA"); + put("state", "CA"); + }}); + put("__create_time__", com.google.cloud.Timestamp.ofTimeSecondsAndNanos(946684800, 0)); + }}); + // [END delete_dml_example] + } + + void dmlExamples() throws ExecutionException, InterruptedException { + // [START pipeline_update] + Pipeline.Snapshot snapshot = firestore.pipeline() + .collectionGroup("users") + .where(not(exists(field("preferences.color")))) + .addFields(constant((String) null).as("preferences.color")) + .removeFields("color") + .update() + .execute().get(); + // [END pipeline_update] + System.out.println(snapshot.getResults()); + + // [START pipeline_delete] + Pipeline.Snapshot deleteResults = firestore.pipeline() + .collectionGroup("users") + .where(field("address.country").equal("USA")) + .where(field("__create_time__").add(constant(10)).lessThan(currentTimestamp())) + .delete() + .execute().get(); + // [END pipeline_delete] + System.out.println(deleteResults.getResults()); + } }