001    /*
002    // $Id: QueryEvent.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 java.util.*;
023    
024    /**
025     * Describes which changes were performed to the query model.
026     *
027     * @author Luc Boudreau
028     * @version $Id: QueryEvent.java 482 2012-01-05 23:27:27Z jhyde $
029     */
030    public final class QueryEvent {
031    
032        /**
033         * Describes the nature of the event.
034         */
035        public static enum Type {
036            /**
037             * Event where one or more children of a QueryNode were removed.
038             */
039            CHILDREN_REMOVED,
040            /**
041             * Event where one or more nodes were added as children of a QueryNode.
042             */
043            CHILDREN_ADDED,
044            /**
045             * Event where a Selection object operator was changed.
046             */
047            SELECTION_CHANGED
048        }
049    
050        private final QueryNode source;
051        private final QueryEvent.Type operation;
052        private final Map<Integer, QueryNode> children;
053    
054        /**
055         * Creates a QueryEvent with a single child.
056         *
057         * @param operation Even type
058         * @param source Query node that generated this event
059         * @param child Child node
060         */
061        QueryEvent(
062            QueryEvent.Type operation,
063            QueryNode source,
064            QueryNode child,
065            int index)
066        {
067            this.children = Collections.singletonMap(index, child);
068            this.source = source;
069            this.operation = operation;
070        }
071    
072        /**
073         * Creates a QueryEvent with multiple children.
074         *
075         * @param operation Even type
076         * @param source Query node that generated this event
077         * @param children Child nodes and their indexes within the parent
078         */
079        QueryEvent(
080            QueryEvent.Type operation,
081            QueryNode source,
082            Map<Integer, QueryNode> children)
083        {
084            // copy the map, and make immutable
085            this.children =
086                Collections.unmodifiableMap(
087                    new HashMap<Integer, QueryNode>(children));
088            this.source = source;
089            this.operation = operation;
090        }
091    
092        /**
093         * Creates a QueryEvent with no children.
094         *
095         * @param operation Even type
096         * @param source Query node that generated this event
097         */
098        QueryEvent(
099            QueryEvent.Type operation,
100            QueryNode source)
101        {
102            this.children = null;
103            this.source = source;
104            this.operation = operation;
105        }
106    
107        /**
108         * Returns the object that generated this event.
109         */
110        public QueryNode getSource() {
111            return source;
112        }
113    
114        /**
115         * Returns the event type.
116         */
117        // REVIEW: consider renaming to 'getEventType', or rename enum Type to
118        // Operation.
119        public QueryEvent.Type getOperation() {
120            return operation;
121        }
122    
123        /**
124         * Returns a map of objects affected by the event and
125         * their index in the list of the source children.
126         *
127         * <p>If the event is of type {@link QueryEvent.Type#SELECTION_CHANGED},
128         * this method will return null because the source object was affected
129         * and not the children.
130         */
131        // REVIEW: 'children' is already plural. Consider renaming to 'getChildren'
132        // or 'getChildNodes'.
133        public Map<Integer, QueryNode> getChildrens() {
134            return children;
135        }
136    }
137    
138    // End QueryEvent.java