summaryrefslogtreecommitdiff
path: root/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm')
-rw-r--r--platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm105
1 files changed, 103 insertions, 2 deletions
diff --git a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
index 295b3b21f8..ac2d598d05 100644
--- a/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
+++ b/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
@@ -5,8 +5,7 @@
@implementation NSComparisonPredicate (MGLAdditions)
-- (mbgl::style::Filter)mgl_filter
-{
+- (mbgl::style::Filter)mgl_filter {
NSExpression *leftExpression = self.leftExpression;
NSExpression *rightExpression = self.rightExpression;
NSExpressionType leftType = leftExpression.expressionType;
@@ -18,6 +17,25 @@
mbgl::style::EqualsFilter eqFilter;
eqFilter.key = self.mgl_keyPath.UTF8String;
eqFilter.value = self.mgl_constantValue;
+
+ // Convert $type == to TypeEqualsFilter.
+ if (eqFilter.key == "$type") {
+ mbgl::style::TypeEqualsFilter typeEqFilter;
+ typeEqFilter.value = self.mgl_featureType;
+ return typeEqFilter;
+ }
+
+ // Convert $id == to IdentifierEqualsFilter.
+ if (eqFilter.key == "$id") {
+ // Convert $id == nil to NotHasIdentifierFilter.
+ if (eqFilter.value.is<mbgl::NullValue>()) {
+ return mbgl::style::NotHasIdentifierFilter();
+ }
+
+ mbgl::style::IdentifierEqualsFilter idEqFilter;
+ idEqFilter.value = self.mgl_featureIdentifier;
+ return idEqFilter;
+ }
// Convert == nil to NotHasFilter.
if (eqFilter.value.is<mbgl::NullValue>()) {
@@ -32,6 +50,25 @@
mbgl::style::NotEqualsFilter neFilter;
neFilter.key = self.mgl_keyPath.UTF8String;
neFilter.value = self.mgl_constantValue;
+
+ // Convert $type != to TypeNotEqualsFilter.
+ if (neFilter.key == "$type") {
+ mbgl::style::TypeNotEqualsFilter typeNeFilter;
+ typeNeFilter.value = self.mgl_featureType;
+ return typeNeFilter;
+ }
+
+ // Convert $id != to IdentifierNotEqualsFilter.
+ if (neFilter.key == "$id") {
+ // Convert $id != nil to HasIdentifierFilter.
+ if (neFilter.value.is<mbgl::NullValue>()) {
+ return mbgl::style::HasIdentifierFilter();
+ }
+
+ mbgl::style::IdentifierNotEqualsFilter idNeFilter;
+ idNeFilter.value = self.mgl_featureIdentifier;
+ return idNeFilter;
+ }
// Convert != nil to HasFilter.
if (neFilter.value.is<mbgl::NullValue>()) {
@@ -103,6 +140,21 @@
[NSException raise:NSInvalidArgumentException
format:@"Predicate cannot compare values IN attribute."];
}
+
+ // Convert $type IN to TypeInFilter.
+ if ([leftExpression.keyPath isEqualToString:@"$type"]) {
+ mbgl::style::TypeInFilter typeInFilter;
+ typeInFilter.values = rightExpression.mgl_aggregateFeatureType;
+ return typeInFilter;
+ }
+
+ // Convert $id IN to IdentifierInFilter.
+ if ([leftExpression.keyPath isEqualToString:@"$id"]) {
+ mbgl::style::IdentifierInFilter idInFilter;
+ idInFilter.values = rightExpression.mgl_aggregateFeatureIdentifier;
+ return idInFilter;
+ }
+
mbgl::style::InFilter inFilter;
inFilter.key = leftExpression.keyPath.UTF8String;
inFilter.values = rightExpression.mgl_aggregateMBGLValue;
@@ -117,6 +169,21 @@
[NSException raise:NSInvalidArgumentException
format:@"Predicate cannot compare attribute CONTAINS values."];
}
+
+ // Convert CONTAINS $type to TypeInFilter.
+ if ([rightExpression.keyPath isEqualToString:@"$type"]) {
+ mbgl::style::TypeInFilter typeInFilter;
+ typeInFilter.values = leftExpression.mgl_aggregateFeatureType;
+ return typeInFilter;
+ }
+
+ // Convert CONTAINS $id to IdentifierInFilter.
+ if ([rightExpression.keyPath isEqualToString:@"$id"]) {
+ mbgl::style::IdentifierInFilter idInFilter;
+ idInFilter.values = leftExpression.mgl_aggregateFeatureIdentifier;
+ return idInFilter;
+ }
+
mbgl::style::InFilter inFilter;
inFilter.key = rightExpression.keyPath.UTF8String;
inFilter.values = leftExpression.mgl_aggregateMBGLValue;
@@ -192,4 +259,38 @@
return value;
}
+- (mbgl::FeatureType)mgl_featureType {
+ NSExpression *leftExpression = self.leftExpression;
+ NSExpression *rightExpression = self.rightExpression;
+ NSExpressionType leftType = leftExpression.expressionType;
+ NSExpressionType rightType = rightExpression.expressionType;
+ mbgl::FeatureType type;
+ if (leftType == NSKeyPathExpressionType && rightType == NSConstantValueExpressionType) {
+ type = rightExpression.mgl_featureType;
+ } else if (leftType == NSConstantValueExpressionType && rightType == NSKeyPathExpressionType) {
+ type = leftExpression.mgl_featureType;
+ } else {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Comparison predicate must compare an attribute (as a key path) to a constant or vice versa."];
+ }
+ return type;
+}
+
+- (mbgl::FeatureIdentifier)mgl_featureIdentifier {
+ NSExpression *leftExpression = self.leftExpression;
+ NSExpression *rightExpression = self.rightExpression;
+ NSExpressionType leftType = leftExpression.expressionType;
+ NSExpressionType rightType = rightExpression.expressionType;
+ mbgl::FeatureIdentifier identifier;
+ if (leftType == NSKeyPathExpressionType && rightType == NSConstantValueExpressionType) {
+ identifier = rightExpression.mgl_featureIdentifier;
+ } else if (leftType == NSConstantValueExpressionType && rightType == NSKeyPathExpressionType) {
+ identifier = leftExpression.mgl_featureIdentifier;
+ } else {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Comparison predicate must compare an attribute (as a key path) to a constant or vice versa."];
+ }
+ return identifier;
+}
+
@end