Class IdentifierNode

  • All Implemented Interfaces:
    ParseTreeNode

    public class IdentifierNode
    extends java.lang.Object
    implements ParseTreeNode
    Multi-part identifier.

    An identifier is immutable.

    An identifer consists of one or more IdentifierSegments. A segment is either:

    • An unquoted value such as 'CA',
    • A value quoted in brackets, such as '[San Francisco]', or
    • A key of one or more parts, each of which is prefixed with '&', such as '&[Key 1]&Key2&[5]'.

    Segment types are indicated by the Quoting enumeration.

    A key segment is of type Quoting.KEY, and has one or more component parts accessed via the IdentifierSegment.getKeyParts() method. The parts are of type Quoting.UNQUOTED or Quoting.QUOTED.

    A simple example is the identifier Measures.[Unit Sales]. It has two segments:

    • Segment #0 is UNQUOTED, name "Measures"
    • Segment #1 is QUOTED, name "Unit Sales"

    A more complex example illustrates a compound key. The identifier [Customers].[City].&[San Francisco]&CA&USA.&[cust1234] contains four segments as follows:

    • Segment #0 is QUOTED, name "Customers"
    • Segment #1 is QUOTED, name "City"
    • Segment #2 is a KEY. It has 3 sub-segments:
      • Sub-segment #0 is QUOTED, name "San Francisco"
      • Sub-segment #1 is UNQUOTED, name "CA"
      • Sub-segment #2 is UNQUOTED, name "USA"
    • Segment #3 is a KEY. It has 1 sub-segment:
      • Sub-segment #0 is QUOTED, name "cust1234"
    Author:
    jhyde
    • Constructor Detail

      • IdentifierNode

        public IdentifierNode​(IdentifierSegment... segments)
        Creates an identifier containing one or more segments.
        Parameters:
        segments - Array of Segments, each consisting of a name and quoting style
      • IdentifierNode

        public IdentifierNode​(java.util.List<IdentifierSegment> segments)
        Creates an identifier containing a list of segments.
        Parameters:
        segments - List of segments
    • Method Detail

      • getType

        public Type getType()
        Description copied from interface: ParseTreeNode
        Returns the type of this expression.

        Returns null if this node is not an expression, for instance a SELECT node.

        Specified by:
        getType in interface ParseTreeNode
        Returns:
        type of this expression
      • getSegmentList

        public java.util.List<IdentifierSegment> getSegmentList()
        Returns the list of segments which consistitute this identifier.
        Returns:
        list of constituent segments
      • getRegion

        public ParseRegion getRegion()
        Description copied from interface: ParseTreeNode
        Returns the region of the source code which this node was created from, if it was created by parsing.

        A non-leaf node's region will encompass the regions of all of its children. For example, a the region of a function call node Crossjoin([Gender], {[Store].[USA]}) stretches from the first character of the function name to the closing parenthesis.

        Region may be null, if the node was created programmatically, not from a piece of source code.

        Specified by:
        getRegion in interface ParseTreeNode
        Returns:
        Region of the source code this node was created from, if it was created by parsing
      • append

        public IdentifierNode append​(IdentifierSegment segment)
        Returns a new Identifier consisting of this one with another segment appended. Does not modify this Identifier.
        Parameters:
        segment - Name of segment
        Returns:
        New identifier
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • deepCopy

        public IdentifierNode deepCopy()
        Description copied from interface: ParseTreeNode
        Creates a deep copy of this ParseTreeNode object.

        Note: implementing classes can return the concrete type instead of ParseTreeNode (using Java 1.5 covariant return types)

        Specified by:
        deepCopy in interface ParseTreeNode
        Returns:
        The deep copy of this ParseTreeNode
      • parseIdentifier

        public static IdentifierNode parseIdentifier​(java.lang.String identifier)
        Parses an MDX identifier string into an IdentifierNode.

        It contains a list of segments, each of which is a name combined with a description of how the name was quoted. For example,

        parseIdentifier( "[Customers].USA.[South Dakota].[Sioux Falls].&[1245]")
        returns an IdentifierNode consisting of the following segments:
        • NameSegment("Customers", quoted=true),
        • NameSegment("USA", quoted=false),
        • NameSegment("South Dakota", quoted=true),
        • NameSegment("Sioux Falls", quoted=true),
        • KeySegment( { NameSegment("1245", quoted=true) } )
        Parameters:
        identifier - MDX identifier string
        Returns:
        Identifier parse tree node
        Throws:
        java.lang.IllegalArgumentException - if the format of the identifier is invalid
        See Also:
        ofNames(String...)
      • ofNames

        public static IdentifierNode ofNames​(java.lang.String... names)
        Converts an array of quoted name segments into an identifier.

        For example,

        IdentifierNode.ofNames("Store", "USA", "CA")
        returns an IdentifierNode consisting of the following segments:
        • NameSegment("Customers", quoted=true),
        • NameSegment("USA", quoted=false),
        • NameSegment("South Dakota", quoted=true),
        • NameSegment("Sioux Falls", quoted=true),
        • KeySegment( { NameSegment("1245", quoted=true) } )
        Parameters:
        names - Array of names
        Returns:
        Identifier parse tree node
        See Also:
        parseIdentifier(String)