mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-27 03:41:29 +01:00
WIP: bugfix for CustomSchemaMappingProvider relationship migration bug
This commit is contained in:
@@ -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] = []
|
|
||||||
for (_, destination) in destinationRelationships {
|
|
||||||
|
|
||||||
|
var relationshipMappings: [NSPropertyMapping] = []
|
||||||
|
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(
|
transformMappings.insert(
|
||||||
.transformEntity(
|
.transformEntity(
|
||||||
sourceEntity: sourceEntityName,
|
sourceEntity: sourceEntityName,
|
||||||
destinationEntity: destinationEntityName,
|
destinationEntity: destinationEntityName,
|
||||||
transformer: CustomMapping.inferredTransformation
|
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
|
||||||
|
allMappedDestinationKeys[destinationEntityName] = sourceEntityName
|
||||||
|
|
||||||
|
case (""?, nil):
|
||||||
|
insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName))
|
||||||
|
allMappedDestinationKeys[destinationEntityName] = ""
|
||||||
|
|
||||||
|
case (nil, ""?):
|
||||||
|
deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
|
||||||
|
allMappedSourceKeys[sourceEntityName] = ""
|
||||||
|
|
||||||
|
default:
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
for renamingIdentifier in removedRenamingIdentifiers {
|
}
|
||||||
|
for renamingIdentifier in removedRenamingIdentifiers {
|
||||||
|
|
||||||
let sourceEntity = sourceRenamingIdentifiers[renamingIdentifier]!.entity
|
let sourceEntity = sourceRenamingIdentifiers[renamingIdentifier]!.entity
|
||||||
let sourceEntityName = sourceEntity.name!
|
let sourceEntityName = sourceEntity.name!
|
||||||
switch allMappedSourceKeys[sourceEntityName] {
|
switch allMappedSourceKeys[sourceEntityName] {
|
||||||
|
|
||||||
case nil:
|
case nil:
|
||||||
deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
|
deleteMappings.insert(.deleteEntity(sourceEntity: sourceEntityName))
|
||||||
allMappedSourceKeys[sourceEntityName] = ""
|
allMappedSourceKeys[sourceEntityName] = ""
|
||||||
|
|
||||||
default:
|
default:
|
||||||
continue
|
continue
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for renamingIdentifier in addedRenamingIdentifiers {
|
}
|
||||||
|
for renamingIdentifier in addedRenamingIdentifiers {
|
||||||
|
|
||||||
let destinationEntity = destinationRenamingIdentifiers[renamingIdentifier]!.entity
|
let destinationEntity = destinationRenamingIdentifiers[renamingIdentifier]!.entity
|
||||||
let destinationEntityName = destinationEntity.name!
|
let destinationEntityName = destinationEntity.name!
|
||||||
switch allMappedDestinationKeys[destinationEntityName] {
|
switch allMappedDestinationKeys[destinationEntityName] {
|
||||||
|
|
||||||
case nil:
|
case nil:
|
||||||
insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName))
|
insertMappings.insert(.insertEntity(destinationEntity: destinationEntityName))
|
||||||
allMappedDestinationKeys[destinationEntityName] = ""
|
allMappedDestinationKeys[destinationEntityName] = ""
|
||||||
|
|
||||||
default:
|
default:
|
||||||
continue
|
continue
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (deleteMappings, insertMappings, copyMappings, transformMappings)
|
return (deleteMappings, insertMappings, copyMappings, transformMappings)
|
||||||
|
|||||||
Reference in New Issue
Block a user