Skip to content
This repository has been archived by the owner on Sep 12, 2018. It is now read-only.

Commit

Permalink
Support descending/multiple string ordering
Browse files Browse the repository at this point in the history
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 <stephen@stephencelis.com>
  • Loading branch information
stephencelis committed Mar 28, 2014
1 parent 535c7c4 commit eedfd60
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
15 changes: 14 additions & 1 deletion Classes/NSManagedObject+ActiveRecord.m
Expand Up @@ -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];
Expand All @@ -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];
Expand Down
14 changes: 13 additions & 1 deletion Example/SampleProjectTests/FindersAndCreatorsTests.m
Expand Up @@ -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];
Expand Down

0 comments on commit eedfd60

Please sign in to comment.