Example #1
0
        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();
            }
        }