public void Load(folderNode folder, String filenamePrefix = "datapoints")
        {
            var bl = folder.findFiles(filenamePrefix + "*.xml", System.IO.SearchOption.TopDirectoryOnly);

            foreach (var block in bl)
            {
                var b = DataPointMapBlock.Load(block);
                MapBlocks.Add(b);
            }
        }
        /// <summary>
        /// Gets the data point pairs: Junction method
        /// </summary>
        /// <param name="input">The input.</param>
        /// <param name="ChildrenCountTrigger">The children count trigger.</param>
        /// <returns></returns>
        public DataPointMapperResult GetDataPointPairs(LeafNodeDictionaryAnalysis input)
        {
            List <DataPointMapEntry> dpList = new List <DataPointMapEntry>();

            var allLeafs = input.CompleteGraph.getAllLeafs();


            List <String> dpRoots = new List <string>();

            foreach (graphWrapNode <LeafNodeDictionaryEntry> g in allLeafs)
            {
                var inputLeaf = input.Nodes.GetEntry(g.path);

                if (g.parent != null)
                {
                    if (inputLeaf.Category.HasFlag(NodeInTemplateRole.Dynamic))
                    {
                        graphWrapNode <LeafNodeDictionaryEntry> head = g;

                        Int32 pC = head.Count();

                        while (pC < ChildrenCountTrigger)
                        {
                            if (head.parent != null)
                            {
                                head = head.parent as graphWrapNode <LeafNodeDictionaryEntry>;
                                if (head == null)
                                {
                                    break;
                                }
                                else
                                {
                                    pC = head.parent.Count();
                                }
                            }
                        }
                        if (head != null)
                        {
                            if (head.path.isNullOrEmpty())
                            {
                                if (!dpRoots.Contains(head.path))
                                {
                                    dpRoots.Add(head.path);
                                }
                            }
                        }
                    }
                    else
                    {
                    }
                }
            }



            foreach (String root in dpRoots)
            {
                var dpItems = input.Nodes.items.Where(x => x.XPath.StartsWith(root)).ToList();

                List <DataPointMapEntry> dp_tmp = MergeEntriesToDataPoints(dpItems, input);

                if (dp_tmp.Count > 1 && flags.HasFlag(DataPointMapBlockDetectionFlags.AllowMultiColumnDataPoints))
                {
                    DataPointMapEntry parent_dp = new DataPointMapEntry()
                    {
                        DataPointXPathRoot = root,
                        LabelXPathRelative = "",
                        DataXPathRelative  = "",
                        Properties         = dp_tmp
                    };
                    foreach (var d in dp_tmp)
                    {
                        d.DataPointXPathRoot = "";
                    }

                    dpList.Add(parent_dp);
                }
                else
                {
                    dpList.AddRange(dp_tmp);
                }
            }



            List <graphWrapNode <LeafNodeDictionaryEntry> > dpRootGraphNodes = new List <graphWrapNode <LeafNodeDictionaryEntry> >();

            foreach (String root in dpRoots)
            {
                var cp = input.CompleteGraph.GetChildAtPath(root);
                if (cp != null)
                {
                    dpRootGraphNodes.AddUnique(cp);
                }
            }

            DataPointMapperResult output = new DataPointMapperResult();


            List <String> BlockRoots = new List <string>();

            foreach (graphWrapNode <LeafNodeDictionaryEntry> g in dpRootGraphNodes)
            {
                if (g.parent != null)
                {
                    graphWrapNode <LeafNodeDictionaryEntry> head = g;

                    Int32 pC = head.Count();

                    while (pC < JunctionSizeMin)
                    {
                        if (head.level > 1)
                        {
                            head = head.parent as graphWrapNode <LeafNodeDictionaryEntry>;
                            if (head.parent == null)
                            {
                                break;
                            }
                            pC = head.parent.Count();
                        }
                    }

                    if (head != null)
                    {
                        if (!head.path.isNullOrEmpty())
                        {
                            if (!BlockRoots.Contains(head.path))
                            {
                                BlockRoots.Add(head.path);
                            }
                        }
                    }
                }
            }


            if (!BlockRoots.Any())
            {
                return(output);
            }

            if (flags.HasFlag(DataPointMapBlockDetectionFlags.maximizeBlockSize))
            {
                BlockRoots = BlockRoots.OrderBy(x => x.Length).ToList();
            }
            else if (flags.HasFlag(DataPointMapBlockDetectionFlags.maximizeDataRelatness))
            {
                BlockRoots = BlockRoots.OrderByDescending(x => x.Length).ToList();
            }



            foreach (String blockRoot in BlockRoots)
            {
                var b = new DataPointMapBlock(blockRoot);

                var dpl = dpList.ToList().Where(x => x.DataPointXPathRoot.StartsWith(blockRoot));

                foreach (DataPointMapEntry e in dpl)
                {
                    dpList.Remove(e);
                    b.DataPoints.Add(e);
                }
                if (b.DataPoints.Count > 0)
                {
                    output.MapBlocks.Add(b);
                }
            }

            //if (flags.HasFlag(DataPointMapBlockDetectionFlags.BreakByDimensions))
            //{
            //    BreakBlocksByRecordDimensions(output.MapBlocks);

            //}

            return(output);
        }