From 711338e43bcbe18b44b585905ee9e9750cf92dce Mon Sep 17 00:00:00 2001 From: Fabian Guerra Date: Thu, 12 Apr 2018 13:08:24 -0400 Subject: [ios, macos] Make 'match' the default predicate conversion option. --- .../src/NSComparisonPredicate+MGLAdditions.mm | 3 +- platform/darwin/src/NSPredicate+MGLAdditions.mm | 62 +++++++++++----------- platform/darwin/test/MGLPredicateTests.mm | 20 ++----- 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 *subpredicates = MGLSubpredicatesWithJSONObjects(jsonObjects); - if (jsonObjects.count == 2) { + NSArray *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 -- cgit v1.2.1