summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Guerra <fabian.guerra@mapbox.com>2018-04-12 10:07:43 -0400
committerFabian Guerra <fabian.guerra@mapbox.com>2018-04-12 10:18:45 -0400
commit562f69c1fcaa2540cd073a569ff72b484bb46af1 (patch)
tree9d7b226090e0808c1f97b8c68d813a5a7a21687e
parentda788073d6ea1251d5cbb89a1a00d00a65a75068 (diff)
downloadqtlocation-mapboxgl-562f69c1fcaa2540cd073a569ff72b484bb46af1.tar.gz
[ios, macos] Simplify NSPredicate's expression conversion code.
-rw-r--r--platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm36
-rw-r--r--platform/darwin/src/NSPredicate+MGLAdditions.mm22
2 files changed, 30 insertions, 28 deletions
diff --git a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
index 89026f63c3..469e7f3c5a 100644
--- a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
+++ b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
@@ -323,21 +323,35 @@
NSArray *limits = self.rightExpression.constantValue;
NSPredicate *leftHandPredicate = [NSComparisonPredicate predicateWithLeftExpression:limits[0]
rightExpression:self.leftExpression
- modifier:NSAllPredicateModifier
+ modifier:NSDirectPredicateModifier
type:NSLessThanOrEqualToPredicateOperatorType
options:0];
NSPredicate *rightHandPredicate = [NSComparisonPredicate predicateWithLeftExpression:self.leftExpression
rightExpression:limits[1]
- modifier:NSAllPredicateModifier
+ modifier:NSDirectPredicateModifier
type:NSLessThanOrEqualToPredicateOperatorType
options:0];
return @[op, leftHandPredicate.mgl_jsonExpressionObject, rightHandPredicate.mgl_jsonExpressionObject];
}
case NSInPredicateOperatorType: {
- return [self mgl_jsonMatchObjectWithExpression:self.leftExpression options:self.rightExpression];
+ NSMutableArray *elements = [NSMutableArray arrayWithObjects:@"match", self.leftExpression.mgl_jsonExpressionObject, nil];
+ NSArray *optionsExpressions = self.rightExpression.constantValue;
+ NSEnumerator *optionsEnumerator = optionsExpressions.objectEnumerator;
+ while (id object = optionsEnumerator.nextObject) {
+ id option = ((NSExpression *)object).mgl_jsonExpressionObject;
+ [elements addObject:option];
+ [elements addObject:@YES];
+ }
+ [elements addObject:@NO];
+ return elements;
}
case NSContainsPredicateOperatorType: {
- return [self mgl_jsonMatchObjectWithExpression:self.rightExpression options:self.leftExpression];
+ NSPredicate *inPredicate = [NSComparisonPredicate predicateWithLeftExpression:self.rightExpression
+ rightExpression:self.leftExpression
+ modifier:self.comparisonPredicateModifier
+ type:NSInPredicateOperatorType
+ options:self.options];
+ return inPredicate.mgl_jsonExpressionObject;
}
case NSMatchesPredicateOperatorType:
case NSLikePredicateOperatorType:
@@ -353,18 +367,4 @@
return nil;
}
-- (id)mgl_jsonMatchObjectWithExpression:(NSExpression *)operand options:(NSExpression *)options {
- NSMutableArray *elements = [NSMutableArray arrayWithObjects:@"match", operand.mgl_jsonExpressionObject, nil];
- NSArray *optionsExpressions = options.constantValue;
- NSEnumerator *optionsEnumerator = optionsExpressions.objectEnumerator;
- while (id object = optionsEnumerator.nextObject) {
- id option = ((NSExpression *)object).mgl_jsonExpressionObject;
- [elements addObject:option];
- [elements addObject:[NSExpression expressionForConstantValue:@YES].mgl_jsonExpressionObject];
- }
- [elements addObject:[NSExpression expressionForConstantValue:@NO].mgl_jsonExpressionObject];
-
- return elements;
-}
-
@end
diff --git a/platform/darwin/src/NSPredicate+MGLAdditions.mm b/platform/darwin/src/NSPredicate+MGLAdditions.mm
index 34571ea847..d801fdb00f 100644
--- a/platform/darwin/src/NSPredicate+MGLAdditions.mm
+++ b/platform/darwin/src/NSPredicate+MGLAdditions.mm
@@ -295,7 +295,7 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) {
}
if ([op isEqualToString:@"all"]) {
NSArray *jsonObjects = [objects subarrayWithRange:NSMakeRange(1, objects.count - 1)];
- NSArray *subpredicates = MGLSubpredicatesWithJSONObjects(jsonObjects);
+ NSArray<NSPredicate *> *subpredicates = MGLSubpredicatesWithJSONObjects(jsonObjects);
if (jsonObjects.count == 2) {
// Determine if the expression is of BETWEEN type
if ([jsonObjects[0] isKindOfClass:[NSArray class]] &&
@@ -304,26 +304,28 @@ NSArray *MGLSubpredicatesWithJSONObjects(NSArray *objects) {
NSArray *rightCondition = jsonObjects[1];
NSString *leftOperator = leftCondition.firstObject;
NSString *rightOperator = rightCondition.firstObject;
+
NSArray *limits;
NSExpression *leftConditionExpression;
+
if([leftOperator isEqualToString:@">="] && [rightOperator isEqualToString:@"<="]) {
- limits = @[[NSExpression mgl_expressionWithJSONObject:leftCondition[2]], [NSExpression mgl_expressionWithJSONObject:rightCondition[2]]];
- leftConditionExpression = [NSExpression mgl_expressionWithJSONObject:leftCondition[1]];
+ limits = @[((NSComparisonPredicate *)subpredicates[0]).rightExpression, ((NSComparisonPredicate *)subpredicates[1]).rightExpression];
+ leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).leftExpression;
} else if ([leftOperator isEqualToString:@"<="] && [rightOperator isEqualToString:@"<="]) {
- limits = @[[NSExpression mgl_expressionWithJSONObject:leftCondition[1]], [NSExpression mgl_expressionWithJSONObject:rightCondition[2]]];
- leftConditionExpression = [NSExpression mgl_expressionWithJSONObject:leftCondition[2]];
+ limits = @[((NSComparisonPredicate *)subpredicates[0]).leftExpression, ((NSComparisonPredicate *)subpredicates[1]).rightExpression];
+ leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).rightExpression;
} else if([leftOperator isEqualToString:@"<="] && [rightOperator isEqualToString:@">="]) {
- limits = @[[NSExpression mgl_expressionWithJSONObject:leftCondition[1]], [NSExpression mgl_expressionWithJSONObject:rightCondition[1]]];
- leftConditionExpression = [NSExpression mgl_expressionWithJSONObject:leftCondition[2]];
+ limits = @[((NSComparisonPredicate *)subpredicates[0]).leftExpression, ((NSComparisonPredicate *)subpredicates[1]).leftExpression];
+ leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).rightExpression;
} else if([leftOperator isEqualToString:@">="] && [rightOperator isEqualToString:@">="]) {
- limits = @[[NSExpression mgl_expressionWithJSONObject:leftCondition[2]], [NSExpression mgl_expressionWithJSONObject:rightCondition[1]]];
- leftConditionExpression = [NSExpression mgl_expressionWithJSONObject:leftCondition[1]];
+ limits = @[((NSComparisonPredicate *)subpredicates[0]).rightExpression, ((NSComparisonPredicate *)subpredicates[1]).leftExpression];
+ leftConditionExpression = ((NSComparisonPredicate *)subpredicates[0]).leftExpression;
}
- if (limits && limits) {
+ if (limits && leftConditionExpression) {
return [NSPredicate predicateWithFormat:@"%@ BETWEEN %@", leftConditionExpression, [NSExpression expressionForAggregate:limits]];
}
}