Adjust search indexing to use a new indexingContext

This commit is contained in:
Jeff Arena
2012-09-29 15:20:48 -04:00
parent 464767961e
commit 9cd78c2385
3 changed files with 205 additions and 22 deletions

View File

@@ -155,6 +155,40 @@
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
}
- (void)testIndexingManagedObjectUsingIndexingContext
{
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"RKHuman"];
[RKSearchIndexer addSearchIndexingToEntity:entity onAttributes:@[ @"name", @"nickName" ]];
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
NSError *error;
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
NSManagedObjectContext *indexingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[indexingContext setPersistentStoreCoordinator:persistentStoreCoordinator];
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:indexingContext queue:nil usingBlock:^(NSNotification *notification) {
[managedObjectContext performBlock:^{
[managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}];
}];
RKSearchIndexer *indexer = [RKSearchIndexer new];
indexer.stopWords = [NSSet setWithObject:@"is"];
indexer.indexingContext = indexingContext;
NSManagedObject *human = [NSEntityDescription insertNewObjectForEntityForName:@"RKHuman" inManagedObjectContext:managedObjectContext];
[human setValue:@"This is my name" forKey:@"name"];
NSUInteger count = [indexer indexManagedObject:human];
assertThatInteger(count, is(equalToInteger(3)));
NSSet *searchWords = [human valueForKey:RKSearchWordsRelationshipName];
assertThat([searchWords valueForKey:@"word"],
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
}
- (void)testIndexingOnManagedObjectContextSave
{
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
@@ -183,6 +217,51 @@
[indexer stopObservingManagedObjectContext:managedObjectContext];
}
- (void)testIndexingOnManagedObjectContextSaveUsingIndexingContext
{
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"RKHuman"];
[RKSearchIndexer addSearchIndexingToEntity:entity onAttributes:@[ @"name", @"nickName" ]];
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
NSError *error;
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
NSManagedObjectContext *indexingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[indexingContext setPersistentStoreCoordinator:persistentStoreCoordinator];
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:indexingContext queue:nil usingBlock:^(NSNotification *notification) {
[managedObjectContext performBlock:^{
[managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}];
}];
RKSearchIndexer *indexer = [RKSearchIndexer new];
indexer.stopWords = [NSSet setWithObject:@"is"];
indexer.indexingContext = indexingContext;
NSManagedObject *human = [NSEntityDescription insertNewObjectForEntityForName:@"RKHuman" inManagedObjectContext:managedObjectContext];
[human setValue:@"This is my name" forKey:@"name"];
// Index on save
[indexer startObservingManagedObjectContext:managedObjectContext];
[managedObjectContext save:&error];
// Spin the run loop to allow the did save notifications to propogate
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
[managedObjectContext refreshObject:human mergeChanges:YES];
NSManagedObjectID *objectID = [human objectID];
[managedObjectContext reset];
human = [managedObjectContext existingObjectWithID:objectID error:nil];
NSSet *searchWords = [human valueForKey:RKSearchWordsRelationshipName];
assertThat([searchWords valueForKey:@"word"],
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
[indexer stopObservingManagedObjectContext:managedObjectContext];
}
- (void)testIndexingChangesInManagedObjectContextWithoutSave
{
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
@@ -209,4 +288,39 @@
}
- (void)testIndexingChangesInManagedObjectContextWithoutSaveUsingIndexingContext
{
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"RKHuman"];
[RKSearchIndexer addSearchIndexingToEntity:entity onAttributes:@[ @"name", @"nickName" ]];
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
NSError *error;
[persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&error];
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator;
NSManagedObjectContext *indexingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[indexingContext setPersistentStoreCoordinator:persistentStoreCoordinator];
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:indexingContext queue:nil usingBlock:^(NSNotification *notification) {
[managedObjectContext performBlock:^{
[managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}];
}];
RKSearchIndexer *indexer = [RKSearchIndexer new];
indexer.stopWords = [NSSet setWithObject:@"is"];
indexer.indexingContext = indexingContext;
NSManagedObject *human = [NSEntityDescription insertNewObjectForEntityForName:@"RKHuman" inManagedObjectContext:managedObjectContext];
[human setValue:@"This is my name" forKey:@"name"];
// Index the current changes
[indexer indexChangedObjectsInManagedObjectContext:managedObjectContext];
NSSet *searchWords = [human valueForKey:RKSearchWordsRelationshipName];
assertThat([searchWords valueForKey:@"word"],
is(equalTo([NSSet setWithArray:@[ @"this", @"my", @"name" ]])));
}
@end