From 978c053b0801da5f708d0016cae3358d33f1b2bd Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 13 Jan 2025 23:01:44 +0100 Subject: [PATCH 01/10] deps: update dependency com.google.cloud:google-cloud-trace to v2.56.0 (#1976) --- google-cloud-firestore/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-firestore/pom.xml b/google-cloud-firestore/pom.xml index a09c11649..383397a75 100644 --- a/google-cloud-firestore/pom.xml +++ b/google-cloud-firestore/pom.xml @@ -234,7 +234,7 @@ com.google.cloud google-cloud-trace - 2.55.0 + 2.56.0 test From 2b3de13db866badf1b405b3b2383cc85076460eb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 13 Jan 2025 23:05:37 +0100 Subject: [PATCH 02/10] deps: update opentelemetry.version to v1.46.0 (#1977) --- google-cloud-firestore/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-firestore/pom.xml b/google-cloud-firestore/pom.xml index 383397a75..00387485a 100644 --- a/google-cloud-firestore/pom.xml +++ b/google-cloud-firestore/pom.xml @@ -16,7 +16,7 @@ google-cloud-firestore - 1.45.0 + 1.46.0 From 73882910443407c529e4d6763ebe78fd1c0411b1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 13 Jan 2025 23:06:14 +0100 Subject: [PATCH 03/10] deps: update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.56.0 (#1975) --- google-cloud-firestore/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-firestore/pom.xml b/google-cloud-firestore/pom.xml index 00387485a..ccc13e7bd 100644 --- a/google-cloud-firestore/pom.xml +++ b/google-cloud-firestore/pom.xml @@ -228,7 +228,7 @@ com.google.api.grpc proto-google-cloud-trace-v1 - 2.55.0 + 2.56.0 test From 8cb4dc8859b1d8331657704f36baba472ea3115c Mon Sep 17 00:00:00 2001 From: Mila <107142260+milaGGL@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:20:56 -0500 Subject: [PATCH 04/10] Fix: comparing double with long (#1960) --- .../com/google/cloud/firestore/Order.java | 49 +++++-- .../com/google/cloud/firestore/OrderTest.java | 126 +++++++++--------- .../cloud/firestore/it/ITQueryTest.java | 42 ++++++ 3 files changed, 145 insertions(+), 72 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java index 65a92a1be..28434920a 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java @@ -250,31 +250,60 @@ private int compareVectors(Value left, Value right) { } private int compareNumbers(Value left, Value right) { + // NaN is smaller than any other numbers + if (isNaN(left)) { + return isNaN(right) ? 0 : -1; + } else if (isNaN(right)) { + return 1; + } + if (left.getValueTypeCase() == ValueTypeCase.DOUBLE_VALUE) { if (right.getValueTypeCase() == ValueTypeCase.DOUBLE_VALUE) { return compareDoubles(left.getDoubleValue(), right.getDoubleValue()); } else { - return compareDoubles(left.getDoubleValue(), right.getIntegerValue()); + return compareDoubleAndLong(left.getDoubleValue(), right.getIntegerValue()); } } else { if (right.getValueTypeCase() == ValueTypeCase.INTEGER_VALUE) { return Long.compare(left.getIntegerValue(), right.getIntegerValue()); } else { - return compareDoubles(left.getIntegerValue(), right.getDoubleValue()); + return -compareDoubleAndLong(right.getDoubleValue(), left.getIntegerValue()); } } } + private boolean isNaN(Value value) { + return value.hasDoubleValue() && Double.isNaN(value.getDoubleValue()); + } + private int compareDoubles(double left, double right) { - // Firestore orders NaNs before all other numbers and treats -0.0, 0.0 and +0.0 as equal. - if (Double.isNaN(left)) { - return Double.isNaN(right) ? 0 : -1; - } + // Firestore treats -0.0, 0.0 and +0.0 as equal. + return Double.compare(left == -0.0 ? 0 : left, right == -0.0 ? 0 : right); + } - if (Double.isNaN(right)) { - return 1; - } + /** + * The maximum integer absolute number that can be represented as a double without loss of + * precision. This is 2^53 because double-precision floating point numbers have 53 bits + * significand precision (52 explicit bit + 1 hidden bit). + */ + private static final long MAX_INTEGER_TO_DOUBLE_PRECISION = 1L << 53; - return Double.compare(left == -0.0 ? 0 : left, right == -0.0 ? 0 : right); + private int compareDoubleAndLong(double doubleValue, long longValue) { + if (Math.abs(longValue) <= MAX_INTEGER_TO_DOUBLE_PRECISION) { + // Enough precision to compare as double, the cast will not be lossy. + return compareDoubles(doubleValue, (double) longValue); + } else if (doubleValue < ((double) Long.MAX_VALUE) + && doubleValue >= ((double) Long.MIN_VALUE)) { + // The above condition captures all doubles that belong to [min long, max long] inclusive. + // Java long to double conversion rounds-to-nearest, so Long.MAX_VALUE casts to 2^63, hence + // the use of "<" operator. + // The cast to long below may be lossy, but only for absolute values < 2^52 so the loss of + // precision does not affect the comparison, as longValue is outside that range. + return Long.compare((long) doubleValue, longValue); + } else { + // doubleValue is outside the representable range for longs, so always smaller if negative, + // and always greater otherwise. + return doubleValue < 0 ? -1 : 1; + } } } diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OrderTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OrderTest.java index 7a43f331a..c4993b444 100644 --- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OrderTest.java +++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OrderTest.java @@ -32,7 +32,7 @@ public class OrderTest { @Test public void verifyOrder() { - Value[][] groups = new Value[65][]; + Value[][] groups = new Value[67][]; groups[0] = new Value[] {nullValue()}; @@ -42,83 +42,85 @@ public void verifyOrder() { // numbers groups[3] = new Value[] {doubleValue(Double.NaN), doubleValue(Double.NaN)}; groups[4] = new Value[] {doubleValue(Double.NEGATIVE_INFINITY)}; - groups[5] = new Value[] {intValue((long) Integer.MIN_VALUE - 1)}; - groups[6] = new Value[] {intValue(Integer.MIN_VALUE)}; - groups[7] = new Value[] {doubleValue(-1.1)}; + groups[5] = new Value[] {doubleValue((double) Long.MIN_VALUE - 100)}; + groups[6] = new Value[] {intValue((long) Integer.MIN_VALUE - 1)}; + groups[7] = new Value[] {intValue(Integer.MIN_VALUE)}; + groups[8] = new Value[] {doubleValue(-1.1)}; // Integers and Doubles order the same. - groups[8] = new Value[] {intValue(-1), doubleValue(-1.0)}; - groups[9] = new Value[] {doubleValue(-Double.MIN_VALUE)}; + groups[9] = new Value[] {intValue(-1), doubleValue(-1.0)}; + groups[10] = new Value[] {doubleValue(-Double.MIN_VALUE)}; // zeros all compare the same. - groups[10] = new Value[] {intValue(0), doubleValue(-0.0), doubleValue(0.0), doubleValue(+0.0)}; - groups[11] = new Value[] {doubleValue(Double.MIN_VALUE)}; - groups[12] = new Value[] {intValue(1), doubleValue(1.0)}; - groups[13] = new Value[] {doubleValue(1.1)}; - groups[14] = new Value[] {intValue(Integer.MAX_VALUE)}; - groups[15] = new Value[] {intValue((long) Integer.MAX_VALUE + 1)}; - groups[16] = new Value[] {doubleValue(Double.POSITIVE_INFINITY)}; - - groups[17] = new Value[] {timestampValue(123, 0)}; - groups[18] = new Value[] {timestampValue(123, 123)}; - groups[19] = new Value[] {timestampValue(345, 0)}; + groups[11] = new Value[] {intValue(0), doubleValue(-0.0), doubleValue(0.0), doubleValue(+0.0)}; + groups[12] = new Value[] {doubleValue(Double.MIN_VALUE)}; + groups[13] = new Value[] {intValue(1), doubleValue(1.0)}; + groups[14] = new Value[] {doubleValue(1.1)}; + groups[15] = new Value[] {intValue(Integer.MAX_VALUE)}; + groups[16] = new Value[] {intValue((long) Integer.MAX_VALUE + 1)}; + groups[17] = new Value[] {doubleValue(((double) Long.MAX_VALUE) + 100)}; + groups[18] = new Value[] {doubleValue(Double.POSITIVE_INFINITY)}; + + groups[19] = new Value[] {timestampValue(123, 0)}; + groups[20] = new Value[] {timestampValue(123, 123)}; + groups[21] = new Value[] {timestampValue(345, 0)}; // strings - groups[20] = new Value[] {stringValue("")}; - groups[21] = new Value[] {stringValue("\u0000\ud7ff\ue000\uffff")}; - groups[22] = new Value[] {stringValue("(╯°□°)╯︵ ┻━┻")}; - groups[23] = new Value[] {stringValue("a")}; - groups[24] = new Value[] {stringValue("abc def")}; + groups[22] = new Value[] {stringValue("")}; + groups[23] = new Value[] {stringValue("\u0000\ud7ff\ue000\uffff")}; + groups[24] = new Value[] {stringValue("(╯°□°)╯︵ ┻━┻")}; + groups[25] = new Value[] {stringValue("a")}; + groups[26] = new Value[] {stringValue("abc def")}; // latin small letter e + combining acute accent + latin small letter b - groups[25] = new Value[] {stringValue("e\u0301b")}; - groups[26] = new Value[] {stringValue("æ")}; + groups[27] = new Value[] {stringValue("e\u0301b")}; + groups[28] = new Value[] {stringValue("æ")}; // latin small letter e with acute accent + latin small letter a - groups[27] = new Value[] {stringValue("\u00e9a")}; + groups[29] = new Value[] {stringValue("\u00e9a")}; // blobs - groups[28] = new Value[] {blobValue(new byte[] {})}; - groups[29] = new Value[] {blobValue(new byte[] {0})}; - groups[30] = new Value[] {blobValue(new byte[] {0, 1, 2, 3, 4})}; - groups[31] = new Value[] {blobValue(new byte[] {0, 1, 2, 4, 3})}; - groups[32] = new Value[] {blobValue(new byte[] {127})}; + groups[30] = new Value[] {blobValue(new byte[] {})}; + groups[31] = new Value[] {blobValue(new byte[] {0})}; + groups[32] = new Value[] {blobValue(new byte[] {0, 1, 2, 3, 4})}; + groups[33] = new Value[] {blobValue(new byte[] {0, 1, 2, 4, 3})}; + groups[34] = new Value[] {blobValue(new byte[] {127})}; // resource names - groups[33] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc1")}; - groups[34] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc2")}; - groups[35] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc2/c2/doc1")}; - groups[36] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc2/c2/doc2")}; - groups[37] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c10/doc1")}; - groups[38] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c2/doc1")}; - groups[39] = new Value[] {referenceValue("projects/p2/databases/d2/documents/c1/doc1")}; - groups[40] = new Value[] {referenceValue("projects/p2/databases/d2/documents/c1-/doc1")}; - groups[41] = new Value[] {referenceValue("projects/p2/databases/d3/documents/c1-/doc1")}; + groups[35] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc1")}; + groups[36] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc2")}; + groups[37] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc2/c2/doc1")}; + groups[38] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c1/doc2/c2/doc2")}; + groups[39] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c10/doc1")}; + groups[40] = new Value[] {referenceValue("projects/p1/databases/d1/documents/c2/doc1")}; + groups[41] = new Value[] {referenceValue("projects/p2/databases/d2/documents/c1/doc1")}; + groups[42] = new Value[] {referenceValue("projects/p2/databases/d2/documents/c1-/doc1")}; + groups[43] = new Value[] {referenceValue("projects/p2/databases/d3/documents/c1-/doc1")}; // geo points - groups[42] = new Value[] {geoPointValue(-90, -180)}; - groups[43] = new Value[] {geoPointValue(-90, 0)}; - groups[44] = new Value[] {geoPointValue(-90, 180)}; - groups[45] = new Value[] {geoPointValue(0, -180)}; - groups[46] = new Value[] {geoPointValue(0, 0)}; - groups[47] = new Value[] {geoPointValue(0, 180)}; - groups[48] = new Value[] {geoPointValue(1, -180)}; - groups[49] = new Value[] {geoPointValue(1, 0)}; - groups[50] = new Value[] {geoPointValue(1, 180)}; - groups[51] = new Value[] {geoPointValue(90, -180)}; - groups[52] = new Value[] {geoPointValue(90, 0)}; - groups[53] = new Value[] {geoPointValue(90, 180)}; + groups[44] = new Value[] {geoPointValue(-90, -180)}; + groups[45] = new Value[] {geoPointValue(-90, 0)}; + groups[46] = new Value[] {geoPointValue(-90, 180)}; + groups[47] = new Value[] {geoPointValue(0, -180)}; + groups[48] = new Value[] {geoPointValue(0, 0)}; + groups[49] = new Value[] {geoPointValue(0, 180)}; + groups[50] = new Value[] {geoPointValue(1, -180)}; + groups[51] = new Value[] {geoPointValue(1, 0)}; + groups[52] = new Value[] {geoPointValue(1, 180)}; + groups[53] = new Value[] {geoPointValue(90, -180)}; + groups[54] = new Value[] {geoPointValue(90, 0)}; + groups[55] = new Value[] {geoPointValue(90, 180)}; // arrays - groups[54] = new Value[] {arrayValue()}; - groups[55] = new Value[] {arrayValue(stringValue("bar"))}; - groups[56] = new Value[] {arrayValue(stringValue("foo"))}; - groups[57] = new Value[] {arrayValue(stringValue("foo"), intValue(0))}; - groups[58] = new Value[] {arrayValue(stringValue("foo"), intValue(1))}; - groups[59] = new Value[] {arrayValue(stringValue("foo"), stringValue("0"))}; + groups[56] = new Value[] {arrayValue()}; + groups[57] = new Value[] {arrayValue(stringValue("bar"))}; + groups[58] = new Value[] {arrayValue(stringValue("foo"))}; + groups[59] = new Value[] {arrayValue(stringValue("foo"), intValue(0))}; + groups[60] = new Value[] {arrayValue(stringValue("foo"), intValue(1))}; + groups[61] = new Value[] {arrayValue(stringValue("foo"), stringValue("0"))}; // objects - groups[60] = new Value[] {objectValue("bar", intValue(0))}; - groups[61] = new Value[] {objectValue("bar", intValue(0), "foo", intValue(1))}; - groups[62] = new Value[] {objectValue("bar", intValue(1))}; - groups[63] = new Value[] {objectValue("bar", intValue(2))}; - groups[64] = new Value[] {objectValue("bar", stringValue("0"))}; + groups[62] = new Value[] {objectValue("bar", intValue(0))}; + groups[63] = new Value[] {objectValue("bar", intValue(0), "foo", intValue(1))}; + groups[64] = new Value[] {objectValue("bar", intValue(1))}; + groups[65] = new Value[] {objectValue("bar", intValue(2))}; + groups[66] = new Value[] {objectValue("bar", stringValue("0"))}; for (int left = 0; left < groups.length; left++) { for (int right = 0; right < groups.length; right++) { diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java index 6125d24f4..2381d0439 100644 --- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java +++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java @@ -28,12 +28,14 @@ import com.google.cloud.firestore.*; import com.google.cloud.firestore.Query.Direction; import java.time.Duration; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -1113,4 +1115,44 @@ public void testAggregateQueryProfile() throws Exception { assertThat(stats.getResultsReturned()).isEqualTo(1); assertThat(stats.getExecutionDuration()).isGreaterThan(Duration.ZERO); } + + @Test + public void snapshotListenerSortsNumbersSameWayAsServer() throws Exception { + CollectionReference col = createEmptyCollection(); + firestore + .batch() + .set(col.document("intMin"), map("value", Long.MIN_VALUE)) + .set(col.document("doubleMin"), map("value", ((double) Long.MIN_VALUE) - 100)) + .set(col.document("intMax"), map("value", Long.MAX_VALUE)) + .set(col.document("doubleMax"), map("value", ((double) Long.MAX_VALUE) + 100)) + .set(col.document("NaN"), map("value", Double.NaN)) + .set(col.document("integerMax"), map("value", (long) Integer.MAX_VALUE)) + .set(col.document("integerMin"), map("value", (long) Integer.MIN_VALUE)) + .set(col.document("negativeInfinity"), map("value", Double.NEGATIVE_INFINITY)) + .set(col.document("positiveInfinity"), map("value", Double.POSITIVE_INFINITY)) + .commit() + .get(); + + Query query = col.orderBy("value", Direction.ASCENDING); + + QuerySnapshot snapshot = query.get().get(); + List queryOrder = + snapshot.getDocuments().stream().map(doc -> doc.getId()).collect(Collectors.toList()); + + CountDownLatch latch = new CountDownLatch(1); + List listenerOrder = new ArrayList<>(); + ListenerRegistration registration = + query.addSnapshotListener( + (value, error) -> { + listenerOrder.addAll( + value.getDocuments().stream() + .map(doc -> doc.getId()) + .collect(Collectors.toList())); + latch.countDown(); + }); + latch.await(); + registration.remove(); + + assertEquals(queryOrder, listenerOrder); // Assert order in the SDK + } } From 43096393dd9e49dd9144fd2351e29cb40ea855c5 Mon Sep 17 00:00:00 2001 From: Mila <107142260+milaGGL@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:21:59 -0500 Subject: [PATCH 05/10] FIX: sort strings in UTF-8 encoded byte order (#1967) --- .../com/google/cloud/firestore/BasePath.java | 2 +- .../com/google/cloud/firestore/Order.java | 14 +- .../cloud/firestore/it/ITQueryTest.java | 201 ++++++++++++++++++ 3 files changed, 212 insertions(+), 5 deletions(-) diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/BasePath.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/BasePath.java index 448c6f320..11c4110c8 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/BasePath.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/BasePath.java @@ -149,7 +149,7 @@ private int compareSegments(String lhs, String rhs) { } else if (isLhsNumeric && isRhsNumeric) { // both numeric return Long.compare(extractNumericId(lhs), extractNumericId(rhs)); } else { // both string - return lhs.compareTo(rhs); + return Order.compareUtf8Strings(lhs, rhs); } } diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java index 28434920a..4cd58c95b 100644 --- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java +++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/Order.java @@ -115,7 +115,7 @@ public int compare(@Nonnull Value left, @Nonnull Value right) { case TIMESTAMP: return compareTimestamps(left, right); case STRING: - return compareStrings(left, right); + return compareUtf8Strings(left.getStringValue(), right.getStringValue()); case BLOB: return compareBlobs(left, right); case REF: @@ -134,14 +134,20 @@ public int compare(@Nonnull Value left, @Nonnull Value right) { } } - private int compareStrings(Value left, Value right) { - return left.getStringValue().compareTo(right.getStringValue()); + /** Compare strings in UTF-8 encoded byte order */ + public static int compareUtf8Strings(String left, String right) { + ByteString leftBytes = ByteString.copyFromUtf8(left); + ByteString rightBytes = ByteString.copyFromUtf8(right); + return compareByteStrings(leftBytes, rightBytes); } private int compareBlobs(Value left, Value right) { ByteString leftBytes = left.getBytesValue(); ByteString rightBytes = right.getBytesValue(); + return compareByteStrings(leftBytes, rightBytes); + } + private static int compareByteStrings(ByteString leftBytes, ByteString rightBytes) { int size = Math.min(leftBytes.size(), rightBytes.size()); for (int i = 0; i < size; i++) { // Make sure the bytes are unsigned @@ -211,7 +217,7 @@ private int compareObjects(Value left, Value right) { while (leftIterator.hasNext() && rightIterator.hasNext()) { Entry leftEntry = leftIterator.next(); Entry rightEntry = rightIterator.next(); - int keyCompare = leftEntry.getKey().compareTo(rightEntry.getKey()); + int keyCompare = compareUtf8Strings(leftEntry.getKey(), rightEntry.getKey()); if (keyCompare != 0) { return keyCompare; } diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java index 2381d0439..5ffb80d2a 100644 --- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java +++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITQueryTest.java @@ -1155,4 +1155,205 @@ public void snapshotListenerSortsNumbersSameWayAsServer() throws Exception { assertEquals(queryOrder, listenerOrder); // Assert order in the SDK } + + @Test + public void snapshotListenerSortsUnicodeStringsSameWayAsServer() throws Exception { + CollectionReference col = createEmptyCollection(); + + firestore + .batch() + .set(col.document("a"), map("value", "Łukasiewicz")) + .set(col.document("b"), map("value", "Sierpiński")) + .set(col.document("c"), map("value", "岩澤")) + .set(col.document("d"), map("value", "🄟")) + .set(col.document("e"), map("value", "P")) + .set(col.document("f"), map("value", "︒")) + .set(col.document("g"), map("value", "🐵")) + .commit() + .get(); + + Query query = col.orderBy("value", Direction.ASCENDING); + + QuerySnapshot snapshot = query.get().get(); + List queryOrder = + snapshot.getDocuments().stream().map(doc -> doc.getId()).collect(Collectors.toList()); + + CountDownLatch latch = new CountDownLatch(1); + List listenerOrder = new ArrayList<>(); + ListenerRegistration registration = + query.addSnapshotListener( + (value, error) -> { + listenerOrder.addAll( + value.getDocuments().stream() + .map(doc -> doc.getId()) + .collect(Collectors.toList())); + latch.countDown(); + }); + latch.await(); + registration.remove(); + + assertEquals(queryOrder, Arrays.asList("b", "a", "c", "f", "e", "d", "g")); + assertEquals(queryOrder, listenerOrder); + } + + @Test + public void snapshotListenerSortsUnicodeStringsInArraySameWayAsServer() throws Exception { + CollectionReference col = createEmptyCollection(); + + firestore + .batch() + .set(col.document("a"), map("value", Arrays.asList("Łukasiewicz"))) + .set(col.document("b"), map("value", Arrays.asList("Sierpiński"))) + .set(col.document("c"), map("value", Arrays.asList("岩澤"))) + .set(col.document("d"), map("value", Arrays.asList("🄟"))) + .set(col.document("e"), map("value", Arrays.asList("P"))) + .set(col.document("f"), map("value", Arrays.asList("︒"))) + .set(col.document("g"), map("value", Arrays.asList("🐵"))) + .commit() + .get(); + + Query query = col.orderBy("value", Direction.ASCENDING); + + QuerySnapshot snapshot = query.get().get(); + List queryOrder = + snapshot.getDocuments().stream().map(doc -> doc.getId()).collect(Collectors.toList()); + + CountDownLatch latch = new CountDownLatch(1); + List listenerOrder = new ArrayList<>(); + ListenerRegistration registration = + query.addSnapshotListener( + (value, error) -> { + listenerOrder.addAll( + value.getDocuments().stream() + .map(doc -> doc.getId()) + .collect(Collectors.toList())); + latch.countDown(); + }); + latch.await(); + registration.remove(); + + assertEquals(queryOrder, Arrays.asList("b", "a", "c", "f", "e", "d", "g")); + assertEquals(queryOrder, listenerOrder); + } + + @Test + public void snapshotListenerSortsUnicodeStringsInMapSameWayAsServer() throws Exception { + CollectionReference col = createEmptyCollection(); + + firestore + .batch() + .set(col.document("a"), map("value", map("foo", "Łukasiewicz"))) + .set(col.document("b"), map("value", map("foo", "Sierpiński"))) + .set(col.document("c"), map("value", map("foo", "岩澤"))) + .set(col.document("d"), map("value", map("foo", "🄟"))) + .set(col.document("e"), map("value", map("foo", "P"))) + .set(col.document("f"), map("value", map("foo", "︒"))) + .set(col.document("g"), map("value", map("foo", "🐵"))) + .commit() + .get(); + + Query query = col.orderBy("value", Direction.ASCENDING); + + QuerySnapshot snapshot = query.get().get(); + List queryOrder = + snapshot.getDocuments().stream().map(doc -> doc.getId()).collect(Collectors.toList()); + + CountDownLatch latch = new CountDownLatch(1); + List listenerOrder = new ArrayList<>(); + ListenerRegistration registration = + query.addSnapshotListener( + (value, error) -> { + listenerOrder.addAll( + value.getDocuments().stream() + .map(doc -> doc.getId()) + .collect(Collectors.toList())); + latch.countDown(); + }); + latch.await(); + registration.remove(); + + assertEquals(queryOrder, Arrays.asList("b", "a", "c", "f", "e", "d", "g")); + assertEquals(queryOrder, listenerOrder); + } + + @Test + public void snapshotListenerSortsUnicodeStringsInMapKeySameWayAsServer() throws Exception { + CollectionReference col = createEmptyCollection(); + + firestore + .batch() + .set(col.document("a"), map("value", map("Łukasiewicz", "foo"))) + .set(col.document("b"), map("value", map("Sierpiński", "foo"))) + .set(col.document("c"), map("value", map("岩澤", "foo"))) + .set(col.document("d"), map("value", map("🄟", "foo"))) + .set(col.document("e"), map("value", map("P", "foo"))) + .set(col.document("f"), map("value", map("︒", "foo"))) + .set(col.document("g"), map("value", map("🐵", "foo"))) + .commit() + .get(); + + Query query = col.orderBy("value", Direction.ASCENDING); + + QuerySnapshot snapshot = query.get().get(); + List queryOrder = + snapshot.getDocuments().stream().map(doc -> doc.getId()).collect(Collectors.toList()); + + CountDownLatch latch = new CountDownLatch(1); + List listenerOrder = new ArrayList<>(); + ListenerRegistration registration = + query.addSnapshotListener( + (value, error) -> { + listenerOrder.addAll( + value.getDocuments().stream() + .map(doc -> doc.getId()) + .collect(Collectors.toList())); + latch.countDown(); + }); + latch.await(); + registration.remove(); + + assertEquals(queryOrder, Arrays.asList("b", "a", "c", "f", "e", "d", "g")); + assertEquals(queryOrder, listenerOrder); + } + + @Test + public void snapshotListenerSortsUnicodeStringsInDocumentKeySameWayAsServer() throws Exception { + CollectionReference col = createEmptyCollection(); + + firestore + .batch() + .set(col.document("Łukasiewicz"), map("value", "foo")) + .set(col.document("Sierpiński"), map("value", "foo")) + .set(col.document("岩澤"), map("value", "foo")) + .set(col.document("🄟"), map("value", "foo")) + .set(col.document("P"), map("value", "foo")) + .set(col.document("︒"), map("value", "foo")) + .set(col.document("🐵"), map("value", "foo")) + .commit() + .get(); + + Query query = col.orderBy(FieldPath.documentId()); + + QuerySnapshot snapshot = query.get().get(); + List queryOrder = + snapshot.getDocuments().stream().map(doc -> doc.getId()).collect(Collectors.toList()); + + CountDownLatch latch = new CountDownLatch(1); + List listenerOrder = new ArrayList<>(); + ListenerRegistration registration = + query.addSnapshotListener( + (value, error) -> { + listenerOrder.addAll( + value.getDocuments().stream() + .map(doc -> doc.getId()) + .collect(Collectors.toList())); + latch.countDown(); + }); + latch.await(); + registration.remove(); + + assertEquals( + queryOrder, Arrays.asList("Sierpiński", "Łukasiewicz", "岩澤", "︒", "P", "🄟", "🐵")); + assertEquals(queryOrder, listenerOrder); + } } From c275b636434c2ffc7fa92a64f3821d9d1b9c42fc Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 16 Jan 2025 00:54:20 +0100 Subject: [PATCH 06/10] chore(deps): update dependency com.google.cloud:google-cloud-firestore to v3.30.3 (#1980) --- samples/install-without-bom/pom.xml | 2 +- samples/snapshot/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 314b43933..b7c21c73b 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,7 +30,7 @@ com.google.cloud google-cloud-firestore - 3.30.2 + 3.30.3 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 712c19d1a..1046b8a26 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-firestore - 3.30.2 + 3.30.3 From c4ea33134a63c722a15288421cc023a1ec5c5c74 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 16 Jan 2025 01:06:39 +0100 Subject: [PATCH 07/10] deps: update dependency com.diffplug.spotless:spotless-maven-plugin to v2.44.2 (#1981) --- google-cloud-firestore/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-firestore/pom.xml b/google-cloud-firestore/pom.xml index ccc13e7bd..2be7566e1 100644 --- a/google-cloud-firestore/pom.xml +++ b/google-cloud-firestore/pom.xml @@ -287,7 +287,7 @@ com.diffplug.spotless spotless-maven-plugin - 2.44.1 + 2.44.2 From bc3af08ce59cafb51f70921258ff37bbbf063c38 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 16 Jan 2025 01:06:55 +0100 Subject: [PATCH 08/10] chore(deps): update dependency com.google.cloud:libraries-bom to v26.53.0 (#1982) --- samples/snippets/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 155254da7..45adcc8d3 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -34,7 +34,7 @@ com.google.cloud libraries-bom - 26.52.0 + 26.53.0 pom import From d63cff2a028871b7360585137a83ea3dd955f4c3 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:35:38 -0500 Subject: [PATCH 09/10] chore(main): release 3.30.4-SNAPSHOT (#1979) * chore(main): release 3.30.4-SNAPSHOT * chore: generate libraries at Thu Jan 16 00:07:57 UTC 2025 --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cloud-java-bot --- README.md | 4 ++-- google-cloud-firestore-admin/pom.xml | 4 ++-- google-cloud-firestore-bom/pom.xml | 16 ++++++++-------- google-cloud-firestore/pom.xml | 4 ++-- grpc-google-cloud-firestore-admin-v1/pom.xml | 4 ++-- grpc-google-cloud-firestore-v1/pom.xml | 4 ++-- pom.xml | 14 +++++++------- proto-google-cloud-firestore-admin-v1/pom.xml | 4 ++-- proto-google-cloud-firestore-bundle-v1/pom.xml | 4 ++-- proto-google-cloud-firestore-v1/pom.xml | 4 ++-- versions.txt | 16 ++++++++-------- 11 files changed, 39 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index c2b70ba6e..2a4db7f4f 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.52.0 + 26.53.0 pom import @@ -41,7 +41,7 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-firestore - 3.30.2 + 3.30.3 ``` diff --git a/google-cloud-firestore-admin/pom.xml b/google-cloud-firestore-admin/pom.xml index d766fa4d8..6c69c429c 100644 --- a/google-cloud-firestore-admin/pom.xml +++ b/google-cloud-firestore-admin/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 google-cloud-firestore-admin - 3.30.3 + 3.30.4-SNAPSHOT jar Google Cloud Firestore Admin Client https://github.com/googleapis/java-firestore @@ -14,7 +14,7 @@ com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/google-cloud-firestore-bom/pom.xml b/google-cloud-firestore-bom/pom.xml index 7af35d24d..163649ed8 100644 --- a/google-cloud-firestore-bom/pom.xml +++ b/google-cloud-firestore-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-firestore-bom - 3.30.3 + 3.30.4-SNAPSHOT pom com.google.cloud @@ -52,37 +52,37 @@ com.google.cloud google-cloud-firestore - 3.30.3 + 3.30.4-SNAPSHOT com.google.cloud google-cloud-firestore-admin - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc grpc-google-cloud-firestore-admin-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc grpc-google-cloud-firestore-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc proto-google-cloud-firestore-admin-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc proto-google-cloud-firestore-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.cloud proto-google-cloud-firestore-bundle-v1 - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/google-cloud-firestore/pom.xml b/google-cloud-firestore/pom.xml index 2be7566e1..ee8c0f59d 100644 --- a/google-cloud-firestore/pom.xml +++ b/google-cloud-firestore/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-firestore - 3.30.3 + 3.30.4-SNAPSHOT jar Google Cloud Firestore https://github.com/googleapis/java-firestore @@ -12,7 +12,7 @@ com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT google-cloud-firestore diff --git a/grpc-google-cloud-firestore-admin-v1/pom.xml b/grpc-google-cloud-firestore-admin-v1/pom.xml index a606f56bc..a94c23577 100644 --- a/grpc-google-cloud-firestore-admin-v1/pom.xml +++ b/grpc-google-cloud-firestore-admin-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-firestore-admin-v1 - 3.30.3 + 3.30.4-SNAPSHOT grpc-google-cloud-firestore-admin-v1 GRPC library for grpc-google-cloud-firestore-admin-v1 com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/grpc-google-cloud-firestore-v1/pom.xml b/grpc-google-cloud-firestore-v1/pom.xml index c6eacb3ec..d71f9c48d 100644 --- a/grpc-google-cloud-firestore-v1/pom.xml +++ b/grpc-google-cloud-firestore-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-firestore-v1 - 3.30.3 + 3.30.4-SNAPSHOT grpc-google-cloud-firestore-v1 GRPC library for grpc-google-cloud-firestore-v1 com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/pom.xml b/pom.xml index 7df420cea..5af735b9b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-firestore-parent pom - 3.30.3 + 3.30.4-SNAPSHOT Google Cloud Firestore Parent https://github.com/googleapis/java-firestore @@ -150,32 +150,32 @@ com.google.api.grpc proto-google-cloud-firestore-admin-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.cloud google-cloud-firestore - 3.30.3 + 3.30.4-SNAPSHOT com.google.cloud proto-google-cloud-firestore-bundle-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc proto-google-cloud-firestore-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc grpc-google-cloud-firestore-admin-v1 - 3.30.3 + 3.30.4-SNAPSHOT com.google.api.grpc grpc-google-cloud-firestore-v1 - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/proto-google-cloud-firestore-admin-v1/pom.xml b/proto-google-cloud-firestore-admin-v1/pom.xml index d68bb5131..f6122864e 100644 --- a/proto-google-cloud-firestore-admin-v1/pom.xml +++ b/proto-google-cloud-firestore-admin-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-firestore-admin-v1 - 3.30.3 + 3.30.4-SNAPSHOT proto-google-cloud-firestore-admin-v1 PROTO library for proto-google-cloud-firestore-admin-v1 com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/proto-google-cloud-firestore-bundle-v1/pom.xml b/proto-google-cloud-firestore-bundle-v1/pom.xml index 643ecf90e..24238bb13 100644 --- a/proto-google-cloud-firestore-bundle-v1/pom.xml +++ b/proto-google-cloud-firestore-bundle-v1/pom.xml @@ -5,14 +5,14 @@ 4.0.0 proto-google-cloud-firestore-bundle-v1 - 3.30.3 + 3.30.4-SNAPSHOT proto-google-cloud-firestore-bundle-v1 PROTO library for proto-google-cloud-firestore-bundle-v1 com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/proto-google-cloud-firestore-v1/pom.xml b/proto-google-cloud-firestore-v1/pom.xml index 13ca4b3e4..8ae8d2ab2 100644 --- a/proto-google-cloud-firestore-v1/pom.xml +++ b/proto-google-cloud-firestore-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-firestore-v1 - 3.30.3 + 3.30.4-SNAPSHOT proto-google-cloud-firestore-v1 PROTO library for proto-google-cloud-firestore-v1 com.google.cloud google-cloud-firestore-parent - 3.30.3 + 3.30.4-SNAPSHOT diff --git a/versions.txt b/versions.txt index b36235632..9a2c82694 100644 --- a/versions.txt +++ b/versions.txt @@ -1,11 +1,11 @@ # Format: # module:released-version:current-version -google-cloud-firestore:3.30.3:3.30.3 -google-cloud-firestore-admin:3.30.3:3.30.3 -google-cloud-firestore-bom:3.30.3:3.30.3 -grpc-google-cloud-firestore-admin-v1:3.30.3:3.30.3 -grpc-google-cloud-firestore-v1:3.30.3:3.30.3 -proto-google-cloud-firestore-admin-v1:3.30.3:3.30.3 -proto-google-cloud-firestore-v1:3.30.3:3.30.3 -proto-google-cloud-firestore-bundle-v1:3.30.3:3.30.3 +google-cloud-firestore:3.30.3:3.30.4-SNAPSHOT +google-cloud-firestore-admin:3.30.3:3.30.4-SNAPSHOT +google-cloud-firestore-bom:3.30.3:3.30.4-SNAPSHOT +grpc-google-cloud-firestore-admin-v1:3.30.3:3.30.4-SNAPSHOT +grpc-google-cloud-firestore-v1:3.30.3:3.30.4-SNAPSHOT +proto-google-cloud-firestore-admin-v1:3.30.3:3.30.4-SNAPSHOT +proto-google-cloud-firestore-v1:3.30.3:3.30.4-SNAPSHOT +proto-google-cloud-firestore-bundle-v1:3.30.3:3.30.4-SNAPSHOT From ef7d8f9a5fb4835dafe5db25a8669554717e78e4 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 12:27:51 -0500 Subject: [PATCH 10/10] chore(main): release 3.30.4 (#1983) * chore(main): release 3.30.4 * chore: generate libraries at Thu Jan 16 17:36:35 UTC 2025 --------- Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: cloud-java-bot --- CHANGELOG.md | 16 ++++++++++++++++ README.md | 6 +++--- google-cloud-firestore-admin/pom.xml | 4 ++-- google-cloud-firestore-bom/pom.xml | 16 ++++++++-------- google-cloud-firestore/pom.xml | 4 ++-- grpc-google-cloud-firestore-admin-v1/pom.xml | 4 ++-- grpc-google-cloud-firestore-v1/pom.xml | 4 ++-- pom.xml | 14 +++++++------- proto-google-cloud-firestore-admin-v1/pom.xml | 4 ++-- proto-google-cloud-firestore-bundle-v1/pom.xml | 4 ++-- proto-google-cloud-firestore-v1/pom.xml | 4 ++-- versions.txt | 16 ++++++++-------- 12 files changed, 56 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6db31c09..5d00c8609 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [3.30.4](https://github.com/googleapis/java-firestore/compare/v3.30.3...v3.30.4) (2025-01-16) + + +### Bug Fixes + +* Comparing double with long ([#1960](https://github.com/googleapis/java-firestore/issues/1960)) ([8cb4dc8](https://github.com/googleapis/java-firestore/commit/8cb4dc8859b1d8331657704f36baba472ea3115c)) +* Sort strings in UTF-8 encoded byte order ([#1967](https://github.com/googleapis/java-firestore/issues/1967)) ([4309639](https://github.com/googleapis/java-firestore/commit/43096393dd9e49dd9144fd2351e29cb40ea855c5)) + + +### Dependencies + +* Update dependency com.diffplug.spotless:spotless-maven-plugin to v2.44.2 ([#1981](https://github.com/googleapis/java-firestore/issues/1981)) ([c4ea331](https://github.com/googleapis/java-firestore/commit/c4ea33134a63c722a15288421cc023a1ec5c5c74)) +* Update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.56.0 ([#1975](https://github.com/googleapis/java-firestore/issues/1975)) ([7388291](https://github.com/googleapis/java-firestore/commit/73882910443407c529e4d6763ebe78fd1c0411b1)) +* Update dependency com.google.cloud:google-cloud-trace to v2.56.0 ([#1976](https://github.com/googleapis/java-firestore/issues/1976)) ([978c053](https://github.com/googleapis/java-firestore/commit/978c053b0801da5f708d0016cae3358d33f1b2bd)) +* Update opentelemetry.version to v1.46.0 ([#1977](https://github.com/googleapis/java-firestore/issues/1977)) ([2b3de13](https://github.com/googleapis/java-firestore/commit/2b3de13db866badf1b405b3b2383cc85076460eb)) + ## [3.30.3](https://github.com/googleapis/java-firestore/compare/v3.30.2...v3.30.3) (2025-01-11) diff --git a/README.md b/README.md index 2a4db7f4f..35d8f29f9 100644 --- a/README.md +++ b/README.md @@ -56,13 +56,13 @@ implementation 'com.google.cloud:google-cloud-firestore' If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-firestore:3.30.3' +implementation 'com.google.cloud:google-cloud-firestore:3.30.4' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-firestore" % "3.30.3" +libraryDependencies += "com.google.cloud" % "google-cloud-firestore" % "3.30.4" ``` ## Authentication @@ -219,7 +219,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-firestore/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-firestore.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-firestore/3.30.3 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-firestore/3.30.4 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/google-cloud-firestore-admin/pom.xml b/google-cloud-firestore-admin/pom.xml index 6c69c429c..246d8ff10 100644 --- a/google-cloud-firestore-admin/pom.xml +++ b/google-cloud-firestore-admin/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 google-cloud-firestore-admin - 3.30.4-SNAPSHOT + 3.30.4 jar Google Cloud Firestore Admin Client https://github.com/googleapis/java-firestore @@ -14,7 +14,7 @@ com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/google-cloud-firestore-bom/pom.xml b/google-cloud-firestore-bom/pom.xml index 163649ed8..d28c98364 100644 --- a/google-cloud-firestore-bom/pom.xml +++ b/google-cloud-firestore-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-firestore-bom - 3.30.4-SNAPSHOT + 3.30.4 pom com.google.cloud @@ -52,37 +52,37 @@ com.google.cloud google-cloud-firestore - 3.30.4-SNAPSHOT + 3.30.4 com.google.cloud google-cloud-firestore-admin - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc grpc-google-cloud-firestore-admin-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc grpc-google-cloud-firestore-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc proto-google-cloud-firestore-admin-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc proto-google-cloud-firestore-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.cloud proto-google-cloud-firestore-bundle-v1 - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/google-cloud-firestore/pom.xml b/google-cloud-firestore/pom.xml index ee8c0f59d..16a368861 100644 --- a/google-cloud-firestore/pom.xml +++ b/google-cloud-firestore/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-firestore - 3.30.4-SNAPSHOT + 3.30.4 jar Google Cloud Firestore https://github.com/googleapis/java-firestore @@ -12,7 +12,7 @@ com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 google-cloud-firestore diff --git a/grpc-google-cloud-firestore-admin-v1/pom.xml b/grpc-google-cloud-firestore-admin-v1/pom.xml index a94c23577..d3fe7df7d 100644 --- a/grpc-google-cloud-firestore-admin-v1/pom.xml +++ b/grpc-google-cloud-firestore-admin-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-firestore-admin-v1 - 3.30.4-SNAPSHOT + 3.30.4 grpc-google-cloud-firestore-admin-v1 GRPC library for grpc-google-cloud-firestore-admin-v1 com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/grpc-google-cloud-firestore-v1/pom.xml b/grpc-google-cloud-firestore-v1/pom.xml index d71f9c48d..9257eac64 100644 --- a/grpc-google-cloud-firestore-v1/pom.xml +++ b/grpc-google-cloud-firestore-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-firestore-v1 - 3.30.4-SNAPSHOT + 3.30.4 grpc-google-cloud-firestore-v1 GRPC library for grpc-google-cloud-firestore-v1 com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/pom.xml b/pom.xml index 5af735b9b..c371f8801 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-firestore-parent pom - 3.30.4-SNAPSHOT + 3.30.4 Google Cloud Firestore Parent https://github.com/googleapis/java-firestore @@ -150,32 +150,32 @@ com.google.api.grpc proto-google-cloud-firestore-admin-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.cloud google-cloud-firestore - 3.30.4-SNAPSHOT + 3.30.4 com.google.cloud proto-google-cloud-firestore-bundle-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc proto-google-cloud-firestore-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc grpc-google-cloud-firestore-admin-v1 - 3.30.4-SNAPSHOT + 3.30.4 com.google.api.grpc grpc-google-cloud-firestore-v1 - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/proto-google-cloud-firestore-admin-v1/pom.xml b/proto-google-cloud-firestore-admin-v1/pom.xml index f6122864e..47c30b5c5 100644 --- a/proto-google-cloud-firestore-admin-v1/pom.xml +++ b/proto-google-cloud-firestore-admin-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-firestore-admin-v1 - 3.30.4-SNAPSHOT + 3.30.4 proto-google-cloud-firestore-admin-v1 PROTO library for proto-google-cloud-firestore-admin-v1 com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/proto-google-cloud-firestore-bundle-v1/pom.xml b/proto-google-cloud-firestore-bundle-v1/pom.xml index 24238bb13..1efbf887d 100644 --- a/proto-google-cloud-firestore-bundle-v1/pom.xml +++ b/proto-google-cloud-firestore-bundle-v1/pom.xml @@ -5,14 +5,14 @@ 4.0.0 proto-google-cloud-firestore-bundle-v1 - 3.30.4-SNAPSHOT + 3.30.4 proto-google-cloud-firestore-bundle-v1 PROTO library for proto-google-cloud-firestore-bundle-v1 com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/proto-google-cloud-firestore-v1/pom.xml b/proto-google-cloud-firestore-v1/pom.xml index 8ae8d2ab2..eb43e2ec1 100644 --- a/proto-google-cloud-firestore-v1/pom.xml +++ b/proto-google-cloud-firestore-v1/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-firestore-v1 - 3.30.4-SNAPSHOT + 3.30.4 proto-google-cloud-firestore-v1 PROTO library for proto-google-cloud-firestore-v1 com.google.cloud google-cloud-firestore-parent - 3.30.4-SNAPSHOT + 3.30.4 diff --git a/versions.txt b/versions.txt index 9a2c82694..9d7d7c65b 100644 --- a/versions.txt +++ b/versions.txt @@ -1,11 +1,11 @@ # Format: # module:released-version:current-version -google-cloud-firestore:3.30.3:3.30.4-SNAPSHOT -google-cloud-firestore-admin:3.30.3:3.30.4-SNAPSHOT -google-cloud-firestore-bom:3.30.3:3.30.4-SNAPSHOT -grpc-google-cloud-firestore-admin-v1:3.30.3:3.30.4-SNAPSHOT -grpc-google-cloud-firestore-v1:3.30.3:3.30.4-SNAPSHOT -proto-google-cloud-firestore-admin-v1:3.30.3:3.30.4-SNAPSHOT -proto-google-cloud-firestore-v1:3.30.3:3.30.4-SNAPSHOT -proto-google-cloud-firestore-bundle-v1:3.30.3:3.30.4-SNAPSHOT +google-cloud-firestore:3.30.4:3.30.4 +google-cloud-firestore-admin:3.30.4:3.30.4 +google-cloud-firestore-bom:3.30.4:3.30.4 +grpc-google-cloud-firestore-admin-v1:3.30.4:3.30.4 +grpc-google-cloud-firestore-v1:3.30.4:3.30.4 +proto-google-cloud-firestore-admin-v1:3.30.4:3.30.4 +proto-google-cloud-firestore-v1:3.30.4:3.30.4 +proto-google-cloud-firestore-bundle-v1:3.30.4:3.30.4