001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.HashNodeList
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: 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: */
021:
022: package org.apache.derby.impl.sql.compile;
023:
024: import org.apache.derby.iapi.error.StandardException;
025:
026: import org.apache.derby.iapi.services.sanity.SanityManager;
027:
028: import java.util.Hashtable;
029: import java.util.Enumeration;
030:
031: /**
032: * HashNodeList is the root class for all hashlists of query tree nodes.
033: * It implements the QueryTree interface that is part of the Language
034: * protocols
035: *
036: * @author Rick Hillegas
037: */
038:
039: public abstract class HashNodeList extends QueryTreeNode {
040: private Hashtable hashtable = new Hashtable();
041:
042: /////////////////////////////////////////////////////////////////
043: //
044: // HASHTABLE FORWARDS
045: //
046: /////////////////////////////////////////////////////////////////
047:
048: /**
049: * Add an element to this hash list.
050: *
051: * @param key hash key for new value
052: * @param value new item to add to list
053: *
054: */
055: public void add(Object key, Object value) {
056: hashtable.put(key, value);
057: }
058:
059: /**
060: * Returns the size of the list.
061: *
062: * @return size of the list
063: */
064: public int size() {
065: return hashtable.size();
066: }
067:
068: /**
069: * Get an iterator to walk this hash list
070: *
071: * @return an Enumeration for walking this hash list
072: */
073: public Enumeration elements() {
074: return hashtable.elements();
075: }
076:
077: /**
078: * Gets an element by key
079: *
080: * @param key hash key to lookup
081: *
082: * @return the element associated with the hash key
083: * null if no element with that key exists
084: *
085: */
086: public Object get(Object key) {
087: return hashtable.get(key);
088: }
089:
090: /////////////////////////////////////////////////////////////////
091: //
092: // OBJECT SUPPORT
093: //
094: /////////////////////////////////////////////////////////////////
095:
096: /**
097: * Convert this object to a String. See comments in QueryTreeNode.java
098: * for how this should be done for tree printing.
099: *
100: * @return This object as a String
101: */
102:
103: public String toString() {
104: if (SanityManager.DEBUG) {
105: Enumeration iterator;
106: StringBuffer buffer = new StringBuffer("");
107: Object item;
108:
109: for (iterator = elements(); iterator.hasMoreElements() == true;) {
110: item = iterator.nextElement();
111: buffer.append(item.toString());
112: buffer.append("\n");
113: }
114:
115: return buffer.toString();
116: } else {
117: return "";
118: }
119: }
120:
121: /////////////////////////////////////////////////////////////////
122: //
123: // QUERY TREE NODE METHODS
124: //
125: /////////////////////////////////////////////////////////////////
126:
127: /**
128: * Get the optimizer's cost estimate for an optimized QueryTree.
129: * For non-optimizable statements (for example, CREATE TABLE),
130: * return null. For optimizable statements, this method will be
131: * over-ridden in the statement's root node (DMLStatementNode in
132: * all cases we know about so far).
133: *
134: * @return null
135: */
136: // public CostEstimate getCostEstimate()
137: // {
138: // return null;
139: // }
140: /**
141: * Returns whether or not this Statement requires a set/clear savepoint
142: * around its execution. The following statement "types" do not require them:
143: * Cursor - unnecessary and won't work in a read only environment
144: * Xact - savepoint will get blown away underneath us during commit/rollback
145: *
146: * @return boolean Whether or not this Statement requires a set/clear savepoint
147: */
148: public boolean needsSavepoint() {
149: if (SanityManager.DEBUG) {
150: SanityManager.ASSERT(false,
151: "needsSavepoint() not expected to be called.");
152: }
153: return false;
154: }
155: }
|