From 0650c71a6b3db0a44ea4715b9fcf3fc181e681f8 Mon Sep 17 00:00:00 2001 From: Daniel La Rocque Date: Fri, 27 Feb 2026 11:46:15 -0500 Subject: [PATCH 1/5] feat: add `isType` expression Adds the `isType` expression, and the `Type` enum, which contains all the types that the Firestore backend can generate. Question: The `DocumentChange` class defines a `Type` enum that represents all snapshot diff types. Is it okay to have these two enum types in the SDK? --- .../pipeline/expressions/Expression.java | 13 ++++ .../firestore/pipeline/expressions/Type.java | 31 ++++++++ .../cloud/firestore/it/ITPipelineTest.java | 78 +++++++++++++++++++ .../example/firestore/PipelineSnippets.java | 14 ++++ 4 files changed, 136 insertions(+) create mode 100644 google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java index 363046c39..2d7537b24 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java @@ -3130,6 +3130,16 @@ public static Expression type(String fieldName) { return type(field(fieldName)); } + @BetaApi + public static BooleanExpression isType(Expression expr, Type type) { + return new BooleanFunctionExpression("is_type", ImmutableList.of(expr, constant(type.name().toLowerCase()))); + } + + @BetaApi + public static BooleanExpression isType(String fieldName, Type type) { + return new BooleanFunctionExpression("is_type", ImmutableList.of(field(fieldName), constant(type.name().toLowerCase()))); + } + // Numeric Operations /** * Creates an expression that rounds {@code numericExpr} to nearest integer. @@ -4796,4 +4806,7 @@ public final Expression collectionId() { public final Expression type() { return type(this); } + + @BetaApi + public final Expression isType(Type type) { return isType(this, type); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java new file mode 100644 index 000000000..9a5a69480 --- /dev/null +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java @@ -0,0 +1,31 @@ +package com.google.cloud.firestore.pipeline.expressions; + +import com.google.api.core.BetaApi; + +/** + * An enumeration of the different types generated by the Firestore backend. + */ +@BetaApi +public enum Type { + NULL, + ARRAY, + BOOLEAN, + BYTES, + TIMESTAMP, + GEO_POINT, + NUMBER, + INT32, + INT64, + FLOAT64, + DECIMAL128, + MAP, + REFERENCE, + STRING, + VECTOR, + MAX_KEY, + MIN_KEY, + OBJECT_ID, + REGEX, + REQUEST_TIMESTAMP, +} + diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java index 5f810332f..c5d512987 100644 --- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java +++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java @@ -90,6 +90,7 @@ import com.google.cloud.firestore.pipeline.expressions.AggregateFunction; import com.google.cloud.firestore.pipeline.expressions.Expression; import com.google.cloud.firestore.pipeline.expressions.Field; +import com.google.cloud.firestore.pipeline.expressions.Type; import com.google.cloud.firestore.pipeline.stages.Aggregate; import com.google.cloud.firestore.pipeline.stages.AggregateHints; import com.google.cloud.firestore.pipeline.stages.AggregateOptions; @@ -2633,6 +2634,83 @@ public void testType() throws Exception { "vector")); } + @Test + public void testIsType() throws Exception { + List results = + firestore + .pipeline() + .collection(collection.getPath()) + .replaceWith(Expression.map( + map( + "int", 1, + "float", 1.1, + "str", "a string", + "bool", true, + "null", null, + "geoPoint", new GeoPoint(0.1, 0.2), + "timestamp", Timestamp.ofTimeSecondsAndNanos(123456, 0), + "bytes", com.google.cloud.firestore.Blob.fromBytes(new byte[]{1, 2 ,3}), + "docRef", collection.document("bar"), + "vector", vector(new double[] {1.0, 2.0, 3.0}), + "map", Expression.map(map("numberK", 1, "stringK", "a string")), + "array", array(1, 2, true) + ) + )) + .select( + Expression.isType("int", Type.INT64).as("isInt64"), + Expression.isType("int", Type.NUMBER).as("isInt64IsNumber"), + Expression.isType("int", Type.DECIMAL128).as("isInt64IsDecimal128"), + Expression.isType("float", Type.FLOAT64).as("isFloat64"), + Expression.isType("float", Type.NUMBER).as("isFloat64IsNumber"), + Expression.isType("float", Type.DECIMAL128).as("isFloat64IsDecimal128"), + Expression.isType("str", Type.STRING).as("isStr"), + Expression.isType("str", Type.INT64).as("isStrNum"), + Expression.isType("int", Type.STRING).as("isNumStr"), + Expression.isType("bool", Type.BOOLEAN).as("isBool"), + Expression.isType("null", Type.NULL).as("isNull"), + Expression.isType("geoPoint", Type.GEO_POINT).as("isGeoPoint"), + Expression.isType("timestamp", Type.TIMESTAMP).as("isTimestamp"), + Expression.isType("bytes", Type.BYTES).as("isBytes"), + Expression.isType("docRef", Type.REFERENCE).as("isDocRef"), + Expression.isType("vector", Type.VECTOR).as("isVector"), + Expression.isType("map", Type.MAP).as("isMap"), + Expression.isType("array", Type.ARRAY).as("isArray"), + + Expression.isType(constant(1), Type.INT64).as("exprIsInt64"), + field("int").isType(Type.INT64).as("staticIsInt64") + ) + .limit(1) + .execute() + .get() + .getResults(); + assertThat(data(results)) + .containsExactly( + map( + "isInt64", true, + "isInt64IsNumber", true, + "isInt64IsDecimal128", false, + "isFloat64", true, + "isFloat64IsNumber", true, + "isFloat64IsDecimal128", false, + "isStr", true, + "isStrNum", false, + "isNumStr", false, + "isBool", true, + "isNull", true, + "isGeoPoint", true, + "isTimestamp", true, + "isBytes", true, + "isDocRef", true, + "isVector", true, + "isMap", true, + "isArray", true, + + "exprIsInt64", true, + "staticIsInt64", true + ) + ); + } + @Test public void testExplainWithError() { assumeFalse( 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 cf6efe72d..fa93a95f4 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 @@ -31,6 +31,7 @@ import com.google.cloud.firestore.PlanSummary; import com.google.cloud.firestore.Query; import com.google.cloud.firestore.QuerySnapshot; +import com.google.cloud.firestore.pipeline.expressions.Type; import com.google.cloud.firestore.pipeline.stages.Aggregate; import com.google.cloud.firestore.pipeline.stages.FindNearest; import com.google.cloud.firestore.pipeline.stages.FindNearestOptions; @@ -1551,6 +1552,19 @@ void vectorLengthFunction() throws ExecutionException, InterruptedException { System.out.println(result.getResults()); } + void isTypeFunction() throws ExecutionException, InterruptedException { + // [START vector_length] + Pipeline.Snapshot result = + firestore + .pipeline() + .collection("books") + .select(field("rating").isType(Type.INT64).as("isRatingInt64")) + .execute() + .get(); + // [END vector_length] + System.out.println(result.getResults()); + } + // https://cloud.google.com/firestore/docs/pipeline/getting-started/stages-expressions void stagesExpressionsExample() throws ExecutionException, InterruptedException { // [START stages_expressions_example] From 7ee7361ffa9bdf59d64658e7ae6e9659d4d05eba Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Fri, 27 Feb 2026 16:52:37 +0000 Subject: [PATCH 2/5] chore: generate libraries at Fri Feb 27 16:50:25 UTC 2026 --- .../pipeline/expressions/Expression.java | 10 +- .../firestore/pipeline/expressions/Type.java | 45 +++--- .../cloud/firestore/it/ITPipelineTest.java | 148 +++++++++--------- .../example/firestore/PipelineSnippets.java | 12 +- 4 files changed, 111 insertions(+), 104 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java index 2d7537b24..10a1d7789 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java @@ -3132,12 +3132,14 @@ public static Expression type(String fieldName) { @BetaApi public static BooleanExpression isType(Expression expr, Type type) { - return new BooleanFunctionExpression("is_type", ImmutableList.of(expr, constant(type.name().toLowerCase()))); + return new BooleanFunctionExpression( + "is_type", ImmutableList.of(expr, constant(type.name().toLowerCase()))); } @BetaApi public static BooleanExpression isType(String fieldName, Type type) { - return new BooleanFunctionExpression("is_type", ImmutableList.of(field(fieldName), constant(type.name().toLowerCase()))); + return new BooleanFunctionExpression( + "is_type", ImmutableList.of(field(fieldName), constant(type.name().toLowerCase()))); } // Numeric Operations @@ -4808,5 +4810,7 @@ public final Expression type() { } @BetaApi - public final Expression isType(Type type) { return isType(this, type); } + public final Expression isType(Type type) { + return isType(this, type); + } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java index 9a5a69480..509aa8c75 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java @@ -2,30 +2,27 @@ import com.google.api.core.BetaApi; -/** - * An enumeration of the different types generated by the Firestore backend. - */ +/** An enumeration of the different types generated by the Firestore backend. */ @BetaApi public enum Type { - NULL, - ARRAY, - BOOLEAN, - BYTES, - TIMESTAMP, - GEO_POINT, - NUMBER, - INT32, - INT64, - FLOAT64, - DECIMAL128, - MAP, - REFERENCE, - STRING, - VECTOR, - MAX_KEY, - MIN_KEY, - OBJECT_ID, - REGEX, - REQUEST_TIMESTAMP, + NULL, + ARRAY, + BOOLEAN, + BYTES, + TIMESTAMP, + GEO_POINT, + NUMBER, + INT32, + INT64, + FLOAT64, + DECIMAL128, + MAP, + REFERENCE, + STRING, + VECTOR, + MAX_KEY, + MIN_KEY, + OBJECT_ID, + REGEX, + REQUEST_TIMESTAMP, } - diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java index c5d512987..34e624575 100644 --- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java +++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITPipelineTest.java @@ -2637,78 +2637,84 @@ public void testType() throws Exception { @Test public void testIsType() throws Exception { List results = - firestore - .pipeline() - .collection(collection.getPath()) - .replaceWith(Expression.map( - map( - "int", 1, - "float", 1.1, - "str", "a string", - "bool", true, - "null", null, - "geoPoint", new GeoPoint(0.1, 0.2), - "timestamp", Timestamp.ofTimeSecondsAndNanos(123456, 0), - "bytes", com.google.cloud.firestore.Blob.fromBytes(new byte[]{1, 2 ,3}), - "docRef", collection.document("bar"), - "vector", vector(new double[] {1.0, 2.0, 3.0}), - "map", Expression.map(map("numberK", 1, "stringK", "a string")), - "array", array(1, 2, true) - ) - )) - .select( - Expression.isType("int", Type.INT64).as("isInt64"), - Expression.isType("int", Type.NUMBER).as("isInt64IsNumber"), - Expression.isType("int", Type.DECIMAL128).as("isInt64IsDecimal128"), - Expression.isType("float", Type.FLOAT64).as("isFloat64"), - Expression.isType("float", Type.NUMBER).as("isFloat64IsNumber"), - Expression.isType("float", Type.DECIMAL128).as("isFloat64IsDecimal128"), - Expression.isType("str", Type.STRING).as("isStr"), - Expression.isType("str", Type.INT64).as("isStrNum"), - Expression.isType("int", Type.STRING).as("isNumStr"), - Expression.isType("bool", Type.BOOLEAN).as("isBool"), - Expression.isType("null", Type.NULL).as("isNull"), - Expression.isType("geoPoint", Type.GEO_POINT).as("isGeoPoint"), - Expression.isType("timestamp", Type.TIMESTAMP).as("isTimestamp"), - Expression.isType("bytes", Type.BYTES).as("isBytes"), - Expression.isType("docRef", Type.REFERENCE).as("isDocRef"), - Expression.isType("vector", Type.VECTOR).as("isVector"), - Expression.isType("map", Type.MAP).as("isMap"), - Expression.isType("array", Type.ARRAY).as("isArray"), - - Expression.isType(constant(1), Type.INT64).as("exprIsInt64"), - field("int").isType(Type.INT64).as("staticIsInt64") - ) - .limit(1) - .execute() - .get() - .getResults(); - assertThat(data(results)) - .containsExactly( + firestore + .pipeline() + .collection(collection.getPath()) + .replaceWith( + Expression.map( map( - "isInt64", true, - "isInt64IsNumber", true, - "isInt64IsDecimal128", false, - "isFloat64", true, - "isFloat64IsNumber", true, - "isFloat64IsDecimal128", false, - "isStr", true, - "isStrNum", false, - "isNumStr", false, - "isBool", true, - "isNull", true, - "isGeoPoint", true, - "isTimestamp", true, - "isBytes", true, - "isDocRef", true, - "isVector", true, - "isMap", true, - "isArray", true, - - "exprIsInt64", true, - "staticIsInt64", true - ) - ); + "int", + 1, + "float", + 1.1, + "str", + "a string", + "bool", + true, + "null", + null, + "geoPoint", + new GeoPoint(0.1, 0.2), + "timestamp", + Timestamp.ofTimeSecondsAndNanos(123456, 0), + "bytes", + com.google.cloud.firestore.Blob.fromBytes(new byte[] {1, 2, 3}), + "docRef", + collection.document("bar"), + "vector", + vector(new double[] {1.0, 2.0, 3.0}), + "map", + Expression.map(map("numberK", 1, "stringK", "a string")), + "array", + array(1, 2, true)))) + .select( + Expression.isType("int", Type.INT64).as("isInt64"), + Expression.isType("int", Type.NUMBER).as("isInt64IsNumber"), + Expression.isType("int", Type.DECIMAL128).as("isInt64IsDecimal128"), + Expression.isType("float", Type.FLOAT64).as("isFloat64"), + Expression.isType("float", Type.NUMBER).as("isFloat64IsNumber"), + Expression.isType("float", Type.DECIMAL128).as("isFloat64IsDecimal128"), + Expression.isType("str", Type.STRING).as("isStr"), + Expression.isType("str", Type.INT64).as("isStrNum"), + Expression.isType("int", Type.STRING).as("isNumStr"), + Expression.isType("bool", Type.BOOLEAN).as("isBool"), + Expression.isType("null", Type.NULL).as("isNull"), + Expression.isType("geoPoint", Type.GEO_POINT).as("isGeoPoint"), + Expression.isType("timestamp", Type.TIMESTAMP).as("isTimestamp"), + Expression.isType("bytes", Type.BYTES).as("isBytes"), + Expression.isType("docRef", Type.REFERENCE).as("isDocRef"), + Expression.isType("vector", Type.VECTOR).as("isVector"), + Expression.isType("map", Type.MAP).as("isMap"), + Expression.isType("array", Type.ARRAY).as("isArray"), + Expression.isType(constant(1), Type.INT64).as("exprIsInt64"), + field("int").isType(Type.INT64).as("staticIsInt64")) + .limit(1) + .execute() + .get() + .getResults(); + assertThat(data(results)) + .containsExactly( + map( + "isInt64", true, + "isInt64IsNumber", true, + "isInt64IsDecimal128", false, + "isFloat64", true, + "isFloat64IsNumber", true, + "isFloat64IsDecimal128", false, + "isStr", true, + "isStrNum", false, + "isNumStr", false, + "isBool", true, + "isNull", true, + "isGeoPoint", true, + "isTimestamp", true, + "isBytes", true, + "isDocRef", true, + "isVector", true, + "isMap", true, + "isArray", true, + "exprIsInt64", true, + "staticIsInt64", true)); } @Test 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 fa93a95f4..675ae3d0f 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 @@ -1555,12 +1555,12 @@ void vectorLengthFunction() throws ExecutionException, InterruptedException { void isTypeFunction() throws ExecutionException, InterruptedException { // [START vector_length] Pipeline.Snapshot result = - firestore - .pipeline() - .collection("books") - .select(field("rating").isType(Type.INT64).as("isRatingInt64")) - .execute() - .get(); + firestore + .pipeline() + .collection("books") + .select(field("rating").isType(Type.INT64).as("isRatingInt64")) + .execute() + .get(); // [END vector_length] System.out.println(result.getResults()); } From 936adf811cb3a746b069b0724399e714b0839d36 Mon Sep 17 00:00:00 2001 From: Daniel La Rocque Date: Fri, 27 Feb 2026 11:56:49 -0500 Subject: [PATCH 3/5] add docs and fix snippet name --- .../pipeline/expressions/Expression.java | 20 +++++++++++++++++++ .../example/firestore/PipelineSnippets.java | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java index 10a1d7789..571e92259 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java @@ -3130,12 +3130,26 @@ public static Expression type(String fieldName) { return type(field(fieldName)); } + /** + * Creates an expression that checks if the result of this expression is of the given type. + * + * @param expr The expression to check the type of. + * @param type The type to check for. + * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of the given type, false otherwise. + */ @BetaApi public static BooleanExpression isType(Expression expr, Type type) { return new BooleanFunctionExpression( "is_type", ImmutableList.of(expr, constant(type.name().toLowerCase()))); } + /** + * Creates an expression that checks if the result of this expression is of the given type. + * + * @param fieldName The name of the field to check the type of. + * @param type The type to check for. + * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of the given type, false otherwise. + */ @BetaApi public static BooleanExpression isType(String fieldName, Type type) { return new BooleanFunctionExpression( @@ -4809,6 +4823,12 @@ public final Expression type() { return type(this); } + /** + * Creates an expression that checks if the result of this expression is of the given type. + * + * @param type The type to check for. + * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of the given type, false otherwise. + */ @BetaApi public final Expression isType(Type type) { return isType(this, type); 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 675ae3d0f..f61628339 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 @@ -1553,7 +1553,7 @@ void vectorLengthFunction() throws ExecutionException, InterruptedException { } void isTypeFunction() throws ExecutionException, InterruptedException { - // [START vector_length] + // [START is_type] Pipeline.Snapshot result = firestore .pipeline() @@ -1561,7 +1561,7 @@ void isTypeFunction() throws ExecutionException, InterruptedException { .select(field("rating").isType(Type.INT64).as("isRatingInt64")) .execute() .get(); - // [END vector_length] + // [END is_type] System.out.println(result.getResults()); } From 807ff8790c84e4d3898f08370c04445a8bbccd09 Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Fri, 27 Feb 2026 16:59:57 +0000 Subject: [PATCH 4/5] chore: generate libraries at Fri Feb 27 16:57:38 UTC 2026 --- .../cloud/firestore/pipeline/expressions/Expression.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java index 571e92259..46ee0cb20 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Expression.java @@ -3135,7 +3135,8 @@ public static Expression type(String fieldName) { * * @param expr The expression to check the type of. * @param type The type to check for. - * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of the given type, false otherwise. + * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of + * the given type, false otherwise. */ @BetaApi public static BooleanExpression isType(Expression expr, Type type) { @@ -3148,7 +3149,8 @@ public static BooleanExpression isType(Expression expr, Type type) { * * @param fieldName The name of the field to check the type of. * @param type The type to check for. - * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of the given type, false otherwise. + * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of + * the given type, false otherwise. */ @BetaApi public static BooleanExpression isType(String fieldName, Type type) { @@ -4827,7 +4829,8 @@ public final Expression type() { * Creates an expression that checks if the result of this expression is of the given type. * * @param type The type to check for. - * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of the given type, false otherwise. + * @return A new {@link BooleanExpression} that evaluates to true if the expression's result is of + * the given type, false otherwise. */ @BetaApi public final Expression isType(Type type) { From 48665f2d2079e0d9e578ca89695a70172347de75 Mon Sep 17 00:00:00 2001 From: Daniel La Rocque Date: Fri, 27 Feb 2026 13:09:23 -0500 Subject: [PATCH 5/5] add copyright header --- .../firestore/pipeline/expressions/Type.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java index 509aa8c75..0812b7475 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/pipeline/expressions/Type.java @@ -1,3 +1,19 @@ +/* + * 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.google.cloud.firestore.pipeline.expressions; import com.google.api.core.BetaApi;