From eedfd60b41edf3648848a3d7a1f3f7e24feba7b5 Mon Sep 17 00:00:00 2001 From: Stephen Celis Date: Thu, 27 Mar 2014 13:18:50 -0700 Subject: [PATCH] Support descending/multiple string ordering E.g., // Descending [Person order:@"firstName DESC"]; // Multiple [Person order:@"lastName, firstName"]; // Multiple, descending [Person order:@"lastName DESC, firstName DESC"]; Signed-off-by: Stephen Celis --- Classes/NSManagedObject+ActiveRecord.m | 15 ++++++++++++++- .../SampleProjectTests/FindersAndCreatorsTests.m | 14 +++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Classes/NSManagedObject+ActiveRecord.m b/Classes/NSManagedObject+ActiveRecord.m index 478d5f9..f02f83e 100644 --- a/Classes/NSManagedObject+ActiveRecord.m +++ b/Classes/NSManagedObject+ActiveRecord.m @@ -261,12 +261,22 @@ + (NSSortDescriptor *)sortDescriptorFromDictionary:(NSDictionary *)dict { ascending:isAscending]; } ++ (NSSortDescriptor *)sortDescriptorFromString:(NSString *)order { + NSArray *components = [order split]; + + NSString *key = [components firstObject]; + NSString *value = [components count] > 1 ? components[1] : @"ASC"; + + return [self sortDescriptorFromDictionary:@{key: value}]; + +} + + (NSSortDescriptor *)sortDescriptorFromObject:(id)order { if ([order isKindOfClass:[NSSortDescriptor class]]) return order; if ([order isKindOfClass:[NSString class]]) - return [NSSortDescriptor sortDescriptorWithKey:order ascending:YES]; + return [self sortDescriptorFromString:order]; if ([order isKindOfClass:[NSDictionary class]]) return [self sortDescriptorFromDictionary:order]; @@ -275,6 +285,9 @@ + (NSSortDescriptor *)sortDescriptorFromObject:(id)order { } + (NSArray *)sortDescriptorsFromObject:(id)order { + if ([order isKindOfClass:[NSString class]]) + order = [order componentsSeparatedByString:@","]; + if ([order isKindOfClass:[NSArray class]]) return [order map:^id (id object) { return [self sortDescriptorFromObject:object]; diff --git a/Example/SampleProjectTests/FindersAndCreatorsTests.m b/Example/SampleProjectTests/FindersAndCreatorsTests.m index a58910a..c5a8a97 100644 --- a/Example/SampleProjectTests/FindersAndCreatorsTests.m +++ b/Example/SampleProjectTests/FindersAndCreatorsTests.m @@ -140,12 +140,24 @@ void createSomePeople(NSArray *names, NSArray *surnames, NSManagedObjectContext [NSManagedObjectContext defaultContext]); }); - it(@"orders results by a single property", ^{ + it(@"orders results by a single string property", ^{ NSArray *resultLastNames = [[Person allWithOrder:@"lastName"] map:lastNameMapper]; [[resultLastNames should] equal:@[@"Gaz", @"Mol", @"Mol", @"Zed"]]; }); + it(@"orders results by a single string property descending", ^{ + NSArray *resultFirstNames = [[Person allWithOrder:@"firstName DESC"] + map:firstNameMapper]; + [[resultFirstNames should] equal:@[@"Don", @"Cal", @"Bob", @"Abe"]]; + }); + + it(@"orders results by multiple string properties descending", ^{ + NSArray *resultFirstNames = [[Person allWithOrder:@"lastName, firstName DESC"] + map:firstNameMapper]; + [[resultFirstNames should] equal:@[@"Cal", @"Don", @"Bob", @"Abe"]]; + }); + it(@"orders results by multiple properties", ^{ NSArray *resultFirstNames = [[Person allWithOrder:@[@"lastName", @"firstName"]] map:firstNameMapper];