NSPredicate+FBFormat.m 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * Copyright (c) 2015-present, Facebook, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. */
  9. #import "NSPredicate+FBFormat.h"
  10. #import "NSExpression+FBFormat.h"
  11. #import "FBXCElementSnapshotWrapper+Helpers.h"
  12. @implementation NSPredicate (FBFormat)
  13. + (instancetype)fb_predicateWithPredicate:(NSPredicate *)original
  14. comparisonModifier:(NSPredicate *(^)(NSComparisonPredicate *))comparisonModifier
  15. {
  16. if ([original isKindOfClass:NSCompoundPredicate.class]) {
  17. NSCompoundPredicate *compPred = (NSCompoundPredicate *)original;
  18. NSMutableArray *predicates = [NSMutableArray array];
  19. for (NSPredicate *predicate in [compPred subpredicates]) {
  20. NSPredicate *newPredicate = [self.class fb_predicateWithPredicate:predicate
  21. comparisonModifier:comparisonModifier];
  22. if (nil != newPredicate) {
  23. [predicates addObject:newPredicate];
  24. }
  25. }
  26. return [[NSCompoundPredicate alloc] initWithType:compPred.compoundPredicateType
  27. subpredicates:predicates];
  28. }
  29. if ([original isKindOfClass:NSComparisonPredicate.class]) {
  30. return comparisonModifier((NSComparisonPredicate *)original);
  31. }
  32. return original;
  33. }
  34. + (instancetype)fb_formatSearchPredicate:(NSPredicate *)input
  35. {
  36. return [self.class fb_predicateWithPredicate:input
  37. comparisonModifier:^NSPredicate *(NSComparisonPredicate *cp) {
  38. NSExpression *left = [NSExpression fb_wdExpressionWithExpression:[cp leftExpression]];
  39. NSExpression *right = [NSExpression fb_wdExpressionWithExpression:[cp rightExpression]];
  40. return [NSComparisonPredicate predicateWithLeftExpression:left
  41. rightExpression:right
  42. modifier:cp.comparisonPredicateModifier
  43. type:cp.predicateOperatorType
  44. options:cp.options];
  45. }];
  46. }
  47. + (instancetype)fb_snapshotBlockPredicateWithPredicate:(NSPredicate *)input
  48. {
  49. if ([NSStringFromClass(input.class) isEqualToString:@"NSBlockPredicate"]) {
  50. return input;
  51. }
  52. NSPredicate *wdPredicate = [self.class fb_formatSearchPredicate:input];
  53. return [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject,
  54. NSDictionary<NSString *,id> * _Nullable bindings) {
  55. @autoreleasepool {
  56. FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:evaluatedObject];
  57. return [wdPredicate evaluateWithObject:wrappedSnapshot];
  58. }
  59. }];
  60. }
  61. @end