aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source/Core
diff options
context:
space:
mode:
authorGravatar Michael Lehenbauer <mikelehen@gmail.com>2018-04-23 10:03:55 -0700
committerGravatar GitHub <noreply@github.com>2018-04-23 10:03:55 -0700
commite4384c3e809556e75907df74cd116307f397472f (patch)
tree98841eba1d45eb94adcb798b6f792c16ba4b8d18 /Firestore/Source/Core
parent8e70791465f9b5e4bb75dfc18de4a4ed90961974 (diff)
Array Contains Queries (not added to public headers yet). (#1138)
Diffstat (limited to 'Firestore/Source/Core')
-rw-r--r--Firestore/Source/Core/FSTQuery.h1
-rw-r--r--Firestore/Source/Core/FSTQuery.mm25
2 files changed, 21 insertions, 5 deletions
diff --git a/Firestore/Source/Core/FSTQuery.h b/Firestore/Source/Core/FSTQuery.h
index 3a67e7f..572fabb 100644
--- a/Firestore/Source/Core/FSTQuery.h
+++ b/Firestore/Source/Core/FSTQuery.h
@@ -34,6 +34,7 @@ typedef NS_ENUM(NSInteger, FSTRelationFilterOperator) {
FSTRelationFilterOperatorEqual,
FSTRelationFilterOperatorGreaterThanOrEqual,
FSTRelationFilterOperatorGreaterThan,
+ FSTRelationFilterOperatorArrayContains,
};
/** Interface used for all query filters. */
diff --git a/Firestore/Source/Core/FSTQuery.mm b/Firestore/Source/Core/FSTQuery.mm
index 8f49c26..0cd11e8 100644
--- a/Firestore/Source/Core/FSTQuery.mm
+++ b/Firestore/Source/Core/FSTQuery.mm
@@ -58,6 +58,8 @@ NSString *FSTStringFromQueryRelationOperator(FSTRelationFilterOperator filterOpe
return @">=";
case FSTRelationFilterOperatorGreaterThan:
return @">";
+ case FSTRelationFilterOperatorArrayContains:
+ return @"array_contains";
default:
FSTCFail(@"Unknown FSTRelationFilterOperator %lu", (unsigned long)filterOperator);
}
@@ -119,7 +121,8 @@ NSString *FSTStringFromQueryRelationOperator(FSTRelationFilterOperator filterOpe
#pragma mark - Public Methods
- (BOOL)isInequality {
- return self.filterOperator != FSTRelationFilterOperatorEqual;
+ return self.filterOperator != FSTRelationFilterOperatorEqual &&
+ self.filterOperator != FSTRelationFilterOperatorArrayContains;
}
- (const firebase::firestore::model::FieldPath &)field {
@@ -150,6 +153,8 @@ NSString *FSTStringFromQueryRelationOperator(FSTRelationFilterOperator filterOpe
if (_field.IsKeyFieldPath()) {
FSTAssert([self.value isKindOfClass:[FSTReferenceValue class]],
@"Comparing on key, but filter value not a FSTReferenceValue.");
+ FSTAssert(self.filterOperator != FSTRelationFilterOperatorArrayContains,
+ @"arrayContains queries don't make sense on document keys.");
FSTReferenceValue *refValue = (FSTReferenceValue *)self.value;
NSComparisonResult comparison = FSTDocumentKeyComparator(document.key, refValue.value);
return [self matchesComparison:comparison];
@@ -180,9 +185,19 @@ NSString *FSTStringFromQueryRelationOperator(FSTRelationFilterOperator filterOpe
/** Returns YES if receiver is true with the given value as its LHS. */
- (BOOL)matchesValue:(FSTFieldValue *)other {
- // Only compare types with matching backend order (such as double and int).
- return self.value.typeOrder == other.typeOrder &&
- [self matchesComparison:[other compare:self.value]];
+ if (self.filterOperator == FSTRelationFilterOperatorArrayContains) {
+ if ([other isMemberOfClass:[FSTArrayValue class]]) {
+ FSTArrayValue *arrayValue = (FSTArrayValue *)other;
+ return [arrayValue.internalValue containsObject:self.value];
+ } else {
+ return false;
+ }
+ } else {
+ // Only perform comparison queries on types with matching backend order (such as double and
+ // int).
+ return self.value.typeOrder == other.typeOrder &&
+ [self matchesComparison:[other compare:self.value]];
+ }
}
- (BOOL)matchesComparison:(NSComparisonResult)comparison {
@@ -701,7 +716,7 @@ NSString *FSTStringFromQueryRelationOperator(FSTRelationFilterOperator filterOpe
- (const FieldPath *)inequalityFilterField {
for (id<FSTFilter> filter in self.filters) {
if ([filter isKindOfClass:[FSTRelationFilter class]] &&
- ((FSTRelationFilter *)filter).filterOperator != FSTRelationFilterOperatorEqual) {
+ ((FSTRelationFilter *)filter).isInequality) {
return &filter.field;
}
}