diff options
author | Fabian Guerra <fabian.guerra@mapbox.com> | 2018-04-11 10:49:31 -0400 |
---|---|---|
committer | Fabian Guerra <fabian.guerra@mapbox.com> | 2018-04-12 10:11:53 -0400 |
commit | 36c95fc5bab9bb13f97576335d1a6a34fad1ad54 (patch) | |
tree | 942de18519b75fd080d497e7660449db5127a6a8 | |
parent | b889e608c569a53f3853055d6c2cbd60b09cada6 (diff) | |
download | qtlocation-mapboxgl-36c95fc5bab9bb13f97576335d1a6a34fad1ad54.tar.gz |
[ios, macos] Add NSPredicate 'CONTAINS' expression filter support.
-rw-r--r-- | platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm | 7 | ||||
-rw-r--r-- | platform/darwin/src/NSPredicate+MGLAdditions.mm | 4 | ||||
-rw-r--r-- | platform/darwin/test/MGLPredicateTests.mm | 12 |
3 files changed, 20 insertions, 3 deletions
diff --git a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm index d738132e8d..3cc86258bd 100644 --- a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm +++ b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm @@ -333,16 +333,17 @@ options:0]; return @[op, leftHandPredicate.mgl_jsonExpressionObject, rightHandPredicate.mgl_jsonExpressionObject]; } - case NSInPredicateOperatorType: { + case NSInPredicateOperatorType: op = @"match"; break; - } + case NSContainsPredicateOperatorType: + op = @"has"; + break; case NSMatchesPredicateOperatorType: case NSLikePredicateOperatorType: case NSBeginsWithPredicateOperatorType: case NSEndsWithPredicateOperatorType: case NSCustomSelectorPredicateOperatorType: - case NSContainsPredicateOperatorType: [NSException raise:NSInvalidArgumentException format:@"NSPredicateOperatorType:%lu is not supported.", (unsigned long)self.predicateOperatorType]; } diff --git a/platform/darwin/src/NSPredicate+MGLAdditions.mm b/platform/darwin/src/NSPredicate+MGLAdditions.mm index aeaf667b45..6ce46629af 100644 --- a/platform/darwin/src/NSPredicate+MGLAdditions.mm +++ b/platform/darwin/src/NSPredicate+MGLAdditions.mm @@ -323,6 +323,10 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) { NSArray *subpredicates = MGLSubexpressionsWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]); return [NSPredicate predicateWithFormat:@"%@ IN %@" argumentArray:subpredicates]; } + if ([op isEqualToString:@"has"]) { + NSArray *subpredicates = MGLSubexpressionsWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]); + return [NSPredicate predicateWithFormat:@"%@ CONTAINS %@" argumentArray:subpredicates]; + } NSAssert(NO, @"Unrecognized expression conditional operator %@.", op); return nil; diff --git a/platform/darwin/test/MGLPredicateTests.mm b/platform/darwin/test/MGLPredicateTests.mm index b80dcb581f..f562415b28 100644 --- a/platform/darwin/test/MGLPredicateTests.mm +++ b/platform/darwin/test/MGLPredicateTests.mm @@ -610,6 +610,18 @@ namespace mbgl { XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected); XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicate); } + { + NSArray *expected = @[@"has", @[@"literal", @[@6, @5, @4, @3]], @[@"get", @"x"]]; + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"{ 6, 5, 4, 3} CONTAINS x"]; + XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected); + XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicate); + } + { + NSArray *expected = @[@"has", @[@"literal", @[@6, @5, @4, @3]], @[@"id"]]; + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"{ 6, 5, 4, 3} CONTAINS $mgl_featureIdentifier"]; + XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected); + XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicate); + } } @end |