WIP: bugfix for CustomSchemaMappingProvider relationship migration bug

This commit is contained in:
John Rommel Estropia
2017-06-06 08:39:59 +09:00
parent 0304067beb
commit 0354401b56

View File

@@ -435,14 +435,16 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
let entityMappingName = entityMapping.name! let entityMappingName = entityMapping.name!
entityMapping.relationshipMappings = autoreleasepool { () -> [NSPropertyMapping] in entityMapping.relationshipMappings = autoreleasepool { () -> [NSPropertyMapping] in
let sourceRelationships = sourceEntity.cs_resolvedRelationshipRenamingIdentities()
let destinationRelationships = destinationEntity.cs_resolvedRelationshipRenamingIdentities() let destinationRelationships = destinationEntity.cs_resolvedRelationshipRenamingIdentities()
var relationshipMappings: [NSPropertyMapping] = [] var relationshipMappings: [NSPropertyMapping] = []
for (_, destination) in destinationRelationships { for (renamingIdentifier, destination) in destinationRelationships {
let sourceRelationship = sourceRelationships[renamingIdentifier]!.relationship
let destinationRelationship = destination.relationship let destinationRelationship = destination.relationship
let propertyMapping = NSPropertyMapping() let propertyMapping = NSPropertyMapping()
propertyMapping.name = destinationRelationship.name propertyMapping.name = destinationRelationship.name
propertyMapping.valueExpression = NSExpression(format: "FUNCTION($\(NSMigrationManagerKey), \"\(#selector(NSMigrationManager.destinationInstances(forEntityMappingName:sourceInstances:)))\" , \"\(entityMappingName)\", $\(NSMigrationSourceObjectKey))[0]") propertyMapping.valueExpression = NSExpression(format: "FUNCTION($\(NSMigrationManagerKey), \"\(#selector(NSMigrationManager.destinationInstances(forEntityMappingName:sourceInstances:)))\", \"\(entityMappingName)\", $\(NSMigrationSourceObjectKey).\(sourceRelationship.name))")
relationshipMappings.append(propertyMapping) relationshipMappings.append(propertyMapping)
} }
return relationshipMappings return relationshipMappings
@@ -486,14 +488,20 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
let entityMappingName = entityMapping.name! let entityMappingName = entityMapping.name!
entityMapping.relationshipMappings = autoreleasepool { () -> [NSPropertyMapping] in entityMapping.relationshipMappings = autoreleasepool { () -> [NSPropertyMapping] in
let sourceRelationships = sourceEntity.cs_resolvedRelationshipRenamingIdentities()
let destinationRelationships = destinationEntity.cs_resolvedRelationshipRenamingIdentities() let destinationRelationships = destinationEntity.cs_resolvedRelationshipRenamingIdentities()
var relationshipMappings: [NSPropertyMapping] = [] var relationshipMappings: [NSPropertyMapping] = []
for (_, destination) in destinationRelationships { for (renamingIdentifier, destination) in destinationRelationships {
guard let sourceRelationship = sourceRelationships[renamingIdentifier]?.relationship else {
continue
}
let destinationRelationship = destination.relationship let destinationRelationship = destination.relationship
let propertyMapping = NSPropertyMapping() let propertyMapping = NSPropertyMapping()
propertyMapping.name = destinationRelationship.name propertyMapping.name = destinationRelationship.name
propertyMapping.valueExpression = NSExpression(format: "FUNCTION($\(NSMigrationManagerKey), \"\(#selector(NSMigrationManager.destinationInstances(forEntityMappingName:sourceInstances:)))\" , \"\(entityMappingName)\", $\(NSMigrationSourceObjectKey))[0]") propertyMapping.valueExpression = NSExpression(format: "FUNCTION($\(NSMigrationManagerKey), \"\(#selector(NSMigrationManager.destinationInstances(forEntityMappingName:sourceInstances:)))\", \"\(entityMappingName)\", $\(NSMigrationSourceObjectKey).\(sourceRelationship.name))")
relationshipMappings.append(propertyMapping) relationshipMappings.append(propertyMapping)
} }
return relationshipMappings return relationshipMappings
@@ -670,77 +678,76 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
allMappedSourceKeys[sourceEntity] = destinationEntity allMappedSourceKeys[sourceEntity] = destinationEntity
allMappedDestinationKeys[destinationEntity] = sourceEntity allMappedDestinationKeys[destinationEntity] = sourceEntity
} }
}
for renamingIdentifier in transformedRenamingIdentifiers {
for renamingIdentifier in transformedRenamingIdentifiers { let sourceEntity = sourceRenamingIdentifiers[renamingIdentifier]!.entity
let destinationEntity = destinationRenamingIdentifiers[renamingIdentifier]!.entity
let sourceEntityName = sourceEntity.name!
let destinationEntityName = destinationEntity.name!
switch (allMappedSourceKeys[sourceEntityName], allMappedDestinationKeys[destinationEntityName]) {
let sourceEntity = sourceRenamingIdentifiers[renamingIdentifier]!.entity case (nil, nil):
let destinationEntity = destinationRenamingIdentifiers[renamingIdentifier]!.entity if sourceEntity.versionHash == destinationEntity.versionHash {
let sourceEntityName = sourceEntity.name!
let destinationEntityName = destinationEntity.name!
switch (allMappedSourceKeys[sourceEntityName], allMappedDestinationKeys[destinationEntityName]) {
case (nil, nil): copyMappings.insert(
if sourceEntity.versionHash == destinationEntity.versionHash { .copyEntity(
sourceEntity: sourceEntityName,
copyMappings.insert( destinationEntity: destinationEntityName
.copyEntity(
sourceEntity: sourceEntityName,
destinationEntity: destinationEntityName
)
) )
} )
else { }
else {
transformMappings.insert(
.transformEntity( transformMappings.insert(
sourceEntity: sourceEntityName, .transformEntity(
destinationEntity: destinationEntityName, sourceEntity: sourceEntityName,
transformer: CustomMapping.inferredTransformation destinationEntity: destinationEntityName,
) transformer: CustomMapping.inferredTransformation
) )
} )
allMappedSourceKeys[sourceEntityName] = destinationEntityName
allMappedDestinationKeys[destinationEntityName] = sourceEntityName
case (""?, nil):
insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName))
allMappedDestinationKeys[destinationEntityName] = ""
case (nil, ""?):
deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
allMappedSourceKeys[sourceEntityName] = ""
default:
continue
} }
} allMappedSourceKeys[sourceEntityName] = destinationEntityName
for renamingIdentifier in removedRenamingIdentifiers { allMappedDestinationKeys[destinationEntityName] = sourceEntityName
let sourceEntity = sourceRenamingIdentifiers[renamingIdentifier]!.entity case (""?, nil):
let sourceEntityName = sourceEntity.name! insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName))
switch allMappedSourceKeys[sourceEntityName] { allMappedDestinationKeys[destinationEntityName] = ""
case nil:
deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
allMappedSourceKeys[sourceEntityName] = ""
default:
continue
}
}
for renamingIdentifier in addedRenamingIdentifiers {
let destinationEntity = destinationRenamingIdentifiers[renamingIdentifier]!.entity case (nil, ""?):
let destinationEntityName = destinationEntity.name! deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
switch allMappedDestinationKeys[destinationEntityName] { allMappedSourceKeys[sourceEntityName] = ""
case nil: default:
insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName)) continue
allMappedDestinationKeys[destinationEntityName] = "" }
}
default: for renamingIdentifier in removedRenamingIdentifiers {
continue
} let sourceEntity = sourceRenamingIdentifiers[renamingIdentifier]!.entity
let sourceEntityName = sourceEntity.name!
switch allMappedSourceKeys[sourceEntityName] {
case nil:
deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
allMappedSourceKeys[sourceEntityName] = ""
default:
continue
}
}
for renamingIdentifier in addedRenamingIdentifiers {
let destinationEntity = destinationRenamingIdentifiers[renamingIdentifier]!.entity
let destinationEntityName = destinationEntity.name!
switch allMappedDestinationKeys[destinationEntityName] {
case nil:
insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName))
allMappedDestinationKeys[destinationEntityName] = ""
default:
continue
} }
} }
return (deleteMappings, insertMappings, copyMappings, transformMappings) return (deleteMappings, insertMappings, copyMappings, transformMappings)