001 /*
002 // $Id: Selection.java 482 2012-01-05 23:27:27Z jhyde $
003 //
004 // Licensed to Julian Hyde under one or more contributor license
005 // agreements. See the NOTICE file distributed with this work for
006 // additional information regarding copyright ownership.
007 //
008 // Julian Hyde licenses this file to you under the Apache License,
009 // Version 2.0 (the "License"); you may not use this file except in
010 // compliance with the License. You may obtain a copy of the License at:
011 //
012 // http://www.apache.org/licenses/LICENSE-2.0
013 //
014 // Unless required by applicable law or agreed to in writing, software
015 // distributed under the License is distributed on an "AS IS" BASIS,
016 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017 // See the License for the specific language governing permissions and
018 // limitations under the License.
019 */
020 package org.olap4j.query;
021
022 import org.olap4j.mdx.ParseTreeNode;
023 import org.olap4j.metadata.Dimension;
024 import org.olap4j.metadata.MetadataElement;
025
026 import java.util.List;
027
028 /**
029 * A selection of members from an OLAP dimension hierarchy. The selection
030 * is a conceptual list of members from a given hierarchy. Once a selection
031 * object is created, one can decide to include or exclude this selection
032 * of members from the resulting query.
033 *
034 * <p>Concrete subclasses of this represent a real selection.
035 * Selections include things such as 'children of', 'siblings of',
036 * 'descendents of' etc.
037 *
038 * <p>This class is different from a {@link org.olap4j.metadata.Member} because it represents an
039 * abstract member selection (e.g. children of widget' that may not represent
040 * any members whereas a Member represents a single member that is known to
041 * exist.
042 *
043 * @author jdixon, jhyde, Luc Boudreau
044 * @version $Id: Selection.java 482 2012-01-05 23:27:27Z jhyde $
045 * @since May 30, 2007
046 */
047 public interface Selection extends QueryNode {
048
049 /**
050 * Unique name of the selection root.
051 * @return The unique OLAP name of the selection root.
052 */
053 String getUniqueName();
054
055 /**
056 * Visitor pattern-like function to convert
057 * the selection into a ParseTreeNode. Typical
058 * implementation should be:<br/>
059 * <code>Olap4jNodeConverter.toOlap4j(member, operator);</code>
060 * @return A parse tree node of the selection.
061 */
062 ParseTreeNode visit();
063
064 /**
065 * Parent Dimension of the root selection element.
066 * @return A dimension object.
067 */
068 Dimension getDimension();
069
070 /**
071 * Returns the root selection element of this selection.
072 * @return The root metadata object.
073 */
074 MetadataElement getRootElement();
075
076 /**
077 * The selection context includes selections from other dimensions that
078 * help determine the entire context of a selection, so drill down is
079 * possible.
080 *
081 * @return list of selections
082 */
083 List<Selection> getSelectionContext();
084
085 void addContext(Selection selection);
086
087 void removeContext(Selection selection);
088
089 Operator getOperator();
090
091 /**
092 * Set the selection operator to use.
093 * @throws IllegalArgumentException if the operator cannot
094 * be used on the root selection member.
095 * @param operator Operator to apply on the selection.
096 */
097 void setOperator(Operator operator);
098
099 /**
100 * Defines which selection operators are allowed, relative to
101 * a root member.
102 */
103 public enum Operator {
104 /**
105 * Only the root member will be selected.
106 */
107 MEMBER,
108 /**
109 * All members of Level will be selected (LevelSelection only)
110 */
111 MEMBERS,
112 /**
113 * Only the children of the root member will be selected.
114 * This excludes the root member itself.
115 * <p>Implemented via the MDX .Children member property.
116 */
117 CHILDREN,
118 /**
119 * The root member will be selected along with all it's
120 * children.
121 */
122 INCLUDE_CHILDREN,
123 /**
124 * Will select the root member along with all it's siblings.
125 * <p>Implemented via the MDX .Siblings member property.
126 */
127 SIBLINGS,
128 /**
129 * Selects the set of the ascendants of a specified member,
130 * including the member itself.
131 * <p>Implemented via the MDX Ascendants() function.
132 */
133 ANCESTORS,
134 /**
135 * Selects the set of the descendants of a specified member,
136 * including the member itself.
137 * <p>Implemented via the MDX Descendants() function.
138 */
139 DESCENDANTS;
140 }
141 }
142
143 // End Selection.java