diff options
author | Fabian Guerra <fabian.guerra@mapbox.com> | 2018-04-12 10:07:43 -0400 |
---|---|---|
committer | Fabian Guerra <fabian.guerra@mapbox.com> | 2018-04-12 10:18:45 -0400 |
commit | 562f69c1fcaa2540cd073a569ff72b484bb46af1 (patch) | |
tree | 9d7b226090e0808c1f97b8c68d813a5a7a21687e | |
parent | da788073d6ea1251d5cbb89a1a00d00a65a75068 (diff) | |
download | qtlocation-mapboxgl-562f69c1fcaa2540cd073a569ff72b484bb46af1.tar.gz |
[ios, macos] Simplify NSPredicate's expression conversion code.
-rw-r--r-- | platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm | 36 | ||||
-rw-r--r-- | platform/darwin/src/NSPredicate+MGLAdditions.mm | 22 |
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]]; } } |