Class SegmentNodeState

  • All Implemented Interfaces:
    NodeState
    Direct Known Subclasses:
    CompactedNodeState

    public class SegmentNodeState
    extends Object
    implements NodeState
    A record of type "NODE". This class can read a node record from a segment. It currently doesn't cache data (but the template is fully loaded).
    • Method Detail

      • getStableId

        public String getStableId()
        Returns the stable id of this node. In contrast to the node's record id (which is technically the node's address) the stable id doesn't change after an online gc cycle. It might though change after an offline gc cycle.
        Returns:
        stable id
      • getStableIdBytes

        public Buffer getStableIdBytes()
        Returns the stable ID of this node, non parsed. In contrast to the node's record id (which is technically the node's address) the stable id doesn't change after an online gc cycle. It might though change after an offline gc cycle.
        Returns:
        the stable ID of this node.
      • exists

        public boolean exists()
        Description copied from interface: NodeState
        Checks whether this node exists. See the above discussion about the existence of node states.
        Specified by:
        exists in interface NodeState
        Returns:
        true if this node exists, false if not
      • getPropertyCount

        public long getPropertyCount()
        Description copied from interface: NodeState
        Returns the number of properties of this node.
        Specified by:
        getPropertyCount in interface NodeState
        Returns:
        number of properties
      • hasProperty

        public boolean hasProperty​(@NotNull
                                   @NotNull String name)
        Description copied from interface: NodeState
        Checks whether the named property exists. The implementation is equivalent to getProperty(name) != null, but may be optimized to avoid having to load the property value.
        Specified by:
        hasProperty in interface NodeState
        Parameters:
        name - property name
        Returns:
        true if the named property exists, false otherwise
      • getProperty

        @Nullable
        public @Nullable PropertyState getProperty​(@NotNull
                                                   @NotNull String name)
        Description copied from interface: NodeState
        Returns the named property, or null if no such property exists.
        Specified by:
        getProperty in interface NodeState
        Parameters:
        name - name of the property to return
        Returns:
        named property, or null if not found
      • getProperties

        @NotNull
        public @NotNull Iterable<PropertyState> getProperties()
        Description copied from interface: NodeState
        Returns an iterable of the properties of this node. Multiple iterations are guaranteed to return the properties in the same order, but the specific order used is implementation-dependent and may change across different states of the same node.
        Specified by:
        getProperties in interface NodeState
        Returns:
        properties in some stable order
      • getBoolean

        public boolean getBoolean​(@NotNull
                                  @NotNull String name)
        Description copied from interface: NodeState
        Returns the boolean value of the named property. The implementation is equivalent to the following code, but may be optimized.
         
         PropertyState property = state.getProperty(name);
         return property != null
             && property.getType() == Type.BOOLEAN
             && property.getValue(Type.BOOLEAN);
         
         
        Specified by:
        getBoolean in interface NodeState
        Parameters:
        name - property name
        Returns:
        boolean value of the named property, or false
      • getLong

        public long getLong​(String name)
        Description copied from interface: NodeState
        Returns the long value of the named property. The implementation is equivalent to the following code, but may be optimized.
         
         PropertyState property = state.getProperty(name);
         if (property != null && property.getType() == Type.LONG) {
             return property.getValue(Type.LONG);
         } else {
             return 0;
         }
         
         
        Specified by:
        getLong in interface NodeState
        Parameters:
        name - property name
        Returns:
        long value of the named property, or zero
      • getString

        @Nullable
        public @Nullable String getString​(String name)
        Description copied from interface: NodeState
        Returns the string value of the named property. The implementation is equivalent to the following code, but may be optimized.
         
         PropertyState property = state.getProperty(name);
         if (property != null && property.getType() == Type.STRING) {
             return property.getValue(Type.STRING);
         } else {
             return null;
         }
         
         
        Specified by:
        getString in interface NodeState
        Parameters:
        name - property name
        Returns:
        string value of the named property, or null
      • getStrings

        @NotNull
        public @NotNull Iterable<String> getStrings​(@NotNull
                                                    @NotNull String name)
        Description copied from interface: NodeState
        Returns the string values of the named property. The implementation is equivalent to the following code, but may be optimized.
         
         PropertyState property = state.getProperty(name);
         if (property != null && property.getType() == Type.STRINGS) {
             return property.getValue(Type.STRINGS);
         } else {
             return Collections.emptyList();
         }
         
         
        Specified by:
        getStrings in interface NodeState
        Parameters:
        name - property name
        Returns:
        string values of the named property, or an empty collection
      • getName

        @Nullable
        public @Nullable String getName​(@NotNull
                                        @NotNull String name)
        Description copied from interface: NodeState
        Returns the name value of the named property. The implementation is equivalent to the following code, but may be optimized.
         
         PropertyState property = state.getProperty(name);
         if (property != null && property.getType() == Type.NAME) {
             return property.getValue(Type.NAME);
         } else {
             return null;
         }
         
         
        Specified by:
        getName in interface NodeState
        Parameters:
        name - property name
        Returns:
        name value of the named property, or null
      • getNames

        @NotNull
        public @NotNull Iterable<String> getNames​(@NotNull
                                                  @NotNull String name)
        Description copied from interface: NodeState
        Returns the name values of the named property. The implementation is equivalent to the following code, but may be optimized.
         
         PropertyState property = state.getProperty(name);
         if (property != null && property.getType() == Type.NAMES) {
             return property.getValue(Type.NAMES);
         } else {
             return Collections.emptyList();
         }
         
         
        Specified by:
        getNames in interface NodeState
        Parameters:
        name - property name
        Returns:
        name values of the named property, or an empty collection
      • getChildNodeCount

        public long getChildNodeCount​(long max)
        Description copied from interface: NodeState
        Returns the number of iterable child nodes of this node.

        If an implementation knows the exact value, it returns it (even if the value is higher than max). If the implementation does not know the exact value, and the child node count is higher than max, it may return Long.MAX_VALUE. The cost of the operation is at most O(max).

        Specified by:
        getChildNodeCount in interface NodeState
        Parameters:
        max - the maximum number of entries to traverse
        Returns:
        number of iterable child nodes
      • hasChildNode

        public boolean hasChildNode​(@NotNull
                                    @NotNull String name)
        Description copied from interface: NodeState
        Checks whether the named child node exists. The implementation is equivalent to getChildNode(name).exists(), except that passing an invalid name as argument will result in a false return value instead of an IllegalArgumentException.
        Specified by:
        hasChildNode in interface NodeState
        Parameters:
        name - name of the child node
        Returns:
        true if the named child node exists, false otherwise
      • getChildNode

        @NotNull
        public @NotNull NodeState getChildNode​(@NotNull
                                               @NotNull String name)
        Description copied from interface: NodeState
        Returns the named, possibly non-existent, child node. Use the NodeState.exists() method on the returned child node to determine whether the node exists or not.
        Specified by:
        getChildNode in interface NodeState
        Parameters:
        name - name of the child node to return
        Returns:
        named child node
      • getChildNodeNames

        @NotNull
        public @NotNull Iterable<String> getChildNodeNames()
        Description copied from interface: NodeState
        Returns the names of all iterable child nodes.
        Specified by:
        getChildNodeNames in interface NodeState
        Returns:
        child node names in some stable order
      • getChildNodeEntries

        @NotNull
        public @NotNull Iterable<? extends ChildNodeEntry> getChildNodeEntries()
        Description copied from interface: NodeState
        Returns the iterable child node entries of this instance. Multiple iterations are guaranteed to return the child nodes in the same order, but the specific order used is implementation dependent and may change across different states of the same node.

        Note on cost and performance: while it is possible to iterate over all child NodeStates with the two methods NodeState.getChildNodeNames() and NodeState.getChildNode(String), this method is considered more efficient because an implementation can potentially perform the retrieval of the name and NodeState in one call. This results in O(n) vs. O(n log n) when iterating over the child node names and then look up the NodeState by name.

        Specified by:
        getChildNodeEntries in interface NodeState
        Returns:
        child node entries in some stable order
      • builder

        @NotNull
        public @NotNull SegmentNodeBuilder builder()
        Description copied from interface: NodeState
        Returns a builder for constructing a new node state based on this state, i.e. starting with all the properties and child nodes of this state.
        Specified by:
        builder in interface NodeState
        Returns:
        node builder based on this state
      • compareAgainstBaseState

        public boolean compareAgainstBaseState​(NodeState base,
                                               NodeStateDiff diff)
        Description copied from interface: NodeState
        Compares this node state against the given base state. Any differences are reported by calling the relevant added/changed/deleted methods of the given handler.

        TODO: Define the behavior of this method with regards to iterability/existence of child nodes.

        Specified by:
        compareAgainstBaseState in interface NodeState
        Parameters:
        base - base state
        diff - handler of node state differences
        Returns:
        true if the full diff was performed, or false if it was aborted as requested by the handler (see the NodeStateDiff contract for more details)
      • fastEquals

        public static boolean fastEquals​(NodeState a,
                                         NodeState b)
        Indicates whether two NodeState instances are equal to each other. A return value of true clearly means that the instances are equal, while a return value of false doesn't necessarily mean the instances are not equal. These "false negatives" are an implementation detail and callers cannot rely on them being stable.
        Parameters:
        a - the first NodeState instance
        b - the second NodeState instance
        Returns:
        true, if these two instances are equal.
      • hashCode

        public int hashCode()
      • equals

        public boolean equals​(Object object)
      • toString

        public String toString()
      • getSegment

        protected Segment getSegment()
        Returns the segment that contains this record.
        Returns:
        segment that contains this record
      • getRecordNumber

        protected int getRecordNumber()
      • getRecordId

        public RecordId getRecordId()
        Returns the identifier of this record.
        Returns:
        record identifier
      • getGcGeneration

        @NotNull
        public @NotNull GCGeneration getGcGeneration()
        Get the underlying segment's gc generation. Might cause the segment to get loaded if the generation info is missing
        Returns:
        the segment's gc generation