summaryrefslogtreecommitdiff
path: root/platform/darwin/src/NSPredicate+MGLAdditions.mm
diff options
context:
space:
mode:
authorFredrik Karlsson <bjorn.fredrik.karlsson@gmail.com>2016-08-17 13:38:02 +0200
committerFredrik Karlsson <bjorn.fredrik.karlsson@gmail.com>2016-09-02 22:42:05 +0200
commitd77a13eb7320722c48c8a18240adf99615c4b85f (patch)
tree1017781b310e434f943e4ad38b57f319ad7a3a58 /platform/darwin/src/NSPredicate+MGLAdditions.mm
parent6a39cf5aaece81c7a531b12321dd503004cc45b8 (diff)
downloadqtlocation-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.mm107
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