Class IdentifierNode

java.lang.Object
org.olap4j.mdx.IdentifierNode
All Implemented Interfaces:
ParseTreeNode

public class IdentifierNode extends 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 Details

    • 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(List<IdentifierSegment> segments)
      Creates an identifier containing a list of segments.
      Parameters:
      segments - List of segments
  • Method Details

    • 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 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
    • accept

      public <T> T accept(ParseTreeVisitor<T> visitor)
      Description copied from interface: ParseTreeNode
      Accepts a visitor to this MDX parse tree node.

      The implementation should generally dispatches to the ParseTreeVisitor.visit(org.olap4j.mdx.SelectNode) method appropriate to the type of expression.

      Specified by:
      accept in interface ParseTreeNode
      Parameters:
      visitor - Visitor
      Returns:
      T, the specific return type of the visitor
    • unparse

      public void unparse(ParseTreeWriter writer)
      Description copied from interface: ParseTreeNode
      Converts this node into MDX text.
      Specified by:
      unparse in interface ParseTreeNode
      Parameters:
      writer - Parse tree writer
    • toString

      public String toString()
      Overrides:
      toString in class 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(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:
      IllegalArgumentException - if the format of the identifier is invalid
      See Also:
    • ofNames

      public static IdentifierNode ofNames(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: