void ImportMembers(InputObjectClassInfo inputObjectClassInfo, ICollection objectsToImport, List <object> keysToImport, UnitOfWork outputUow, List <InputMemberInfo> inputMemberInfos, UnitOfWork inputUow) { int keysCounter = 0; var objectDictionary = GetObjectDictionary(inputObjectClassInfo.OutputClassInfo.ClassType); foreach (var objectToImport in objectsToImport) { object objectKey = keysToImport[keysCounter++]; if (objectDictionary.ContainsKey(objectKey)) { continue; } var xpoObject = CreateInstance(inputObjectClassInfo.OutputClassInfo.ClassType, outputUow); AddObjectToCache(objectDictionary, objectKey, xpoObject); foreach (var inputMemberInfo in inputMemberInfos) { var importedMemberInfo = new ImportedMemberInfo(inputObjectClassInfo, inputMemberInfo); if (inputMemberInfo.IsAssociationList) { ImportManyToManyCollection(outputUow, inputUow, xpoObject, importedMemberInfo, objectToImport, inputMemberInfo); } else { ImportSimpleProperty(outputUow, inputUow, inputMemberInfo, importedMemberInfo, objectToImport, xpoObject); } } } }
public void Map(XPDictionary outputDictionary, XPDictionary inputDictionary) { _outputClassInfos = outputDictionary.Classes.OfType <XPClassInfo>().Where(info => info.HasAttribute(typeof(InitialDataAttribute))).ToList(); foreach (var classInfo in _outputClassInfos) { var initialDataAttribute = (InitialDataAttribute)classInfo.FindAttributeInfo(typeof(InitialDataAttribute)); var objectClassInfo = new InputObjectClassInfo(inputDictionary, initialDataAttribute.Name ?? classInfo.ClassType.Name, classInfo); _inputClassInfos.Add(objectClassInfo); MapManyToMany(outputDictionary, inputDictionary, classInfo); } }
public void Map(XPDictionary outputDictionary, XPDictionary inputDictionary) { _outputClassInfos = outputDictionary.Classes.OfType<XPClassInfo>().Where(info => info.HasAttribute(typeof(InitialDataAttribute))).ToList(); foreach (var classInfo in _outputClassInfos) { var initialDataAttribute = (InitialDataAttribute)classInfo.FindAttributeInfo(typeof(InitialDataAttribute)); var objectClassInfo = new InputObjectClassInfo(inputDictionary, initialDataAttribute.Name ?? classInfo.ClassType.Name, classInfo); _inputClassInfos.Add(objectClassInfo); MapManyToMany(outputDictionary, inputDictionary, classInfo); } }
DBTable GetTable(InputObjectClassInfo classInfo) { return _dbTables.SingleOrDefault(table => table.Name == classInfo.TableName); }
void ImportMembers(InputObjectClassInfo inputObjectClassInfo, ICollection objectsToImport, List<object> keysToImport, UnitOfWork outputUow, List<InputMemberInfo> inputMemberInfos, UnitOfWork inputUow) { int keysCounter = 0; var objectDictionary = GetObjectDictionary(inputObjectClassInfo.OutputClassInfo.ClassType); foreach (var objectToImport in objectsToImport) { object objectKey = keysToImport[keysCounter++]; if (objectDictionary.ContainsKey(objectKey)) continue; var xpoObject = CreateInstance(inputObjectClassInfo.OutputClassInfo.ClassType, outputUow); AddObjectToCache(objectDictionary, objectKey, xpoObject); foreach (var inputMemberInfo in inputMemberInfos) { var importedMemberInfo = new ImportedMemberInfo(inputObjectClassInfo, inputMemberInfo); if (inputMemberInfo.IsAssociationList) { ImportManyToManyCollection(outputUow, inputUow, xpoObject, importedMemberInfo, objectToImport, inputMemberInfo); } else { ImportSimpleProperty(outputUow, inputUow, inputMemberInfo, importedMemberInfo, objectToImport, xpoObject); } } } }
void ImportCore(Func<UnitOfWork> createOutputUow, Func<UnitOfWork> createInputUow, InputObjectClassInfo inputObjectClassInfo) { UnitOfWork inputUow = createInputUow(); UnitOfWork outputUow = createOutputUow(); try { List<InputMemberInfo> inputMemberInfos = MemberMapper.MemberInfos(inputObjectClassInfo).OfType<InputMemberInfo>().ToList(); var keys = InputObjectKeys(inputObjectClassInfo, inputUow); int position = 0; int commitAccumulator = 0; int length = keys.Count; while (position < length) { int chunkSize = XpoDefault.GetTerminalInSize(length - position); var keysToImport = keys.GetRange(position, chunkSize); var objectsToImport = inputUow.GetObjectsByKey(inputObjectClassInfo, keysToImport, false); position += chunkSize; commitAccumulator += chunkSize; PrefetchDelayedMembers(inputMemberInfos, inputUow, objectsToImport); ImportMembers(inputObjectClassInfo, objectsToImport, keysToImport, outputUow, inputMemberInfos, inputUow); do { var refsAndImports = RefsAndImports(outputUow); foreach (KeyValuePair<InputMemberInfo, FillRefList> pair in refsAndImports) { XPMemberInfo memberInfo = pair.Key.OutputMemberInfo; FillRefList fillRefsList = pair.Value; XPClassInfo classInfo = memberInfo.IsAssociationList ? memberInfo.CollectionElementType : memberInfo.ReferenceType; var memberList = MemberMapper.MemberInfos(pair.Key.ReferenceType).OfType<InputMemberInfo>().ToList(); var importClassInfo = pair.Key.ReferenceType; var objects = inputUow.GetObjectsByKey(importClassInfo, fillRefsList.RefKeyList, false); PrefetchDelayedMembers(inputMemberInfos, inputUow, objects); ImportRefs(classInfo, objects, fillRefsList, outputUow, inputUow, memberList, memberInfo); } } while (_fillRefsDictionary.Count > 0 || _fillRefsAndImportDictionary.Count > 0); if (commitAccumulator > 400) { outputUow.CommitChanges(); GenerationNext(outputUow); var ou = outputUow; var iu = inputUow; outputUow = createOutputUow(); inputUow = createInputUow(); ou.Dispose(); iu.Dispose(); commitAccumulator = 0; OnTransformingRecords(new TransformingRecordsArgs(inputObjectClassInfo.FullName, position)); } } } catch (Exception e) { Debug.Assert(false); Debug.Print(e.ToString()); } finally { OnTransformingRecords(new TransformingRecordsArgs(inputObjectClassInfo.FullName)); outputUow.CommitChanges(); GenerationNext(outputUow); outputUow.Dispose(); inputUow.Dispose(); } }
DBTable GetTable(InputObjectClassInfo classInfo) { return(_dbTables.SingleOrDefault(table => table.Name == classInfo.TableName)); }
void ImportCore(Func <UnitOfWork> createOutputUow, Func <UnitOfWork> createInputUow, InputObjectClassInfo inputObjectClassInfo) { UnitOfWork inputUow = createInputUow(); UnitOfWork outputUow = createOutputUow(); try { var inputMemberInfos = MemberMapper.MemberInfos(inputObjectClassInfo).OfType <InputMemberInfo>().ToList(); var keys = InputObjectKeys(inputObjectClassInfo, inputUow); int position = 0; int commitAccumulator = 0; int length = keys.Count; while (position < length) { int chunkSize = XpoDefault.GetTerminalInSize(length - position); var keysToImport = keys.GetRange(position, chunkSize); var objectsToImport = inputUow.GetObjectsByKey(inputObjectClassInfo, keysToImport, false); position += chunkSize; commitAccumulator += chunkSize; PrefetchDelayedMembers(inputMemberInfos, inputUow, objectsToImport); ImportMembers(inputObjectClassInfo, objectsToImport, keysToImport, outputUow, inputMemberInfos, inputUow); do { var refsAndImports = RefsAndImports(outputUow); foreach (KeyValuePair <InputMemberInfo, FillRefList> pair in refsAndImports) { var memberInfo = pair.Key.OutputMemberInfo; var fillRefsList = pair.Value; var classInfo = memberInfo.IsAssociationList? memberInfo.CollectionElementType: memberInfo.ReferenceType; var memberList = MemberMapper.MemberInfos(pair.Key.ReferenceType).OfType <InputMemberInfo>().ToList(); var importClassInfo = pair.Key.ReferenceType; var objects = inputUow.GetObjectsByKey(importClassInfo, fillRefsList.RefKeyList, false); PrefetchDelayedMembers(inputMemberInfos, inputUow, objects); ImportRefs(classInfo, objects, fillRefsList, outputUow, inputUow, memberList, memberInfo); } } while (_fillRefsDictionary.Count > 0 || _fillRefsAndImportDictionary.Count > 0); if (commitAccumulator > 400) { outputUow.CommitChanges(); GenerationNext(outputUow); var ou = outputUow; var iu = inputUow; outputUow = createOutputUow(); inputUow = createInputUow(); ou.Dispose(); iu.Dispose(); commitAccumulator = 0; OnTransformingRecords(new TransformingRecordsArgs(inputObjectClassInfo.FullName, inputObjectClassInfo.OutputClassInfo.FullName, position)); } } } finally { outputUow.CommitChanges(); OnTransformRecords(new TransformRecordsArgs(inputObjectClassInfo.FullName, inputObjectClassInfo.OutputClassInfo.FullName)); GenerationNext(outputUow); outputUow.Dispose(); inputUow.Dispose(); } }