Skip to content

Commit de035e1

Browse files
authored
Add private function that returns a query's hash code. (#613)
1 parent c85d0ed commit de035e1

File tree

6 files changed

+33
-1
lines changed

6 files changed

+33
-1
lines changed

firestore/integration_test_internal/src/query_test.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ std::vector<MapFieldValue> AllDocsExcept(
7171

7272
} // namespace
7373

74+
size_t QueryHash(const Query& query) { return query.Hash(); }
75+
76+
TEST_F(QueryTest, TestHashCode) {
77+
CollectionReference collection =
78+
Collection({{"a", {{"k", FieldValue::String("a")}}},
79+
{"b", {{"k", FieldValue::String("b")}}}});
80+
Query query1 =
81+
collection.Limit(2).OrderBy("sort", Query::Direction::kAscending);
82+
Query query2 =
83+
collection.Limit(2).OrderBy("sort", Query::Direction::kDescending);
84+
EXPECT_NE(QueryHash(query1), QueryHash(query2));
85+
EXPECT_EQ(QueryHash(query1), QueryHash(query1));
86+
}
87+
7488
TEST_F(QueryTest, TestLimitQueries) {
7589
CollectionReference collection =
7690
Collection({{"a", {{"k", FieldValue::String("a")}}},

firestore/src/android/query_android.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ Method<Object> kAddSnapshotListener(
130130
"Lcom/google/firebase/firestore/MetadataChanges;"
131131
"Lcom/google/firebase/firestore/EventListener;)"
132132
"Lcom/google/firebase/firestore/ListenerRegistration;");
133+
Method<int32_t> kHashCode("hashCode", "()I");
133134

134135
} // namespace
135136

@@ -139,7 +140,7 @@ void QueryInternal::Initialize(jni::Loader& loader) {
139140
kGreaterThan, kGreaterThanOrEqualTo, kArrayContains, kArrayContainsAny,
140141
kIn, kNotIn, kOrderBy, kLimit, kLimitToLast, kStartAtSnapshot, kStartAt,
141142
kStartAfterSnapshot, kStartAfter, kEndBeforeSnapshot, kEndBefore,
142-
kEndAtSnapshot, kEndAt, kGet, kAddSnapshotListener);
143+
kEndAtSnapshot, kEndAt, kGet, kAddSnapshotListener, kHashCode);
143144
}
144145

145146
Firestore* QueryInternal::firestore() {
@@ -346,6 +347,11 @@ Local<Array<Object>> QueryInternal::ConvertFieldValues(
346347
return result;
347348
}
348349

350+
size_t QueryInternal::Hash() const {
351+
Env env = GetEnv();
352+
return env.Call(obj_, kHashCode);
353+
}
354+
349355
bool operator==(const QueryInternal& lhs, const QueryInternal& rhs) {
350356
return jni::EqualityCompareJni(lhs, rhs);
351357
}

firestore/src/android/query_android.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ class QueryInternal : public Wrapper {
379379
EventListener<QuerySnapshot>* listener,
380380
bool passing_listener_ownership = false);
381381

382+
size_t Hash() const;
383+
382384
protected:
383385
PromiseFactory<AsyncFn> promises_;
384386

firestore/src/common/query.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ ListenerRegistration Query::AddSnapshotListener(
302302
firebase::Move(callback));
303303
}
304304

305+
size_t Query::Hash() const {
306+
if (!internal_) return {};
307+
return internal_->Hash();
308+
}
309+
305310
bool operator==(const Query& lhs, const Query& rhs) {
306311
return EqualityCompare(lhs.internal_, rhs.internal_);
307312
}

firestore/src/include/firebase/firestore/query.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,10 @@ class Query {
650650
bool is_valid() const { return internal_ != nullptr; }
651651

652652
private:
653+
size_t Hash() const;
654+
653655
friend bool operator==(const Query& lhs, const Query& rhs);
656+
friend size_t QueryHash(const Query& query);
654657

655658
friend class FirestoreInternal;
656659
friend class QueryInternal;

firestore/src/main/query_main.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ class QueryInternal {
145145
return WithBound(BoundPosition::kEndAt, values);
146146
}
147147

148+
size_t Hash() const { return query_.Hash(); }
149+
148150
friend bool operator==(const QueryInternal& lhs, const QueryInternal& rhs);
149151

150152
protected:

0 commit comments

Comments
 (0)