001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.execute.rts.RealLastIndexKeyScanStatistics
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.execute.rts;
023:
024: import org.apache.derby.iapi.services.io.StoredFormatIds;
025:
026: import org.apache.derby.iapi.services.i18n.MessageService;
027: import org.apache.derby.iapi.reference.SQLState;
028:
029: import org.apache.derby.iapi.services.io.FormatableHashtable;
030: import org.apache.derby.iapi.services.io.FormatableProperties;
031:
032: import java.io.ObjectOutput;
033: import java.io.ObjectInput;
034: import java.io.IOException;
035:
036: import java.util.Enumeration;
037: import java.util.Properties;
038:
039: /**
040: ResultSetStatistics implemenation for RealLastIndexKeyScanResultSet.
041:
042: @author jamie
043:
044: */
045: public class RealLastIndexKeyScanStatistics extends
046: RealNoPutResultSetStatistics {
047:
048: /* Leave these fields public for object inspectors */
049: public String isolationLevel;
050: public String tableName;
051: public String indexName;
052: public String lockString;
053:
054: // CONSTRUCTORS
055:
056: /**
057: *
058: *
059: */
060: public RealLastIndexKeyScanStatistics(int numOpens,
061: long constructorTime, long openTime, long nextTime,
062: long closeTime, int resultSetNumber, String tableName,
063: String indexName, String isolationLevel, String lockString,
064: double optimizerEstimatedRowCount,
065: double optimizerEstimatedCost) {
066: super (numOpens, 1, 0, constructorTime, openTime, nextTime,
067: closeTime, resultSetNumber, optimizerEstimatedRowCount,
068: optimizerEstimatedCost);
069: this .tableName = tableName;
070: this .indexName = indexName;
071: this .isolationLevel = isolationLevel;
072: this .lockString = lockString;
073: }
074:
075: // ResultSetStatistics methods
076:
077: /**
078: * Return the statement execution plan as a String.
079: *
080: * @param depth Indentation level.
081: *
082: * @return String The statement executio plan as a String.
083: */
084: public String getStatementExecutionPlanText(int depth) {
085: String header;
086: String isolationString = null;
087:
088: initFormatInfo(depth);
089:
090: header = indent
091: + MessageService.getTextMessage(SQLState.RTS_LKIS_RS,
092: tableName, indexName);
093:
094: header = header
095: + MessageService.getTextMessage(
096: SQLState.RTS_LOCKING_OPTIMIZER, isolationLevel,
097: lockString);
098:
099: header = header + "\n";
100:
101: return header
102: + indent
103: + MessageService.getTextMessage(SQLState.RTS_NUM_OPENS)
104: + " = "
105: + numOpens
106: + "\n"
107: + indent
108: + MessageService.getTextMessage(SQLState.RTS_ROWS_SEEN)
109: + " = "
110: + numOpens
111: + "\n"
112: + dumpTimeStats(indent, subIndent)
113: + "\n"
114: + ((rowsSeen > 0) ? subIndent
115: + MessageService
116: .getTextMessage(SQLState.RTS_NEXT_TIME)
117: + " = " + (nextTime / numOpens) + "\n" : "")
118: + "\n" +
119: // RESOLVE - estimated row count and cost will eventually
120: // be displayed for all nodes
121: dumpEstimatedCosts(subIndent);
122: }
123:
124: /**
125: * Return information on the scan nodes from the statement execution
126: * plan as a String.
127: *
128: * @param depth Indentation level.
129: * @param tableName if not NULL then print information for this table only
130: *
131: * @return String The information on the scan nodes from the
132: * statement execution plan as a String.
133: */
134: public String getScanStatisticsText(String tableName, int depth) {
135: if ((tableName == null) || (tableName.equals(this .tableName)))
136: return getStatementExecutionPlanText(depth);
137: else
138: return (String) "";
139: }
140:
141: // Class implementation
142:
143: public String toString() {
144: return getStatementExecutionPlanText(0);
145: }
146:
147: /**
148: * Format for display, a name for this node.
149: *
150: */
151: public String getNodeName() {
152: return MessageService
153: .getTextMessage(indexName == null ? SQLState.RTS_TABLE_SCAN
154: : SQLState.RTS_INDEX_SCAN);
155: }
156:
157: /**
158: * If this node is on a database item (like a table or an index), then provide a
159: * string that describes the on item.
160: *
161: */
162: public String getNodeOn() {
163: if (indexName == null)
164: return MessageService.getTextMessage(SQLState.RTS_ON,
165: tableName);
166: else
167: return MessageService.getTextMessage(SQLState.RTS_ON_USING,
168: tableName, indexName);
169: }
170: }
|