diff options
author | Fabian Guerra Soto <fabian.guerra@mapbox.com> | 2018-04-12 17:43:01 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-12 17:43:01 -0400 |
commit | 23f0222fd973956c5508f8ae879d8ce97c1b09c0 (patch) | |
tree | 0221cc9d5f9649eed1bc47315292a9be74c54f92 /platform/darwin/src/NSPredicate+MGLAdditions.mm | |
parent | be3fc4413ab2e553c7957721bc3a7a03d414cd64 (diff) | |
download | qtlocation-mapboxgl-23f0222fd973956c5508f8ae879d8ce97c1b09c0.tar.gz |
[ios, macos] Add predicate like expressions to NSExpression (#11632)
* [ios, macos] Add NSPredicate between function.
* [ios, macos] Add NSPredicate 'IN' expression filter support .
* [ios, macos] Add NSPredicate 'CONTAINS' expression filter support.
* [ios, macos] Refactor NSPredicate operators.
* [ios, macos] Simplify NSPredicate's expression conversion code.
* [ios, macos] Make 'match' the default predicate conversion option.
Diffstat (limited to 'platform/darwin/src/NSPredicate+MGLAdditions.mm')
-rw-r--r-- | platform/darwin/src/NSPredicate+MGLAdditions.mm | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/platform/darwin/src/NSPredicate+MGLAdditions.mm b/platform/darwin/src/NSPredicate+MGLAdditions.mm index 8fe5735bf9..ed48c794aa 100644 --- a/platform/darwin/src/NSPredicate+MGLAdditions.mm +++ b/platform/darwin/src/NSPredicate+MGLAdditions.mm @@ -280,7 +280,7 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) { } if ([op isEqualToString:@">="]) { NSArray *subexpressions = MGLSubexpressionsWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]); - return [NSPredicate predicateWithFormat:@"%K >= %@" argumentArray:subexpressions]; + return [NSPredicate predicateWithFormat:@"%@ >= %@" argumentArray:subexpressions]; } if ([op isEqualToString:@"!"]) { NSArray *subpredicates = MGLSubpredicatesWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]); @@ -294,7 +294,43 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) { return [NSPredicate predicateWithValue:YES]; } if ([op isEqualToString:@"all"]) { - NSArray *subpredicates = MGLSubpredicatesWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]); + NSArray<NSPredicate *> *subpredicates = MGLSubpredicatesWithJSONObjects([objects subarrayWithRange:NSMakeRange(1, objects.count - 1)]); + if (subpredicates.count == 2) { + // Determine if the expression is of BETWEEN type + 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(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(leftCondition.predicateOperatorType == NSLessThanOrEqualToPredicateOperatorType && + rightCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType) { + limits = @[leftCondition.leftExpression, rightCondition.leftExpression]; + leftConditionExpression = leftCondition.rightExpression; + + } else if(leftCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType && + rightCondition.predicateOperatorType == NSGreaterThanOrEqualToPredicateOperatorType) { + limits = @[leftCondition.rightExpression, rightCondition.leftExpression]; + leftConditionExpression = leftCondition.leftExpression; + } + + if (limits && leftConditionExpression) { + return [NSPredicate predicateWithFormat:@"%@ BETWEEN %@", leftConditionExpression, [NSExpression expressionForAggregate:limits]]; + } + } + } return [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; } if ([op isEqualToString:@"any"]) { @@ -302,8 +338,13 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) { return [NSCompoundPredicate orPredicateWithSubpredicates:subpredicates]; } - 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 { |