001 /*
002 // $Id: $
003 // This software is subject to the terms of the Eclipse Public License v1.0
004 // Agreement, available at the following URL:
005 // http://www.eclipse.org/legal/epl-v10.html.
006 // Copyright (C) 2009-2009 Julian Hyde
007 // All Rights Reserved.
008 // You must accept the terms of that agreement to use this software.
009 */
010 package org.olap4j.query;
011
012 import java.util.*;
013
014 /**
015 * Describes which changes were performed to the query model.
016 *
017 * @author Luc Boudreau
018 * @version $Id: $
019 */
020 public final class QueryEvent {
021
022 /**
023 * Describes the nature of the event.
024 */
025 public static enum Type {
026 /**
027 * Event where one or more children of a QueryNode were removed.
028 */
029 CHILDREN_REMOVED,
030 /**
031 * Event where one or more nodes were added as children of a QueryNode.
032 */
033 CHILDREN_ADDED,
034 /**
035 * Event where a Selection object operator was changed.
036 */
037 SELECTION_CHANGED
038 }
039
040 private final QueryNode source;
041 private final QueryEvent.Type operation;
042 private final Map<Integer, QueryNode> children;
043
044 /**
045 * Creates a QueryEvent with a single child.
046 *
047 * @param operation Even type
048 * @param source Query node that generated this event
049 * @param child Child node
050 */
051 QueryEvent(
052 QueryEvent.Type operation,
053 QueryNode source,
054 QueryNode child,
055 int index)
056 {
057 this.children = Collections.singletonMap(index, child);
058 this.source = source;
059 this.operation = operation;
060 }
061
062 /**
063 * Creates a QueryEvent with multiple children.
064 *
065 * @param operation Even type
066 * @param source Query node that generated this event
067 * @param children Child nodes and their indexes within the parent
068 */
069 QueryEvent(
070 QueryEvent.Type operation,
071 QueryNode source,
072 Map<Integer, QueryNode> children)
073 {
074 // copy the map, and make immutable
075 this.children =
076 Collections.unmodifiableMap(
077 new HashMap<Integer, QueryNode>(children));
078 this.source = source;
079 this.operation = operation;
080 }
081
082 /**
083 * Creates a QueryEvent with no children.
084 *
085 * @param operation Even type
086 * @param source Query node that generated this event
087 */
088 QueryEvent(
089 QueryEvent.Type operation,
090 QueryNode source)
091 {
092 this.children = null;
093 this.source = source;
094 this.operation = operation;
095 }
096
097 /**
098 * Returns the object that generated this event.
099 */
100 public QueryNode getSource() {
101 return source;
102 }
103
104 /**
105 * Returns the event type.
106 */
107 // REVIEW: consider renaming to 'getEventType', or rename enum Type to
108 // Operation.
109 public QueryEvent.Type getOperation() {
110 return operation;
111 }
112
113 /**
114 * Returns a map of objects affected by the event and
115 * their index in the list of the source children.
116 *
117 * <p>If the event is of type {@link QueryEvent.Type#SELECTION_CHANGED},
118 * this method will return null because the source object was affected
119 * and not the children.
120 */
121 // REVIEW: 'children' is already plural. Consider renaming to 'getChildren'
122 // or 'getChildNodes'.
123 public Map<Integer, QueryNode> getChildrens() {
124 return children;
125 }
126 }
127
128 // End QueryEvent.java