summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Guerra <fabian.guerra@mapbox.com>2018-04-12 13:08:24 -0400
committerFabian Guerra <fabian.guerra@mapbox.com>2018-04-12 16:46:49 -0400
commit711338e43bcbe18b44b585905ee9e9750cf92dce (patch)
treeaafc937a557373d4e2d87837a86d06e1aa7ca781
parent562f69c1fcaa2540cd073a569ff72b484bb46af1 (diff)
downloadqtlocation-mapboxgl-upstream/fabian-predicate-operators-11013.tar.gz
[ios, macos] Make 'match' the default predicate conversion option.upstream/fabian-predicate-operators-11013
-rw-r--r--platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm3
-rw-r--r--platform/darwin/src/NSPredicate+MGLAdditions.mm62
-rw-r--r--platform/darwin/test/MGLPredicateTests.mm20
3 files changed, 36 insertions, 49 deletions
diff --git a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
index 469e7f3c5a..c39e987d85 100644
--- a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
+++ b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
@@ -336,8 +336,7 @@
case NSInPredicateOperatorType: {
NSMutableArray *elements = [NSMutableArray arrayWithObjects:@"match", self.leftExpression.mgl_jsonExpressionObject, nil];
NSArray *optionsExpressions = self.rightExpression.constantValue;
- NSEnumerator *optionsEnumerator = optionsExpressions.objectEnumerator;
- while (id object = optionsEnumerator.nextObject) {
+ for (id object in optionsExpressions) {
id option = ((NSExpression *)object).mgl_jsonExpressionObject;
[elements addObject:option];
[elements addObject:@YES];
diff --git a/platform/darwin/src/NSPredicate+MGLAdditions.mm b/platform/darwin/src/NSPredicate+MGLAdditions.mm
index d801fdb00f..ed48c794aa 100644
--- a/platform/darwin/src/NSPredicate+MGLAdditions.mm
+++ b/platform/darwin/src/NSPredicate+MGLAdditions.mm
@@ -294,35 +294,36 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) {
return [NSPredicate predicateWithValue:YES];
}
if ([op isEqualToString:@"all"]) {
- NSArray *jsonObjects = [objects subarrayWithRange:NSMakeRange(1, objects.count - 1)];
- NSArray<NSPredicate *> *subpredicates = MGLSubpredicatesWithJSONObjects(jsonObjects);
- if (jsonObjects.count == 2) {
+ NSArray<NSPredicate *> *subpredicates = MGLSubpredicatesWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]);
+ if (subpredicates.count == 2) {
// Determine if the expression is of BETWEEN type
- if ([jsonObjects[0] isKindOfClass:[NSArray class]] &&
- [jsonObjects[1] isKindOfClass:[NSArray class]]) {
- NSArray *leftCondition = jsonObjects[0];
- NSArray *rightCondition = jsonObjects[1];
- NSString *leftOperator = leftCondition.firstObject;
- NSString *rightOperator = rightCondition.firstObject;
+ if ([subpredicates[0] isKindOfClass:[NSComparisonPredicate class]] &&
+ [subpredicates[1] isKindOfClass:[NSComparisonPredicate class]]) {
+ NSComparisonPredicate *leftCondition = (NSComparisonPredicate *)subpredicates[0];
+ NSComparisonPredicate *rightCondition = (NSComparisonPredicate *)subpredicates[1];
NSArray *limits;
NSExpression *leftConditionExpression;
- if([leftOperator isEqualToString:@">="] && [rightOperator isEqualToString:@"<="]) {
- limits = @[((NSComparisonPredicate *)subpredicates[0]).rightExpression, ((NSComparisonPredicate *)subpredicates[1]).rightExpression];
- leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).leftExpression;
+ if(leftCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType &&
+ rightCondition.predicateOperatorType == NSLessThanOrEqualToPredicateOperatorType) {
+ limits = @[leftCondition.rightExpression, rightCondition.rightExpression];
+ leftConditionExpression = leftCondition.leftExpression;
+
+ } else if (leftCondition.predicateOperatorType == NSLessThanOrEqualToPredicateOperatorType &&
+ rightCondition.predicateOperatorType == NSLessThanOrEqualToPredicateOperatorType) {
+ limits = @[leftCondition.leftExpression, rightCondition.rightExpression];
+ leftConditionExpression = leftCondition.rightExpression;
- } else if ([leftOperator isEqualToString:@"<="] && [rightOperator isEqualToString:@"<="]) {
- limits = @[((NSComparisonPredicate *)subpredicates[0]).leftExpression, ((NSComparisonPredicate *)subpredicates[1]).rightExpression];
- leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).rightExpression;
+ } else if(leftCondition.predicateOperatorType == NSLessThanOrEqualToPredicateOperatorType &&
+ rightCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType) {
+ limits = @[leftCondition.leftExpression, rightCondition.leftExpression];
+ leftConditionExpression = leftCondition.rightExpression;
- } else if([leftOperator isEqualToString:@"<="] && [rightOperator isEqualToString:@">="]) {
- limits = @[((NSComparisonPredicate *)subpredicates[0]).leftExpression, ((NSComparisonPredicate *)subpredicates[1]).leftExpression];
- leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).rightExpression;
-
- } else if([leftOperator isEqualToString:@">="] && [rightOperator isEqualToString:@">="]) {
- limits = @[((NSComparisonPredicate *)subpredicates[0]).rightExpression, ((NSComparisonPredicate *)subpredicates[1]).leftExpression];
- leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).leftExpression;
+ } else if(leftCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType &&
+ rightCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType) {
+ limits = @[leftCondition.rightExpression, rightCondition.leftExpression];
+ leftConditionExpression = leftCondition.leftExpression;
}
if (limits && leftConditionExpression) {
@@ -336,17 +337,14 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) {
NSArray *subpredicates = MGLSubpredicatesWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]);
return [NSCompoundPredicate orPredicateWithSubpredicates:subpredicates];
}
- if ([op isEqualToString:@"match"]) {
- NSExpression *expression = [NSExpression mgl_expressionWithJSONObject:object];
- return [NSComparisonPredicate predicateWithLeftExpression:expression
- rightExpression:[NSExpression expressionForConstantValue:@YES]
- modifier:NSDirectPredicateModifier
- type:NSNotEqualToPredicateOperatorType
- options:0];
- }
- NSAssert(NO, @"Unrecognized expression conditional operator %@.", op);
- return nil;
+ NSExpression *expression = [NSExpression expressionWithMGLJSONObject:object];
+ return [NSComparisonPredicate predicateWithLeftExpression:expression
+ rightExpression:[NSExpression expressionForConstantValue:@YES]
+ modifier:NSDirectPredicateModifier
+ type:NSEqualToPredicateOperatorType
+ options:0];
+
}
- (id)mgl_jsonExpressionObject {
diff --git a/platform/darwin/test/MGLPredicateTests.mm b/platform/darwin/test/MGLPredicateTests.mm
index dcbc7caaa5..5671de3252 100644
--- a/platform/darwin/test/MGLPredicateTests.mm
+++ b/platform/darwin/test/MGLPredicateTests.mm
@@ -617,40 +617,30 @@ namespace mbgl {
NSArray *expected = @[@"match", @[@"id"], @6, @YES, @5, @YES, @4, @YES, @3, @YES, @NO];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"$mgl_featureIdentifier IN { 6, 5, 4, 3}"];
XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected);
- NSString *mglMatch = @"MGL_MATCH($mgl_featureIdentifier, 6, YES, 5, YES, 4, YES, 3, YES, NO)";
- NSPredicate *predicateAfter = [self matchPredicateWithFormat:mglMatch];
+ NSPredicate *predicateAfter = [NSPredicate predicateWithFormat:@"MGL_MATCH($mgl_featureIdentifier, 6, YES, 5, YES, 4, YES, 3, YES, NO) == YES"];
XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicateAfter);
}
{
NSArray *expected = @[@"!", @[@"match", @[@"get", @"x"], @6, @YES, @5, @YES, @4, @YES, @3, @YES, @NO]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT x IN { 6, 5, 4, 3}"];
XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected);
+ NSPredicate *predicateAfter = [NSPredicate predicateWithFormat:@"NOT MGL_MATCH(x, 6, YES, 5, YES, 4, YES, 3, YES, NO) == YES"];
+ XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicateAfter);
}
{
NSArray *expected = @[@"match", @[@"get", @"x"], @6, @YES, @5, @YES, @4, @YES, @3, @YES, @NO];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"{ 6, 5, 4, 3} CONTAINS x"];
XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected);
- NSString *mglMatch = @"MGL_MATCH(x, 6, YES, 5, YES, 4, YES, 3, YES, NO)";
- NSPredicate *predicateAfter = [self matchPredicateWithFormat:mglMatch];
+ NSPredicate *predicateAfter = [NSPredicate predicateWithFormat:@"MGL_MATCH(x, 6, YES, 5, YES, 4, YES, 3, YES, NO) == YES"];
XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicateAfter);
}
{
NSArray *expected = @[@"match", @[@"id"], @6, @YES, @5, @YES, @4, @YES, @3, @YES, @NO];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"{ 6, 5, 4, 3} CONTAINS $mgl_featureIdentifier"];
XCTAssertEqualObjects(predicate.mgl_jsonExpressionObject, expected);
- NSString *mglMatch = @"MGL_MATCH($mgl_featureIdentifier, 6, YES, 5, YES, 4, YES, 3, YES, NO)";
- NSPredicate *predicateAfter = [self matchPredicateWithFormat:mglMatch];
+ NSPredicate *predicateAfter = [NSPredicate predicateWithFormat:@"MGL_MATCH($mgl_featureIdentifier, 6, YES, 5, YES, 4, YES, 3, YES, NO) == YES"];
XCTAssertEqualObjects([NSPredicate mgl_predicateWithJSONObject:expected], predicateAfter);
}
}
-- (NSPredicate *)matchPredicateWithFormat:(NSString *)format {
- NSPredicate *predicate = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionWithFormat:format]
- rightExpression:[NSExpression expressionForConstantValue:@YES]
- modifier:NSDirectPredicateModifier
- type:NSNotEqualToPredicateOperatorType
- options:0];
- return predicate;
-}
-
@end