Skip to content

Commit

Permalink
Merge pull request #485 from Tundaware/setSorting
Browse files Browse the repository at this point in the history
Support for updating an AutoView's sorting block without updating it's grouping block
  • Loading branch information
robbiehanson committed Feb 7, 2019
2 parents 493981e + f6d655c commit 6de0a47
Show file tree
Hide file tree
Showing 5 changed files with 315 additions and 20 deletions.
124 changes: 124 additions & 0 deletions Testing/UnitTesting/TestYapDatabaseView.m
Original file line number Diff line number Diff line change
Expand Up @@ -2844,6 +2844,25 @@ - (void)testChangeBlocks_nonPersistent
[self _testChangeBlocks_withPath:databasePath options:options];
}

- (void)testChangeSortBlock_persistent
{
NSString *databasePath = [self databasePath:NSStringFromSelector(_cmd)];

YapDatabaseViewOptions *options = [[YapDatabaseViewOptions alloc] init];
options.isPersistent = YES;

[self _testChangeSortBlock_withPath:databasePath options:options];
}
- (void)testChangeSortBlock_nonPersistent
{
NSString *databasePath = [self databasePath:NSStringFromSelector(_cmd)];

YapDatabaseViewOptions *options = [[YapDatabaseViewOptions alloc] init];
options.isPersistent = NO;

[self _testChangeSortBlock_withPath:databasePath options:options];
}

- (void)_testChangeBlocks_withPath:(NSString *)databasePath options:(YapDatabaseViewOptions *)options
{
[[NSFileManager defaultManager] removeItemAtPath:databasePath error:NULL];
Expand Down Expand Up @@ -2950,6 +2969,111 @@ - (void)_testChangeBlocks_withPath:(NSString *)databasePath options:(YapDatabase
XCTAssertTrue([rowChanges count] == 10, @"Bad count");
}

- (void)_testChangeSortBlock_withPath:(NSString *)databasePath options:(YapDatabaseViewOptions *)options
{
[[NSFileManager defaultManager] removeItemAtPath:databasePath error:NULL];
YapDatabase *database = [[YapDatabase alloc] initWithPath:databasePath];

XCTAssertNotNil(database, @"Oops");

YapDatabaseConnection *connection1 = [database newConnection];
YapDatabaseConnection *connection2 = [database newConnection];

YapDatabaseViewGrouping *grouping = [YapDatabaseViewGrouping withObjectBlock:
^NSString *(YapDatabaseReadTransaction *transaction, NSString *collection, NSString *key, id obj)
{
__unsafe_unretained NSNumber *number = (NSNumber *)obj;

if ([number intValue] % 2 == 0)
return @"";
else
return nil;
}];

YapDatabaseViewSorting *sorting = [YapDatabaseViewSorting withObjectBlock:
^(YapDatabaseReadTransaction *transaction, NSString *group,
NSString *collection1, NSString *key1, id obj1,
NSString *collection2, NSString *key2, id obj2)
{
__unsafe_unretained NSNumber *number1 = (NSNumber *)obj1;
__unsafe_unretained NSNumber *number2 = (NSNumber *)obj2;

return [number1 compare:number2];
}];

YapDatabaseAutoView *databaseView =
[[YapDatabaseAutoView alloc] initWithGrouping:grouping
sorting:sorting
versionTag:@"1"
options:options];

BOOL registerResult = [database registerExtension:databaseView withName:@"order"];

XCTAssertTrue(registerResult, @"Failure registering extension");

// Add a bunch of values to the database & to the view

NSUInteger count = 10;

[connection1 readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {

for (int i = 0; i < count; i++)
{
NSString *key = [NSString stringWithFormat:@"key-%d", i];
NSNumber *num = [NSNumber numberWithInt:i];

[transaction setObject:num forKey:key inCollection:nil];
}
}];

// Make sure the view is populated

[connection1 readWithBlock:^(YapDatabaseReadTransaction *transaction) {

XCTAssertTrue([[transaction ext:@"order"] numberOfItemsInGroup:@""] == 5, @"View count is wrong");
}];

// Now change the groupingBlock

YapDatabaseViewMappings *mappings = [YapDatabaseViewMappings mappingsWithGroups:@[ @"" ] view:@"order"];

[connection2 beginLongLivedReadTransaction];
[connection2 readWithBlock:^(YapDatabaseReadTransaction *transaction) {

[mappings updateWithTransaction:transaction];
}];

YapDatabaseViewSorting *newSorting = [YapDatabaseViewSorting withObjectBlock:
^(YapDatabaseReadTransaction *transaction, NSString *group,
NSString *collection1, NSString *key1, id obj1,
NSString *collection2, NSString *key2, id obj2)
{
__unsafe_unretained NSNumber *number1 = (NSNumber *)obj1;
__unsafe_unretained NSNumber *number2 = (NSNumber *)obj2;

return [number2 compare:number1];
}];

[connection1 readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {

[[transaction ext:@"order"] setSorting:newSorting
versionTag:@"2"];
}];

NSArray *notifications =[connection2 beginLongLivedReadTransaction];

NSArray *sectionChanges = nil;
NSArray *rowChanges = nil;

[[connection2 ext:@"order"] getSectionChanges:&sectionChanges
rowChanges:&rowChanges
forNotifications:notifications
withMappings:mappings];

XCTAssertTrue([sectionChanges count] == 0, @"Bad count");
XCTAssertTrue([rowChanges count] == 5, @"Bad count");
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma mark -
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@
sorting:(YapDatabaseViewSorting *)newSorting
versionTag:(NSString *)newVersionTag;

- (void)setSorting:(YapDatabaseViewSorting *)newSorting
versionTag:(NSString *)newVersionTag;

@end

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down
10 changes: 10 additions & 0 deletions YapDatabase/Extensions/AutoView/YapDatabaseAutoViewConnection.m
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,16 @@ - (void)setGrouping:(YapDatabaseViewGrouping *)newGrouping
versionTagChanged = YES;
}

- (void)setSorting:(YapDatabaseViewSorting *)newSorting
versionTag:(NSString *)newVersionTag
{
sorting = newSorting;
sortingChanged = YES;

versionTag = newVersionTag;
versionTagChanged = YES;
}

- (void)getGrouping:(YapDatabaseViewGrouping **)groupingPtr
sorting:(YapDatabaseViewSorting **)sortingPtr
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,15 @@ NS_ASSUME_NONNULL_BEGIN
sorting:(YapDatabaseViewSorting *)sorting
versionTag:(nullable NSString *)versionTag;

/**
* This method allows you to change the sorting on-the-fly.
*
* Note: You must pass a different versionTag, or this method does nothing.
* If needed, you can fetch the current versionTag via the [viewTransaction versionTag] method.
**/
- (void)setSorting:(YapDatabaseViewSorting *)sorting
versionTag:(nullable NSString *)versionTag;

@end

NS_ASSUME_NONNULL_END
Loading

0 comments on commit 6de0a47

Please sign in to comment.