Пример #1
0
        /// <summary>
        /// Find the child edge, whose first character starts with given character.
        /// </summary>
        /// <param name="edge">Parent edge</param>
        /// <param name="character">First character of required edge</param>
        /// <returns>Edge found</returns>
        public override IEdge Find(IEdge edge, byte character)
        {
            PersistentMultiWaySuffixEdge pmwCurrentEdge = edge as PersistentMultiWaySuffixEdge;

            if (pmwCurrentEdge == null)
            {
                return(base.Find(edge, character));
            }

            // Find from the storage
            IEdge edgeFound = null;
            PersistentMultiWaySuffixEdge pmwEdge = null;
            int charIndex = 0;

            for (int index = 0; index < pmwCurrentEdge.GetChildren().Length; index++)
            {
                if (pmwCurrentEdge.GetChildren()[index] != -1)
                {
                    pmwEdge   = (PersistentMultiWaySuffixEdge)EdgeStore.Read(pmwCurrentEdge.GetChildren()[index]);
                    charIndex = pmwEdge.StartIndex;

                    if (charIndex < Sequence.Count)
                    {
                        if ((Sequence as IList <byte>)[charIndex] == character)
                        {
                            edgeFound = pmwEdge;
                            break;
                        }
                    }
                }
            }

            return(edgeFound);
        }
Пример #2
0
        /// <summary>
        /// Remove the edge from tree, this requires bubbling all the child edges one level up.
        /// </summary>
        /// <param name="parentEdge">Parent edge.</param>
        /// <param name="edge">Edge to be removed.</param>
        /// <returns></returns>
        public override bool Remove(IEdge parentEdge, IEdge edge)
        {
            PersistentMultiWaySuffixEdge pmwParentEdge = parentEdge as PersistentMultiWaySuffixEdge;

            if (pmwParentEdge == null)
            {
                return(base.Remove(parentEdge, edge));
            }

            PersistentMultiWaySuffixEdge pmwedge = edge as PersistentMultiWaySuffixEdge;

            if (pmwedge == null)
            {
                throw new ArgumentNullException("edge");
            }

            // Find the edge
            // Set the children reference to -1;
            for (int index = 0; index < pmwParentEdge.GetChildren().Length; index++)
            {
                if (pmwParentEdge.GetChildren()[index] == pmwedge.Key)
                {
                    pmwParentEdge.GetChildren()[index] = -1;
                    EdgeStore.Write(pmwParentEdge);
                    EdgeStore.Remove(pmwedge.Key);
                    Count--;
                    return(true);
                }
            }

            return(false);
        }
Пример #3
0
        /// <summary>
        /// Update the old node with new node, requires merging the child edges.
        /// </summary>
        /// <param name="parentEdge">Parent edge.</param>
        /// <param name="oldEdge">Old edge</param>
        /// <param name="newEdge">new edge</param>
        /// <returns></returns>
        public override bool Update(IEdge parentEdge, IEdge oldEdge, IEdge newEdge)
        {
            PersistentMultiWaySuffixEdge pmwParentEdge = parentEdge as PersistentMultiWaySuffixEdge;

            if (pmwParentEdge == null)
            {
                return(base.Update(parentEdge, oldEdge, newEdge));
            }

            PersistentMultiWaySuffixEdge pmwOldEdge = oldEdge as PersistentMultiWaySuffixEdge;

            if (pmwOldEdge == null)
            {
                throw new ArgumentNullException("oldEdge");
            }

            PersistentMultiWaySuffixEdge pmwNewEdge = newEdge as PersistentMultiWaySuffixEdge;

            if (pmwNewEdge == null)
            {
                throw new ArgumentNullException("newEdge");
            }

            // Find the edge
            // Replace the edge
            for (int index = 0; index < pmwParentEdge.GetChildren().Length; index++)
            {
                if (pmwParentEdge.GetChildren()[index] == pmwOldEdge.Key)
                {
                    pmwParentEdge.GetChildren()[index] = pmwNewEdge.Key;
                    EdgeStore.Write(pmwParentEdge);
                    return(true);
                }
            }

            return(false);
        }
Пример #4
0
        public override IEdge Split(IEdge edge, int splitAt)
        {
            // This is a leaf node with both start and end indices pointing to
            // terminating symbol. Don't insert this.
            if (splitAt == Sequence.Count)
            {
                return(edge);
            }

            PersistentMultiWaySuffixEdge pmwCurrentEdge = edge as PersistentMultiWaySuffixEdge;

            if (pmwCurrentEdge == null)
            {
                return(base.Split(edge, splitAt));
            }

            // Create the new edge
            PersistentMultiWaySuffixEdge newEdge =
                new PersistentMultiWaySuffixEdge(splitAt + 1, pmwCurrentEdge.EndIndex, MaximumChildrenCount);

            // Copy the children of old edge to new edge
            newEdge.ReplaceChildren(pmwCurrentEdge.GetChildren());

            // Write the edge to storage
            newEdge.Key = EdgeStore.Write(newEdge);

            // Update the old edge
            pmwCurrentEdge.EndIndex = splitAt;

            // Set new edge as child edge to old edge
            pmwCurrentEdge.ClearChildren();
            pmwCurrentEdge.AddChild(newEdge.Key);
            Count++;

            // Update the edge in storage
            EdgeStore.Write(pmwCurrentEdge);

            return(pmwCurrentEdge);
        }