From dfd111b3ef68517ab5e0054557fac29b632d9b0a Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 17 Sep 2025 15:40:42 -0400 Subject: [PATCH 1/2] firestore: DocumentViewChangeSet.java: Improve query performance by using an unsorted HashMap instead of a sorted TreeMap --- firebase-firestore/CHANGELOG.md | 2 ++ .../firestore/core/DocumentViewChangeSet.java | 7 +++--- .../core/DocumentViewChangeSetTest.java | 25 ++++++++----------- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/firebase-firestore/CHANGELOG.md b/firebase-firestore/CHANGELOG.md index 375c5d3d447..044a4f1dc80 100644 --- a/firebase-firestore/CHANGELOG.md +++ b/firebase-firestore/CHANGELOG.md @@ -8,6 +8,8 @@ [#7376](//github.com/firebase/firebase-android-sdk/issues/7376) - [changed] Improve query performance via internal memoization of calculated document data. [#7370](//github.com/firebase/firebase-android-sdk/issues/7370) +- [changed] Switch TreeSet to HashSet to improve query execution performance. + [#NNNN](//github.com/firebase/firebase-android-sdk/issues/NNNN) # 26.0.0 diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/core/DocumentViewChangeSet.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/core/DocumentViewChangeSet.java index f89ca5f3771..7fb24ea7f29 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/core/DocumentViewChangeSet.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/core/DocumentViewChangeSet.java @@ -19,16 +19,15 @@ import com.google.firebase.firestore.core.DocumentViewChange.Type; import com.google.firebase.firestore.model.DocumentKey; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; -import java.util.TreeMap; /** A set of changes to documents with respect to a view. This set is mutable. */ public class DocumentViewChangeSet { - // This map is sorted to make the unit tests simpler. - private final TreeMap changes; + private final HashMap changes; public DocumentViewChangeSet() { - changes = new TreeMap<>(); + changes = new HashMap<>(); } public void addChange(DocumentViewChange change) { diff --git a/firebase-firestore/src/test/java/com/google/firebase/firestore/core/DocumentViewChangeSetTest.java b/firebase-firestore/src/test/java/com/google/firebase/firestore/core/DocumentViewChangeSetTest.java index c876cf2a298..aa7b1f33351 100644 --- a/firebase-firestore/src/test/java/com/google/firebase/firestore/core/DocumentViewChangeSetTest.java +++ b/firebase-firestore/src/test/java/com/google/firebase/firestore/core/DocumentViewChangeSetTest.java @@ -14,6 +14,7 @@ package com.google.firebase.firestore.core; +import static com.google.common.truth.Truth.assertThat; import static com.google.firebase.firestore.testutil.TestUtil.EMPTY_MAP; import static com.google.firebase.firestore.testutil.TestUtil.doc; import static org.junit.Assert.assertEquals; @@ -71,20 +72,14 @@ public void testTrack() { List changes = set.getChanges(); - assertEquals(7, changes.size()); - assertEquals(added, changes.get(0).getDocument()); - assertEquals(Type.ADDED, changes.get(0).getType()); - assertEquals(removed, changes.get(1).getDocument()); - assertEquals(Type.REMOVED, changes.get(1).getType()); - assertEquals(modified, changes.get(2).getDocument()); - assertEquals(Type.MODIFIED, changes.get(2).getType()); - assertEquals(addedThenModified, changes.get(3).getDocument()); - assertEquals(Type.ADDED, changes.get(3).getType()); - assertEquals(removedThenAdded, changes.get(4).getDocument()); - assertEquals(Type.MODIFIED, changes.get(4).getType()); - assertEquals(modifiedThenRemoved, changes.get(5).getDocument()); - assertEquals(Type.REMOVED, changes.get(5).getType()); - assertEquals(modifiedThenModified, changes.get(6).getDocument()); - assertEquals(Type.MODIFIED, changes.get(6).getType()); + assertThat(changes) + .containsExactly( + DocumentViewChange.create(Type.ADDED, added), + DocumentViewChange.create(Type.REMOVED, removed), + DocumentViewChange.create(Type.MODIFIED, modified), + DocumentViewChange.create(Type.ADDED, addedThenModified), + DocumentViewChange.create(Type.MODIFIED, removedThenAdded), + DocumentViewChange.create(Type.REMOVED, modifiedThenRemoved), + DocumentViewChange.create(Type.MODIFIED, modifiedThenModified)); } } From a78da24f4ae8511cb30ae368f9ab004a90786aa5 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 17 Sep 2025 15:44:43 -0400 Subject: [PATCH 2/2] CHANGELOG.md: add pr number --- firebase-firestore/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firebase-firestore/CHANGELOG.md b/firebase-firestore/CHANGELOG.md index 044a4f1dc80..12f4e33fe52 100644 --- a/firebase-firestore/CHANGELOG.md +++ b/firebase-firestore/CHANGELOG.md @@ -8,8 +8,8 @@ [#7376](//github.com/firebase/firebase-android-sdk/issues/7376) - [changed] Improve query performance via internal memoization of calculated document data. [#7370](//github.com/firebase/firebase-android-sdk/issues/7370) -- [changed] Switch TreeSet to HashSet to improve query execution performance. - [#NNNN](//github.com/firebase/firebase-android-sdk/issues/NNNN) +- [changed] Improve query performance by using an unsorted HashMap instead of a sorted TreeMap. + [#7389](//github.com/firebase/firebase-android-sdk/pull/7389) # 26.0.0