Exemple #1
0
        IndexedPathSegmentTreeNode <string> CreatePathSegmentIndexedPathSegmentTreeNode(
            XmlPathSegment pathSegment, IPathSegment parentPathSegment, IndexedPathSegmentTreeNode <string> parentNode)
        {
            var newIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (parentNode.CurrentValue is XDocument)
                {
                    var document = parentNode.CurrentValue as XDocument;
                    newIndexedValueTreeNode.CurrentValue = document.Root;
                }
                else
                {
                    XElementSegment(pathSegment, parentPathSegment, parentNode, newIndexedValueTreeNode);
                }
            }

            return(newIndexedValueTreeNode);
        }
Exemple #2
0
        protected override IndexedPathSegmentTreeNode <string> CreatePathSegmentIndexedPathSegmentTreeNode(
            IPathSegment pathSegment, IndexedPathSegmentTreeNode <string> parentNode)
        {
            var newIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (pathSegment.IsEnumarable)
                {
                    newIndexedValueTreeNode = IndexedEnumarablePathSegmentTreeNode(newIndexedValueTreeNode, pathSegment, parentNode);
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = GetScalarValueForPathSegement(pathSegment,
                                                                                         parentNode.CurrentValue);

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
            }

            return(newIndexedValueTreeNode);
        }
Exemple #3
0
        static void ActualXElementSegment(XmlPathSegment pathSegment, IndexedPathSegmentTreeNode <string> newIndexedValueTreeNode, XElement parentCurentElement)
        {
            var childElements =
                parentCurentElement.Elements(pathSegment.ActualSegment).ToList();

            newIndexedValueTreeNode.EnumerableValue = childElements;

            if (childElements.Count == 0)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                newIndexedValueTreeNode.Enumerator =
                    newIndexedValueTreeNode.EnumerableValue.GetEnumerator();

                newIndexedValueTreeNode.Enumerator.Reset();

                if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                {
                    newIndexedValueTreeNode.CurrentValue        = string.Empty;
                    newIndexedValueTreeNode.EnumerationComplete = true;
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                }
            }
        }
Exemple #4
0
        IndexedPathSegmentTreeNode <string> IndexedEnumarablePathSegmentTreeNode(IndexedPathSegmentTreeNode <string> newIndexedValueTreeNode, IPathSegment pathSegment, IndexedPathSegmentTreeNode <string> parentNode)
        {
            newIndexedValueTreeNode.EnumerableValue = GetEnumerableValueForPathSegment(pathSegment,
                                                                                       parentNode.CurrentValue);

            if (newIndexedValueTreeNode.EnumerableValue == null)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();

                newIndexedValueTreeNode.Enumerator.Reset();

                if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                {
                    newIndexedValueTreeNode.CurrentValue        = string.Empty;
                    newIndexedValueTreeNode.EnumerationComplete = true;
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                }
            }
            return(newIndexedValueTreeNode);
        }
Exemple #5
0
        protected override void WriteToResults(IList <IPath> paths, Dictionary <IPath, List <IPathSegment> > indexedPathSegments, IndexedPathSegmentTreeNode <string> rootIndexedValueTreeNode, Dictionary <IPath, IList <object> > results)
        {
            foreach (IPath path in paths)
            {
                List <IPathSegment> list = indexedPathSegments[path];

                IndexedPathSegmentTreeNode <string> IndexedPathSegmentTreeNode = rootIndexedValueTreeNode[list.Select(p => p.ActualSegment).ToList()];

                XElement element = IndexedPathSegmentTreeNode.CurrentValue as XElement;
                if (element != null)
                {
                    results[path].Add(element.Value);
                }
                else
                {
                    XAttribute value = IndexedPathSegmentTreeNode.CurrentValue as XAttribute;
                    if (value != null)
                    {
                        results[path].Add(value.Value);
                    }
                    else
                    {
                        results[path].Add(IndexedPathSegmentTreeNode.CurrentValue.ToString());
                    }
                }
            }
        }
        protected long EnumerateIndexedTree(IndexedPathSegmentTreeNode <string> node)
        {
            long enumerationCount = 0;

            foreach (var childNode in node.Values)
            {
                enumerationCount += EnumerateIndexedTree(childNode);
            }

            if (node.Enumerator != null && enumerationCount == 0)
            {
                node.EnumerationComplete = !node.Enumerator.MoveNext();
                if (node.EnumerationComplete)
                {
                    node.CurrentValue = string.Empty;
                }
                else
                {
                    node.CurrentValue = node.Enumerator.Current;
                    enumerationCount++;
                }

                node.Clear();
            }

            return(enumerationCount);
        }
        protected virtual void BuildIndexedTree(IList <IPath> paths,
                                                Dictionary <IPath, List <IPathSegment> > indexedPathSegments,
                                                IndexedPathSegmentTreeNode <string> rootIndexedValueTreeNode)
        {
            foreach (IPath path in paths)
            {
                IndexedPathSegmentTreeNode <string> IndexedPathSegmentTreeNode = rootIndexedValueTreeNode;
                int pathSegmentCount = 0;

                while (pathSegmentCount < indexedPathSegments[path].Count)
                {
                    IndexedPathSegmentTreeNode <string> tmpIndexedPathSegmentTreeNode;
                    IPathSegment pathSegment = indexedPathSegments[path][pathSegmentCount];
                    if (
                        !IndexedPathSegmentTreeNode.TryGetValue(pathSegment.ActualSegment,
                                                                out tmpIndexedPathSegmentTreeNode))
                    {
                        IndexedPathSegmentTreeNode <string> newIndexedPathSegmentTreeNode =
                            CreatePathSegmentIndexedPathSegmentTreeNode(pathSegment, IndexedPathSegmentTreeNode);
                        IndexedPathSegmentTreeNode.Add(pathSegment.ActualSegment, newIndexedPathSegmentTreeNode);
                        IndexedPathSegmentTreeNode = newIndexedPathSegmentTreeNode;
                    }
                    else
                    {
                        IndexedPathSegmentTreeNode = tmpIndexedPathSegmentTreeNode;
                    }

                    pathSegmentCount++;
                }
            }
        }
Exemple #8
0
        public Dictionary <IPath, IList <object> > SelectEnumerablesAsRelated(IList <IPath> paths)
        {
            IList <IPath> validPaths = new List <IPath>(paths.OfType <XmlPath>().ToList());

            var results = new Dictionary <IPath, IList <object> >();

            BuildResultsStructure(validPaths, results);

            if (validPaths.Count == 1 && validPaths[0].ActualPath == XmlPath.NodeSeperatorSymbol)
            {
                results[validPaths[0]].Add(Data);
                return(results);
            }
            var document = Data as XDocument;

            // Create the root node
            var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string> {
                CurrentValue = document
            };

            // Index the segments of all the paths, this is done so that they don't have to be regenerated for every use.
            var indexedPathSegments = new Dictionary <IPath, List <IPathSegment> >();

            IndexPathSegments(validPaths, indexedPathSegments);

            do
            {
                BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
            }while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);

            return(results);
        }
        protected virtual void BuildIndexedTree(IList<IPath> paths,
            Dictionary<IPath, List<IPathSegment>> indexedPathSegments,
            IndexedPathSegmentTreeNode<string> rootIndexedValueTreeNode)
        {
            foreach (IPath path in paths)
            {
                IndexedPathSegmentTreeNode<string> IndexedPathSegmentTreeNode = rootIndexedValueTreeNode;
                int pathSegmentCount = 0;

                while (pathSegmentCount < indexedPathSegments[path].Count)
                {
                    IndexedPathSegmentTreeNode<string> tmpIndexedPathSegmentTreeNode;
                    IPathSegment pathSegment = indexedPathSegments[path][pathSegmentCount];
                    if (
                        !IndexedPathSegmentTreeNode.TryGetValue(pathSegment.ActualSegment,
                            out tmpIndexedPathSegmentTreeNode))
                    {
                        IndexedPathSegmentTreeNode<string> newIndexedPathSegmentTreeNode =
                            CreatePathSegmentIndexedPathSegmentTreeNode(pathSegment, IndexedPathSegmentTreeNode);
                        IndexedPathSegmentTreeNode.Add(pathSegment.ActualSegment, newIndexedPathSegmentTreeNode);
                        IndexedPathSegmentTreeNode = newIndexedPathSegmentTreeNode;
                    }
                    else
                    {
                        IndexedPathSegmentTreeNode = tmpIndexedPathSegmentTreeNode;
                    }

                    pathSegmentCount++;
                }
            }
        }
Exemple #10
0
        protected override void BuildIndexedTree(IList <IPath> paths,
                                                 Dictionary <IPath, List <IPathSegment> > indexedPathSegments,
                                                 IndexedPathSegmentTreeNode <string> rootIndexedValueTreeNode)
        {
            foreach (IPath path in paths)
            {
                var indexedPathSegmentTreeNode = rootIndexedValueTreeNode;
                var pathSegmentCount           = 0;

                while (pathSegmentCount < indexedPathSegments[path].Count)
                {
                    IndexedPathSegmentTreeNode <string> tmpIndexedPathSegmentTreeNode = null;
                    var            pathSegment = indexedPathSegments[path][pathSegmentCount] as XmlPathSegment;
                    XmlPathSegment parentPathSegment;

                    parentPathSegment = pathSegmentCount > 0 ? indexedPathSegments[path][pathSegmentCount - 1] as XmlPathSegment : null;

                    if (indexedPathSegmentTreeNode != null && pathSegment != null && !indexedPathSegmentTreeNode.TryGetValue(pathSegment.ActualSegment,
                                                                                                                             out tmpIndexedPathSegmentTreeNode))
                    {
                        var newIndexedPathSegmentTreeNode =
                            CreatePathSegmentIndexedPathSegmentTreeNode(pathSegment, parentPathSegment,
                                                                        indexedPathSegmentTreeNode);
                        indexedPathSegmentTreeNode.Add(pathSegment.ActualSegment, newIndexedPathSegmentTreeNode);
                        indexedPathSegmentTreeNode = newIndexedPathSegmentTreeNode;
                    }
                    else
                    {
                        indexedPathSegmentTreeNode = tmpIndexedPathSegmentTreeNode;
                    }

                    pathSegmentCount++;
                }
            }
        }
Exemple #11
0
 protected virtual void WriteToResults(IList <IPath> paths, Dictionary <IPath, List <IPathSegment> > indexedPathSegments, IndexedPathSegmentTreeNode <string> rootIndexedValueTreeNode, Dictionary <IPath, IList <object> > results)
 {
     foreach (IPath path in paths)
     {
         IndexedPathSegmentTreeNode <string> IndexedPathSegmentTreeNode = rootIndexedValueTreeNode[indexedPathSegments[path].Select(p => p.ActualSegment).ToList()];
         results[path].Add(IndexedPathSegmentTreeNode.CurrentValue);
     }
 }
Exemple #12
0
        public Dictionary <IPath, IList <object> > SelectEnumerablesAsRelated(IList <IPath> paths)
        {
            //
            // Get valid paths
            //
            IList <IPath> validPaths = new List <IPath>(paths.OfType <PocoPath>().ToList());

            //
            // Setup results structure
            //
            var results = new Dictionary <IPath, IList <object> >();

            BuildResultsStructure(validPaths, results);

            if (validPaths.Count == 1 && validPaths[0].ActualPath == PocoPath.SeperatorSymbol)
            {
                results[validPaths[0]].Add(Data);
            }
            else if (validPaths.Count == 1 &&
                     validPaths[0].ActualPath == PocoPath.EnumerableSymbol + PocoPath.SeperatorSymbol)
            {
                var enumerableData = Data as IEnumerable;

                if (enumerableData != null)
                {
                    IEnumerator enumerator = enumerableData.GetEnumerator();
                    enumerator.Reset();
                    while (enumerator.MoveNext())
                    {
                        results[validPaths[0]].Add(enumerator.Current);
                    }
                }
            }
            else
            {
                //
                // Create the root node
                //
                var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string> {
                    CurrentValue = Data
                };

                //
                // Index the segments of all the paths, this is done so that they don't have to be
                // regenerated for every use.
                //
                var indexedPathSegments = new Dictionary <IPath, List <IPathSegment> >();
                IndexPathSegments(validPaths, indexedPathSegments);

                do
                {
                    BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                    WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
                } while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);
            }
            return(results);
        }
Exemple #13
0
 protected override void WriteToResults(IList <IPath> paths, Dictionary <IPath, List <IPathSegment> > indexedPathSegments, IndexedPathSegmentTreeNode <string> rootIndexedValueTreeNode, Dictionary <IPath, IList <object> > results)
 {
     foreach (IPath path in paths)
     {
         List <IPathSegment> indexedPathSegment = indexedPathSegments[path];
         List <string>       complexKey         = indexedPathSegment.Select(p => p.ActualSegment).ToList();
         IndexedPathSegmentTreeNode <string> IndexedPathSegmentTreeNode = rootIndexedValueTreeNode[complexKey];
         results[path].Add(IndexedPathSegmentTreeNode.CurrentValue.ToString());
     }
 }
Exemple #14
0
        public Dictionary <IPath, IList <object> > SelectEnumerablesAsRelated(IList <IPath> paths)
        {
            //
            // Get valid paths
            //
            IList <IPath> validPaths = new List <IPath>(paths.OfType <XmlPath>().ToList());

            //
            // Setup results structure
            //
            var results = new Dictionary <IPath, IList <object> >();

            BuildResultsStructure(validPaths, results);

            if (validPaths.Count == 1 && validPaths[0].ActualPath == XmlPath.NodeSeperatorSymbol)
            {
                results[validPaths[0]].Add(Data);
            }
            else
            {
                var document = Data as XDocument;

                if (document == null)
                {
                    throw new Exception(
                              string.Format("Type of {0} was expected for data, type of {1} was found instead.",
                                            typeof(XDocument), Data.GetType()));
                }

                //
                // Create the root node
                //
                var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string> {
                    CurrentValue = document
                };

                //
                // Index the segments of all the paths, this is done so that they don't have to be
                // regenerated for every use.
                //
                var indexedPathSegments = new Dictionary <IPath, List <IPathSegment> >();
                IndexPathSegments(validPaths, indexedPathSegments);

                do
                {
                    BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                    WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
                    // ReSharper disable once LoopVariableIsNeverChangedInsideLoop
                } while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);
            }
            return(results);
        }
Exemple #15
0
        protected override IndexedPathSegmentTreeNode <string> CreatePathSegmentIndexedPathSegmentTreeNode(IPathSegment pathSegment, IndexedPathSegmentTreeNode <string> parentNode)
        {
            IndexedPathSegmentTreeNode <string> newIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (pathSegment.IsEnumarable)
                {
                    newIndexedValueTreeNode.EnumerableValue = GetEnumerableValueForPathSegment(pathSegment, parentNode.CurrentValue);

                    if (newIndexedValueTreeNode.EnumerableValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                    else
                    {
                        newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();

                        newIndexedValueTreeNode.Enumerator.Reset();

                        if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                        {
                            newIndexedValueTreeNode.CurrentValue        = string.Empty;
                            newIndexedValueTreeNode.EnumerationComplete = true;
                        }
                        else
                        {
                            newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                        }
                    }
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = GetScalarValueForPathSegement(pathSegment, parentNode.CurrentValue);

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
            }

            return(newIndexedValueTreeNode);
        }
Exemple #16
0
        private void GetEnumerableValueForPathSegment(IPathSegment pathSegment, IndexedPathSegmentTreeNode <string> parentNode, IndexedPathSegmentTreeNode <string> newIndexedValueTreeNode)
        {
            var data = parentNode.CurrentValue as JToken;

            newIndexedValueTreeNode.EnumerableValue = GetEnumerableValueForPathSegment(pathSegment, data);

            if (newIndexedValueTreeNode.EnumerableValue == null)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                var isPrimitiveArray = false;
                if (data is JObject jObject)
                {
                    var property = jObject.Property(pathSegment.ActualSegment);
                    isPrimitiveArray = property.IsEnumerableOfPrimitives();
                }

                newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();
                newIndexedValueTreeNode.Enumerator.Reset();

                if (isPrimitiveArray)
                {
                    var valueBuilder = new StringBuilder();
                    while (newIndexedValueTreeNode.Enumerator.MoveNext())
                    {
                        valueBuilder.Append(newIndexedValueTreeNode.Enumerator.Current);
                        valueBuilder.Append(",");
                    }
                    newIndexedValueTreeNode.EnumerationComplete = true;
                    newIndexedValueTreeNode.CurrentValue        = valueBuilder.ToString().TrimEnd(',');
                }
                else
                {
                    if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                    else
                    {
                        newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                    }
                }
            }
        }
        protected void CreateRootNode(IList <IPath> validPaths, Dictionary <IPath, IList <object> > results)
        {
            //
            // Create the root node
            //
            var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string>();

            rootIndexedValueTreeNode.CurrentValue = Data;

            //
            // Index the segments of all the paths, this is done so that they don't have to be
            // regenerated for every use.
            //
            var indexedPathSegments = new Dictionary <IPath, List <IPathSegment> >();

            IndexPathSegments(validPaths, indexedPathSegments);

            do
            {
                BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
            } while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);
        }
 protected virtual IndexedPathSegmentTreeNode <string> CreatePathSegmentIndexedPathSegmentTreeNode(
     IPathSegment pathSegment, IndexedPathSegmentTreeNode <string> parentNode)
 {
     return(null);
 }
        protected override IndexedPathSegmentTreeNode<string> CreatePathSegmentIndexedPathSegmentTreeNode(
            IPathSegment pathSegment, IndexedPathSegmentTreeNode<string> parentNode)
        {
            var newIndexedValueTreeNode = new IndexedPathSegmentTreeNode<string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (pathSegment.IsEnumarable)
                {
                    var data = parentNode.CurrentValue as JToken;
                    newIndexedValueTreeNode.EnumerableValue = GetEnumerableValueForPathSegment(pathSegment, data);

                    if (newIndexedValueTreeNode.EnumerableValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                    else
                    {
                        bool isPrimitiveArray = false;
                        var jObject = data as JObject;
                        if (jObject != null)
                        {
                            JProperty property = jObject.Property(pathSegment.ActualSegment);
                            isPrimitiveArray = property.IsEnumerableOfPrimitives();
                        }

                        newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();
                        newIndexedValueTreeNode.Enumerator.Reset();

                        if (isPrimitiveArray)
                        {
                            var valueBuilder = new StringBuilder();
                            while (newIndexedValueTreeNode.Enumerator.MoveNext())
                            {
                                valueBuilder.Append(newIndexedValueTreeNode.Enumerator.Current);
                                valueBuilder.Append(",");
                            }
                            newIndexedValueTreeNode.EnumerationComplete = true;
                            newIndexedValueTreeNode.CurrentValue = valueBuilder.ToString().TrimEnd(',');
                        }
                        else
                        {
                            if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                            {
                                newIndexedValueTreeNode.CurrentValue = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                            else
                            {
                                newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                            }
                        }
                    }
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = GetScalarValueForPathSegement(pathSegment,
                        parentNode.CurrentValue as JToken);

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
            }

            return newIndexedValueTreeNode;
        }
 protected override void WriteToResults(IList<IPath> paths,
     Dictionary<IPath, List<IPathSegment>> indexedPathSegments,
     IndexedPathSegmentTreeNode<string> rootIndexedValueTreeNode, Dictionary<IPath, IList<object>> results)
 {
     foreach (IPath path in paths)
     {
         List<IPathSegment> indexedPathSegment = indexedPathSegments[path];
         List<string> complexKey = indexedPathSegment.Select(p => p.ActualSegment).ToList();
         IndexedPathSegmentTreeNode<string> IndexedPathSegmentTreeNode = rootIndexedValueTreeNode[complexKey];
         results[path].Add(IndexedPathSegmentTreeNode.CurrentValue.ToString());
     }
 }
        protected long EnumerateIndexedTree(IndexedPathSegmentTreeNode<string> node)
        {
            long enumerationCount = 0;

            foreach (var childNode in node.Values)
            {
                enumerationCount += EnumerateIndexedTree(childNode);
            }

            if (node.Enumerator != null && enumerationCount == 0)
            {
                node.EnumerationComplete = !node.Enumerator.MoveNext();
                if (node.EnumerationComplete)
                {
                    node.CurrentValue = string.Empty;
                }
                else
                {
                    node.CurrentValue = node.Enumerator.Current;
                    enumerationCount++;
                }

                node.Clear();
            }

            return enumerationCount;
        }
Exemple #22
0
        protected override IndexedPathSegmentTreeNode<string> CreatePathSegmentIndexedPathSegmentTreeNode(
            IPathSegment pathSegment, IndexedPathSegmentTreeNode<string> parentNode)
        {
            var newIndexedValueTreeNode = new IndexedPathSegmentTreeNode<string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (pathSegment.IsEnumarable)
                {
                    newIndexedValueTreeNode.EnumerableValue = GetEnumerableValueForPathSegment(pathSegment,
                        parentNode.CurrentValue);

                    if (newIndexedValueTreeNode.EnumerableValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                    else
                    {
                        newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();

                        newIndexedValueTreeNode.Enumerator.Reset();

                        if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                        {
                            newIndexedValueTreeNode.CurrentValue = string.Empty;
                            newIndexedValueTreeNode.EnumerationComplete = true;
                        }
                        else
                        {
                            newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                        }
                    }
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = GetScalarValueForPathSegement(pathSegment,
                        parentNode.CurrentValue);

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
            }

            return newIndexedValueTreeNode;
        }
Exemple #23
0
        public Dictionary<IPath, IList<object>> SelectEnumerablesAsRelated(IList<IPath> paths)
        {
            //
            // Get valid paths
            //
            IList<IPath> validPaths = new List<IPath>(paths.OfType<XmlPath>().ToList());

            //
            // Setup results structure
            //
            var results = new Dictionary<IPath, IList<object>>();
            BuildResultsStructure(validPaths, results);

            if (validPaths.Count == 1 && validPaths[0].ActualPath == XmlPath.NodeSeperatorSymbol)
            {
                results[validPaths[0]].Add(Data);
            }
            else
            {
                var document = Data as XDocument;

                if (document == null)
                {
                    throw new Exception(
                        string.Format("Type of {0} was expected for data, type of {1} was found instead.",
                            typeof (XDocument), Data.GetType()));
                }

                //
                // Create the root node
                //
                var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode<string> {CurrentValue = document};

                //
                // Index the segments of all the paths, this is done so that they don't have to be
                // regenerated for every use.
                //
                var indexedPathSegments = new Dictionary<IPath, List<IPathSegment>>();
                IndexPathSegments(validPaths, indexedPathSegments);

                do
                {
                    BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                    WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
                    // ReSharper disable once LoopVariableIsNeverChangedInsideLoop
                } while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);
            }
            return results;
        }
Exemple #24
0
        protected override void BuildIndexedTree(IList<IPath> paths,
            Dictionary<IPath, List<IPathSegment>> indexedPathSegments,
            IndexedPathSegmentTreeNode<string> rootIndexedValueTreeNode)
        {
            foreach (IPath path in paths)
            {
                IndexedPathSegmentTreeNode<string> indexedPathSegmentTreeNode = rootIndexedValueTreeNode;
                int pathSegmentCount = 0;

                while (pathSegmentCount < indexedPathSegments[path].Count)
                {
                    IndexedPathSegmentTreeNode<string> tmpIndexedPathSegmentTreeNode = null;
                    var pathSegment = indexedPathSegments[path][pathSegmentCount] as XmlPathSegment;
                    XmlPathSegment parentPathSegment;

                    if (pathSegmentCount > 0)
                    {
                        parentPathSegment = indexedPathSegments[path][pathSegmentCount - 1] as XmlPathSegment;
                    }
                    else
                    {
                        parentPathSegment = null;
                    }

                    if (indexedPathSegmentTreeNode != null && pathSegment != null && !indexedPathSegmentTreeNode.TryGetValue(pathSegment.ActualSegment,
                        out tmpIndexedPathSegmentTreeNode))
                    {
                        IndexedPathSegmentTreeNode<string> newIndexedPathSegmentTreeNode =
                            CreatePathSegmentIndexedPathSegmentTreeNode(pathSegment, parentPathSegment,
                                indexedPathSegmentTreeNode);
                        indexedPathSegmentTreeNode.Add(pathSegment.ActualSegment, newIndexedPathSegmentTreeNode);
                        indexedPathSegmentTreeNode = newIndexedPathSegmentTreeNode;
                    }
                    else
                    {
                        indexedPathSegmentTreeNode = tmpIndexedPathSegmentTreeNode;
                    }

                    pathSegmentCount++;
                }
            }
        }
Exemple #25
0
        protected override void WriteToResults(IList<IPath> paths,
            Dictionary<IPath, List<IPathSegment>> indexedPathSegments,
            IndexedPathSegmentTreeNode<string> rootIndexedValueTreeNode, Dictionary<IPath, IList<object>> results)
        {
            foreach (IPath path in paths)
            {
                List<IPathSegment> list = indexedPathSegments[path];

                IndexedPathSegmentTreeNode<string> indexedPathSegmentTreeNode =
                    rootIndexedValueTreeNode[list.Select(p => p.ActualSegment).ToList()];

                var element = indexedPathSegmentTreeNode.CurrentValue as XElement;
                if (element != null)
                {
                    results[path].Add(element.Value);
                }
                else
                {
                    var value = indexedPathSegmentTreeNode.CurrentValue as XAttribute;
                    results[path].Add(value != null ? value.Value : indexedPathSegmentTreeNode.CurrentValue.ToString());
                }
            }
        }
 protected virtual void WriteToResults(IList<IPath> paths,
     Dictionary<IPath, List<IPathSegment>> indexedPathSegments,
     IndexedPathSegmentTreeNode<string> rootIndexedValueTreeNode, Dictionary<IPath, IList<object>> results)
 {
     foreach (IPath path in paths)
     {
         IndexedPathSegmentTreeNode<string> IndexedPathSegmentTreeNode =
             rootIndexedValueTreeNode[indexedPathSegments[path].Select(p => p.ActualSegment).ToList()];
         results[path].Add(IndexedPathSegmentTreeNode.CurrentValue);
     }
 }
Exemple #27
0
        protected override void WriteToResults(IList <IPath> paths, Dictionary <IPath, List <IPathSegment> > indexedPathSegments, IndexedPathSegmentTreeNode <string> rootIndexedValueTreeNode, Dictionary <IPath, IList <object> > results)
        {
            foreach (var path in paths)
            {
                var list = indexedPathSegments[path];

                var indexedPathSegmentTreeNode = rootIndexedValueTreeNode[list.Select(p => p.ActualSegment).ToList()];

                if (indexedPathSegmentTreeNode.CurrentValue is XElement element)
                {
                    results[path].Add(element.Value);
                }
                else
                {
                    var value = indexedPathSegmentTreeNode.CurrentValue as XAttribute;
                    results[path].Add(value?.Value ?? indexedPathSegmentTreeNode.CurrentValue.ToString());
                }
            }
        }
Exemple #28
0
        private IndexedPathSegmentTreeNode <string> CreatePathSegmentIndexedPathSegmentTreeNode(XmlPathSegment pathSegment, IPathSegment parentPathSegment, IndexedPathSegmentTreeNode <string> parentNode)
        {
            IndexedPathSegmentTreeNode <string> newIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (parentNode.CurrentValue is XDocument)
                {
                    XDocument document = parentNode.CurrentValue as XDocument;
                    newIndexedValueTreeNode.CurrentValue = document.Root;
                }
                else
                {
                    XElement parentCurentElement = parentNode.CurrentValue as XElement;

                    if (parentPathSegment != null && parentPathSegment.IsEnumarable)
                    {
                        if (parentCurentElement != null)
                        {
                            List <XElement> childElements = parentCurentElement.Elements(pathSegment.ActualSegment).ToList();
                            newIndexedValueTreeNode.EnumerableValue = childElements;

                            if (childElements.Count == 0)
                            {
                                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                            else
                            {
                                newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();

                                newIndexedValueTreeNode.Enumerator.Reset();

                                if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                                {
                                    newIndexedValueTreeNode.CurrentValue        = string.Empty;
                                    newIndexedValueTreeNode.EnumerationComplete = true;
                                }
                                else
                                {
                                    newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (pathSegment.IsAttribute)
                        {
                            if (parentCurentElement != null)
                            {
                                newIndexedValueTreeNode.CurrentValue = parentCurentElement.Attribute(pathSegment.ActualSegment);
                            }

                            if (newIndexedValueTreeNode.CurrentValue == null)
                            {
                                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                        }
                        else
                        {
                            if (parentCurentElement != null)
                            {
                                newIndexedValueTreeNode.CurrentValue = parentCurentElement.Element(pathSegment.ActualSegment);
                            }

                            if (newIndexedValueTreeNode.CurrentValue == null)
                            {
                                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                        }
                    }
                }
            }

            return(newIndexedValueTreeNode);
        }
 protected virtual IndexedPathSegmentTreeNode<string> CreatePathSegmentIndexedPathSegmentTreeNode(
     IPathSegment pathSegment, IndexedPathSegmentTreeNode<string> parentNode)
 {
     return null;
 }
Exemple #30
0
        private IndexedPathSegmentTreeNode<string> CreatePathSegmentIndexedPathSegmentTreeNode(
            XmlPathSegment pathSegment, IPathSegment parentPathSegment, IndexedPathSegmentTreeNode<string> parentNode)
        {
            var newIndexedValueTreeNode = new IndexedPathSegmentTreeNode<string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (parentNode.CurrentValue is XDocument)
                {
                    var document = parentNode.CurrentValue as XDocument;
                    newIndexedValueTreeNode.CurrentValue = document.Root;
                }
                else
                {
                    var parentCurentElement = parentNode.CurrentValue as XElement;

                    if (parentPathSegment != null && parentPathSegment.IsEnumarable)
                    {
                        if (parentCurentElement != null)
                        {
                            List<XElement> childElements =
                                parentCurentElement.Elements(pathSegment.ActualSegment).ToList();
                            newIndexedValueTreeNode.EnumerableValue = childElements;

                            if (childElements.Count == 0)
                            {
                                newIndexedValueTreeNode.CurrentValue = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                            else
                            {
                                newIndexedValueTreeNode.Enumerator =
                                    newIndexedValueTreeNode.EnumerableValue.GetEnumerator();

                                newIndexedValueTreeNode.Enumerator.Reset();

                                if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                                {
                                    newIndexedValueTreeNode.CurrentValue = string.Empty;
                                    newIndexedValueTreeNode.EnumerationComplete = true;
                                }
                                else
                                {
                                    newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (pathSegment.IsAttribute)
                        {
                            if (parentCurentElement != null)
                            {
                                newIndexedValueTreeNode.CurrentValue =
                                    parentCurentElement.Attribute(pathSegment.ActualSegment);
                            }

                            if (newIndexedValueTreeNode.CurrentValue == null)
                            {
                                newIndexedValueTreeNode.CurrentValue = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                        }
                        else
                        {
                            if (parentCurentElement != null)
                            {
                                newIndexedValueTreeNode.CurrentValue =
                                    parentCurentElement.Element(pathSegment.ActualSegment);
                            }

                            if (newIndexedValueTreeNode.CurrentValue == null)
                            {
                                newIndexedValueTreeNode.CurrentValue = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                        }
                    }
                }
            }

            return newIndexedValueTreeNode;
        }
Exemple #31
0
        static void XElementSegment(XmlPathSegment pathSegment, IPathSegment parentPathSegment, IndexedPathSegmentTreeNode <string> parentNode, IndexedPathSegmentTreeNode <string> newIndexedValueTreeNode)
        {
            var parentCurentElement = parentNode.CurrentValue as XElement;

            if (parentPathSegment != null && parentPathSegment.IsEnumarable)
            {
                if (parentCurentElement != null)
                {
                    ActualXElementSegment(pathSegment, newIndexedValueTreeNode, parentCurentElement);
                }
            }
            else
            {
                if (pathSegment.IsAttribute)
                {
                    if (parentCurentElement != null)
                    {
                        newIndexedValueTreeNode.CurrentValue =
                            parentCurentElement.Attribute(pathSegment.ActualSegment);
                    }

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
                else
                {
                    if (parentCurentElement != null)
                    {
                        newIndexedValueTreeNode.CurrentValue =
                            parentCurentElement.Element(pathSegment.ActualSegment);
                    }

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
            }
        }
        protected void CreateRootNode(IList<IPath> validPaths, Dictionary<IPath, IList<object>> results)
        {
            //
            // Create the root node
            //
            var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode<string>();
            rootIndexedValueTreeNode.CurrentValue = Data;

            //
            // Index the segments of all the paths, this is done so that they don't have to be
            // regenerated for every use.
            //
            var indexedPathSegments = new Dictionary<IPath, List<IPathSegment>>();
            IndexPathSegments(validPaths, indexedPathSegments);

            do
            {
                BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
            } while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);
        }
Exemple #33
0
        protected override IndexedPathSegmentTreeNode <string> CreatePathSegmentIndexedPathSegmentTreeNode(
            IPathSegment pathSegment, IndexedPathSegmentTreeNode <string> parentNode)
        {
            var newIndexedValueTreeNode = new IndexedPathSegmentTreeNode <string>();

            if (parentNode.EnumerationComplete)
            {
                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                newIndexedValueTreeNode.EnumerationComplete = true;
            }
            else
            {
                if (pathSegment.IsEnumarable)
                {
                    var data = parentNode.CurrentValue as JToken;
                    newIndexedValueTreeNode.EnumerableValue = GetEnumerableValueForPathSegment(pathSegment, data);

                    if (newIndexedValueTreeNode.EnumerableValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                    else
                    {
                        bool isPrimitiveArray = false;
                        var  jObject          = data as JObject;
                        if (jObject != null)
                        {
                            JProperty property = jObject.Property(pathSegment.ActualSegment);
                            isPrimitiveArray = property.IsEnumerableOfPrimitives();
                        }

                        newIndexedValueTreeNode.Enumerator = newIndexedValueTreeNode.EnumerableValue.GetEnumerator();
                        newIndexedValueTreeNode.Enumerator.Reset();

                        if (isPrimitiveArray)
                        {
                            var valueBuilder = new StringBuilder();
                            while (newIndexedValueTreeNode.Enumerator.MoveNext())
                            {
                                valueBuilder.Append(newIndexedValueTreeNode.Enumerator.Current);
                                valueBuilder.Append(",");
                            }
                            newIndexedValueTreeNode.EnumerationComplete = true;
                            newIndexedValueTreeNode.CurrentValue        = valueBuilder.ToString().TrimEnd(',');
                        }
                        else
                        {
                            if (!newIndexedValueTreeNode.Enumerator.MoveNext())
                            {
                                newIndexedValueTreeNode.CurrentValue        = string.Empty;
                                newIndexedValueTreeNode.EnumerationComplete = true;
                            }
                            else
                            {
                                newIndexedValueTreeNode.CurrentValue = newIndexedValueTreeNode.Enumerator.Current;
                            }
                        }
                    }
                }
                else
                {
                    newIndexedValueTreeNode.CurrentValue = GetScalarValueForPathSegement(pathSegment,
                                                                                         parentNode.CurrentValue as JToken);

                    if (newIndexedValueTreeNode.CurrentValue == null)
                    {
                        newIndexedValueTreeNode.CurrentValue        = string.Empty;
                        newIndexedValueTreeNode.EnumerationComplete = true;
                    }
                }
            }

            return(newIndexedValueTreeNode);
        }
Exemple #34
0
        public Dictionary<IPath, IList<object>> SelectEnumerablesAsRelated(IList<IPath> paths)
        {
            //
            // Get valid paths
            //
            IList<IPath> validPaths = new List<IPath>(paths.OfType<PocoPath>().ToList());

            //
            // Setup results structure
            //
            var results = new Dictionary<IPath, IList<object>>();
            BuildResultsStructure(validPaths, results);

            if (validPaths.Count == 1 && validPaths[0].ActualPath == PocoPath.SeperatorSymbol)
            {
                results[validPaths[0]].Add(Data);
            }
            else if (validPaths.Count == 1 &&
                     validPaths[0].ActualPath == PocoPath.EnumerableSymbol + PocoPath.SeperatorSymbol)
            {
                var enumerableData = Data as IEnumerable;

                if (enumerableData != null)
                {
                    IEnumerator enumerator = enumerableData.GetEnumerator();
                    enumerator.Reset();
                    while (enumerator.MoveNext())
                    {
                        results[validPaths[0]].Add(enumerator.Current);
                    }
                }
            }
            else
            {
                //
                // Create the root node
                //
                var rootIndexedValueTreeNode = new IndexedPathSegmentTreeNode<string> {CurrentValue = Data};

                //
                // Index the segments of all the paths, this is done so that they don't have to be
                // regenerated for every use.
                //
                var indexedPathSegments = new Dictionary<IPath, List<IPathSegment>>();
                IndexPathSegments(validPaths, indexedPathSegments);

                do
                {
                    BuildIndexedTree(validPaths, indexedPathSegments, rootIndexedValueTreeNode);
                    WriteToResults(validPaths, indexedPathSegments, rootIndexedValueTreeNode, results);
                } while (EnumerateIndexedTree(rootIndexedValueTreeNode) > 0);
            }
            return results;
        }