Skip to content

Commit 2a263ea

Browse files
authored
Port FIRQuery to C++ (#2986)
1 parent 774a1e2 commit 2a263ea

19 files changed

+794
-285
lines changed

Firestore/Example/Tests/API/FIRQueryTests.mm

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818

1919
#import <XCTest/XCTest.h>
2020

21+
#import "Firestore/Source/API/FIRFirestore+Internal.h"
2122
#import "Firestore/Source/API/FIRQuery+Internal.h"
2223
#import "Firestore/Source/Core/FSTQuery.h"
2324

2425
#import "Firestore/Example/Tests/API/FSTAPIHelpers.h"
2526

27+
namespace api = firebase::firestore::api;
28+
2629
NS_ASSUME_NONNULL_BEGIN
2730

2831
@interface FIRQueryTests : XCTestCase
@@ -31,10 +34,10 @@ @interface FIRQueryTests : XCTestCase
3134
@implementation FIRQueryTests
3235

3336
- (void)testEquals {
34-
FIRFirestore *firestore = FSTTestFirestore();
35-
FIRQuery *queryFoo = [FIRQuery referenceWithQuery:FSTTestQuery("foo") firestore:firestore];
36-
FIRQuery *queryFooDup = [FIRQuery referenceWithQuery:FSTTestQuery("foo") firestore:firestore];
37-
FIRQuery *queryBar = [FIRQuery referenceWithQuery:FSTTestQuery("bar") firestore:firestore];
37+
std::shared_ptr<api::Firestore> firestore = FSTTestFirestore().wrapped;
38+
FIRQuery *queryFoo = [[FIRQuery alloc] initWithQuery:FSTTestQuery("foo") firestore:firestore];
39+
FIRQuery *queryFooDup = [[FIRQuery alloc] initWithQuery:FSTTestQuery("foo") firestore:firestore];
40+
FIRQuery *queryBar = [[FIRQuery alloc] initWithQuery:FSTTestQuery("bar") firestore:firestore];
3841
XCTAssertEqualObjects(queryFoo, queryFooDup);
3942
XCTAssertNotEqualObjects(queryFoo, queryBar);
4043
XCTAssertEqualObjects([queryFoo queryWhereField:@"f" isEqualTo:@1],
@@ -51,8 +54,8 @@ - (void)testEquals {
5154
}
5255

5356
- (void)testFilteringWithPredicate {
54-
FIRFirestore *firestore = FSTTestFirestore();
55-
FIRQuery *query = [FIRQuery referenceWithQuery:FSTTestQuery("foo") firestore:firestore];
57+
std::shared_ptr<api::Firestore> firestore = FSTTestFirestore().wrapped;
58+
FIRQuery *query = [[FIRQuery alloc] initWithQuery:FSTTestQuery("foo") firestore:firestore];
5659
FIRQuery *query1 = [query queryWhereField:@"f" isLessThanOrEqualTo:@1];
5760
FIRQuery *query2 = [query queryFilteredUsingPredicate:[NSPredicate predicateWithFormat:@"f<=1"]];
5861
FIRQuery *query3 = [[query queryWhereField:@"f1" isLessThan:@2] queryWhereField:@"f2"

Firestore/Source/API/FIRCollectionReference.mm

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
#import "Firestore/Source/API/FIRDocumentReference+Internal.h"
2424
#import "Firestore/Source/API/FIRFirestore+Internal.h"
2525
#import "Firestore/Source/API/FIRQuery+Internal.h"
26-
#import "Firestore/Source/API/FIRQuery_Init.h"
2726
#import "Firestore/Source/Core/FSTQuery.h"
2827

2928
#include "Firestore/core/src/firebase/firestore/api/input_validation.h"
3029
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
3130
#include "Firestore/core/src/firebase/firestore/model/resource_path.h"
31+
#include "Firestore/core/src/firebase/firestore/util/hashing.h"
3232
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
3333

3434
namespace util = firebase::firestore::util;
@@ -44,9 +44,7 @@ - (instancetype)initWithPath:(const ResourcePath &)path
4444
firestore:(FIRFirestore *)firestore NS_DESIGNATED_INITIALIZER;
4545

4646
// Mark the super class designated initializer unavailable.
47-
- (instancetype)initWithQuery:(FSTQuery *)query
48-
firestore:(FIRFirestore *)firestore
49-
__attribute__((unavailable("Use the initWithPath constructor of FIRCollectionReference.")));
47+
- (instancetype)initWithQuery:(api::Query &&)query NS_UNAVAILABLE;
5048
@end
5149

5250
@implementation FIRCollectionReference (Internal)
@@ -63,12 +61,14 @@ - (instancetype)initWithPath:(const ResourcePath &)path firestore:(FIRFirestore
6361
"number of segments, but %s has %s",
6462
path.CanonicalString(), path.size());
6563
}
66-
self = [super initWithQuery:[FSTQuery queryWithPath:path] firestore:firestore];
64+
65+
api::Query query([FSTQuery queryWithPath:path], firestore.wrapped);
66+
self = [super initWithQuery:std::move(query)];
6767
return self;
6868
}
6969

7070
// Override the designated initializer from the super class.
71-
- (instancetype)initWithQuery:(FSTQuery *)query firestore:(FIRFirestore *)firestore {
71+
- (instancetype)initWithQuery:(api::Query &&)query {
7272
HARD_FAIL("Use FIRCollectionReference initWithPath: initializer.");
7373
}
7474

@@ -87,9 +87,7 @@ - (BOOL)isEqualToReference:(nullable FIRCollectionReference *)reference {
8787
}
8888

8989
- (NSUInteger)hash {
90-
NSUInteger hash = [self.firestore hash];
91-
hash = hash * 31u + [self.query hash];
92-
return hash;
90+
return util::Hash(self.firestore, self.query);
9391
}
9492

9593
- (NSString *)collectionID {

Firestore/Source/API/FIRQuery+Internal.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,29 @@
1616

1717
#import "FIRQuery.h"
1818

19+
#include <memory>
20+
21+
#include "Firestore/core/src/firebase/firestore/api/query_core.h"
22+
23+
namespace api = firebase::firestore::api;
24+
1925
@class FSTQuery;
2026

2127
NS_ASSUME_NONNULL_BEGIN
2228

29+
@interface FIRQuery (/* Init */)
30+
31+
- (instancetype)initWithQuery:(api::Query &&)query NS_DESIGNATED_INITIALIZER;
32+
33+
- (instancetype)initWithQuery:(FSTQuery *)query
34+
firestore:(std::shared_ptr<api::Firestore>)firestore;
35+
36+
@end
37+
2338
/** Internal FIRQuery API we don't want exposed in our public header files. */
2439
@interface FIRQuery (Internal)
25-
+ (FIRQuery *)referenceWithQuery:(FSTQuery *)query firestore:(FIRFirestore *)firestore;
2640

27-
@property(nonatomic, strong, readonly) FSTQuery *query;
41+
- (FSTQuery *)query;
2842

2943
@end
3044

0 commit comments

Comments
 (0)