diff options
author | Fredrik Karlsson <bjorn.fredrik.karlsson@gmail.com> | 2016-08-17 13:38:02 +0200 |
---|---|---|
committer | Fredrik Karlsson <bjorn.fredrik.karlsson@gmail.com> | 2016-09-02 22:42:05 +0200 |
commit | d77a13eb7320722c48c8a18240adf99615c4b85f (patch) | |
tree | 1017781b310e434f943e4ad38b57f319ad7a3a58 /platform/darwin/src/NSPredicate+MGLAdditions.mm | |
parent | 6a39cf5aaece81c7a531b12321dd503004cc45b8 (diff) | |
download | qtlocation-mapboxgl-d77a13eb7320722c48c8a18240adf99615c4b85f.tar.gz |
[ios] Added support for filters (NSPredicate)
[ios, macos] cleaned up filters
[ios] added a filter example
[ios] utest filters
[ios, macos] nested predicates
[ios] refactored
[ios] filter -> NSPredicate
[ios] fixed mbgl::Any/AllFilter -> NSPredicate
[ios] translate nested mbgl::NotIn filters
[ios] cleanup and added more utests
[ios] fixed a bug in the None filter conversion and improved utests
[ios, macos] doc
[macos] added missing category
[ios, macos] additional utests
[ios, macos] updated documentation
Diffstat (limited to 'platform/darwin/src/NSPredicate+MGLAdditions.mm')
-rw-r--r-- | platform/darwin/src/NSPredicate+MGLAdditions.mm | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/platform/darwin/src/NSPredicate+MGLAdditions.mm b/platform/darwin/src/NSPredicate+MGLAdditions.mm new file mode 100644 index 0000000000..9c3f9c888c --- /dev/null +++ b/platform/darwin/src/NSPredicate+MGLAdditions.mm @@ -0,0 +1,107 @@ +#import "NSPredicate+MGLAdditions.h" + +#import "MGLValueEvaluator.h" + +class FilterEvaluator { +public: + + NSArray* getPredicates(std::vector<mbgl::style::Filter> filters) { + NSMutableArray *predicates = [NSMutableArray arrayWithCapacity:filters.size()]; + for (auto filter : filters) { + [predicates addObject:mbgl::style::Filter::visit(filter, FilterEvaluator())]; + } + return predicates; + } + + NSArray* getValues(std::vector<mbgl::Value> values) { + NSMutableArray *array = [NSMutableArray arrayWithCapacity:values.size()]; + for (auto value : values) { + [array addObject:mbgl::Value::visit(value, ValueEvaluator())]; + } + return array; + } + + NSPredicate* operator()(mbgl::style::NullFilter filter) { + return nil; + } + + NSPredicate* operator()(mbgl::style::EqualsFilter filter) { + return [NSPredicate predicateWithFormat:@"%K == %@", @(filter.key.c_str()), mbgl::Value::visit(filter.value, ValueEvaluator())]; + } + + NSPredicate* operator()(mbgl::style::NotEqualsFilter filter) { + return [NSPredicate predicateWithFormat:@"%K != %@", @(filter.key.c_str()), mbgl::Value::visit(filter.value, ValueEvaluator())]; + } + + NSPredicate* operator()(mbgl::style::GreaterThanFilter filter) { + return [NSPredicate predicateWithFormat:@"%K > %@", @(filter.key.c_str()), mbgl::Value::visit(filter.value, ValueEvaluator())]; + } + + NSPredicate* operator()(mbgl::style::GreaterThanEqualsFilter filter) { + return [NSPredicate predicateWithFormat:@"%K >= %@", @(filter.key.c_str()), mbgl::Value::visit(filter.value, ValueEvaluator())]; + } + + NSPredicate* operator()(mbgl::style::LessThanFilter filter) { + return [NSPredicate predicateWithFormat:@"%K < %@", @(filter.key.c_str()), mbgl::Value::visit(filter.value, ValueEvaluator())]; + } + + NSPredicate* operator()(mbgl::style::LessThanEqualsFilter filter) { + return [NSPredicate predicateWithFormat:@"%K <= %@", @(filter.key.c_str()), mbgl::Value::visit(filter.value, ValueEvaluator())]; + } + + NSPredicate* operator()(mbgl::style::InFilter filter) { + return [NSPredicate predicateWithFormat:@"%K IN %@", @(filter.key.c_str()), getValues(filter.values)]; + } + + NSPredicate* operator()(mbgl::style::NotInFilter filter) { + return [NSPredicate predicateWithFormat:@"NOT %K IN %@", @(filter.key.c_str()), getValues(filter.values)]; + } + + NSPredicate* operator()(mbgl::style::AnyFilter filter) { + return [NSCompoundPredicate orPredicateWithSubpredicates:getPredicates(filter.filters)]; + } + + NSPredicate* operator()(mbgl::style::AllFilter filter) { + return [NSCompoundPredicate andPredicateWithSubpredicates:getPredicates(filter.filters)]; + } + + NSPredicate* operator()(mbgl::style::NoneFilter filter) { + NSArray *predicates = getPredicates(filter.filters); + if (predicates.count > 1) { + NSCompoundPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates]; + return [NSCompoundPredicate notPredicateWithSubpredicate:predicate]; + } else { + return [NSCompoundPredicate notPredicateWithSubpredicate:predicates.firstObject]; + } + } + + NSPredicate* operator()(mbgl::style::HasFilter filter) { + [NSException raise:@"Unsupported filter type" + format:@"Cannot convert mbgl::style::HasFilter to NSPredicate"]; + return nil; + } + + NSPredicate* operator()(mbgl::style::NotHasFilter filter) { + [NSException raise:@"Unsupported filter type" + format:@"Cannot convert mbgl::style::NotHasFilter to NSPredicate"]; + return nil; + } + +}; + +@implementation NSPredicate (MGLAdditions) + +- (mbgl::style::Filter)mgl_filter +{ + [NSException raise:@"Not supported" + format:@"NSPredicate doesn't implement ’-mgl_filter’. Try with NSComparisonPredicate or NSCompoundPredicate instead."]; + return {}; +} + ++ (instancetype)mgl_predicateWithFilter:(mbgl::style::Filter)filter +{ + FilterEvaluator evaluator; + return mbgl::style::Filter::visit(filter, evaluator); +} + +@end |