summaryrefslogtreecommitdiff
path: root/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
blob: 19c264aa40ae415de51d4b50193686b160790ece (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#import "NSComparisonPredicate+MGLAdditions.h"

#import "NSPredicate+MGLAdditions.h"
#import "NSExpression+MGLAdditions.h"

@implementation NSComparisonPredicate (MGLAdditions)

- (mbgl::style::Filter)mgl_filter
{
    switch (self.predicateOperatorType) {
        case NSEqualToPredicateOperatorType: {
            if (self.rightExpression.constantValue)
            {
                auto filter = mbgl::style::EqualsFilter();
                filter.key = self.leftExpression.keyPath.UTF8String;
                filter.value = self.rightExpression.mgl_filterValue;
                return filter;
            }
            else
            {
                auto filter = mbgl::style::NotHasFilter();
                filter.key = self.leftExpression.keyPath.UTF8String;
                return filter;
            }
        }
        case NSNotEqualToPredicateOperatorType: {
            if (self.rightExpression.constantValue)
            {
                auto filter = mbgl::style::NotEqualsFilter();
                filter.key = self.leftExpression.keyPath.UTF8String;
                filter.value = self.rightExpression.mgl_filterValue;
                return filter;
            }
            else
            {
                auto filter = mbgl::style::HasFilter();
                filter.key = self.leftExpression.keyPath.UTF8String;
                return filter;
            }
        }
        case NSGreaterThanPredicateOperatorType: {
            auto filter = mbgl::style::GreaterThanFilter();
            filter.key = self.leftExpression.keyPath.UTF8String;
            filter.value = self.rightExpression.mgl_filterValue;
            return filter;
        }
        case NSGreaterThanOrEqualToPredicateOperatorType: {
            auto filter = mbgl::style::GreaterThanEqualsFilter();
            filter.key = self.leftExpression.keyPath.UTF8String;
            filter.value = self.rightExpression.mgl_filterValue;
            return filter;
        }
        case NSLessThanPredicateOperatorType: {
            auto filter = mbgl::style::LessThanFilter();
            filter.key = self.leftExpression.keyPath.UTF8String;
            filter.value = self.rightExpression.mgl_filterValue;
            return filter;
        }
        case NSLessThanOrEqualToPredicateOperatorType: {
            auto filter = mbgl::style::LessThanEqualsFilter();
            filter.key = self.leftExpression.keyPath.UTF8String;
            filter.value = self.rightExpression.mgl_filterValue;
            return filter;
        }
        case NSInPredicateOperatorType: {
            auto filter = mbgl::style::InFilter();
            filter.key = self.leftExpression.keyPath.UTF8String;
            filter.values = self.rightExpression.mgl_filterValues;
            return filter;
        }
        case NSContainsPredicateOperatorType: {
            auto filter = mbgl::style::InFilter();
            filter.key = [self.rightExpression.constantValue UTF8String];
            filter.values = self.leftExpression.mgl_filterValues;
            return filter;
        }
        case NSBetweenPredicateOperatorType: {
            auto filter = mbgl::style::AllFilter();
            auto gteFilter = mbgl::style::GreaterThanEqualsFilter();
            gteFilter.key = self.leftExpression.keyPath.UTF8String;
            gteFilter.value = self.rightExpression.mgl_filterValues[0];
            filter.filters.push_back(gteFilter);
            auto lteFilter = mbgl::style::LessThanEqualsFilter();
            lteFilter.key = self.leftExpression.keyPath.UTF8String;
            lteFilter.value = self.rightExpression.mgl_filterValues[1];
            filter.filters.push_back(lteFilter);
            return filter;
        }
        case NSMatchesPredicateOperatorType:
        case NSLikePredicateOperatorType:
        case NSBeginsWithPredicateOperatorType:
        case NSEndsWithPredicateOperatorType:
        case NSCustomSelectorPredicateOperatorType:
            [NSException raise:@"Unsupported operator type"
                        format:@"NSPredicateOperatorType:%lu is not supported.", (unsigned long)self.predicateOperatorType];
    }
    
    return {};
}

@end