--- /dev/null
+/*\r
+\r
+ Derby - Class org.apache.derby.impl.sql.execute.RealResultSetStatisticsFactory\r
+\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to you under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+\r
+ */\r
+\r
+package org.apache.derby.impl.sql.execute;\r
+\r
+import org.apache.derby.iapi.services.sanity.SanityManager;\r
+\r
+import org.apache.derby.iapi.services.io.FormatIdUtil;\r
+\r
+import org.apache.derby.iapi.error.StandardException;\r
+import org.apache.derby.iapi.services.i18n.MessageService;\r
+\r
+import org.apache.derby.iapi.sql.Activation;\r
+import org.apache.derby.iapi.sql.ResultSet;\r
+import org.apache.derby.iapi.sql.PreparedStatement;\r
+\r
+import org.apache.derby.iapi.sql.execute.NoPutResultSet;\r
+import org.apache.derby.iapi.sql.execute.ResultSetFactory;\r
+import org.apache.derby.iapi.sql.execute.ResultSetStatisticsFactory;\r
+\r
+import org.apache.derby.iapi.store.access.TransactionController;\r
+\r
+import org.apache.derby.impl.sql.execute.AnyResultSet;\r
+import org.apache.derby.impl.sql.execute.CurrentOfResultSet;\r
+import org.apache.derby.impl.sql.execute.DeleteResultSet;\r
+import org.apache.derby.impl.sql.execute.DeleteCascadeResultSet;\r
+import org.apache.derby.impl.sql.execute.DeleteVTIResultSet;\r
+import org.apache.derby.impl.sql.execute.DistinctScalarAggregateResultSet;\r
+import org.apache.derby.impl.sql.execute.DistinctScanResultSet;\r
+import org.apache.derby.impl.sql.execute.GroupedAggregateResultSet;\r
+import org.apache.derby.impl.sql.execute.HashJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.HashLeftOuterJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.HashScanResultSet;\r
+import org.apache.derby.impl.sql.execute.HashTableResultSet;\r
+import org.apache.derby.impl.sql.execute.IndexRowToBaseRowResultSet;\r
+import org.apache.derby.impl.sql.execute.InsertResultSet;\r
+import org.apache.derby.impl.sql.execute.InsertVTIResultSet;\r
+import org.apache.derby.impl.sql.execute.LastIndexKeyResultSet;\r
+import org.apache.derby.impl.sql.execute.MaterializedResultSet;\r
+import org.apache.derby.impl.sql.execute.NestedLoopJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.NestedLoopLeftOuterJoinResultSet;\r
+import org.apache.derby.impl.sql.execute.NormalizeResultSet;\r
+import org.apache.derby.impl.sql.execute.OnceResultSet;\r
+import org.apache.derby.impl.sql.execute.ProjectRestrictResultSet;\r
+import org.apache.derby.impl.sql.execute.RowResultSet;\r
+import org.apache.derby.impl.sql.execute.ScalarAggregateResultSet;\r
+import org.apache.derby.impl.sql.execute.ScrollInsensitiveResultSet;\r
+import org.apache.derby.impl.sql.execute.SetOpResultSet;\r
+import org.apache.derby.impl.sql.execute.SortResultSet;\r
+import org.apache.derby.impl.sql.execute.TableScanResultSet;\r
+import org.apache.derby.impl.sql.execute.UnionResultSet;\r
+import org.apache.derby.impl.sql.execute.UpdateResultSet;\r
+import org.apache.derby.impl.sql.execute.VTIResultSet;\r
+import org.apache.derby.impl.sql.execute.DependentResultSet;\r
+\r
+import org.apache.derby.iapi.sql.execute.RunTimeStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealAnyResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealCurrentOfStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDeleteResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDeleteCascadeResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDeleteVTIResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDistinctScalarAggregateStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealDistinctScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealGroupedAggregateStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashLeftOuterJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealHashTableStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealIndexRowToBaseRowStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealInsertResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealInsertVTIResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealJoinResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealLastIndexKeyScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealMaterializedResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealNestedLoopJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealNestedLoopLeftOuterJoinStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealNormalizeResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealOnceResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealProjectRestrictStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealRowResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealScalarAggregateStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealScrollInsensitiveResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealSetOpResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealSortStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealTableScanStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealUnionResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealUpdateResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RealVTIStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.ResultSetStatistics;\r
+import org.apache.derby.impl.sql.execute.rts.RunTimeStatisticsImpl;\r
+\r
+import org.apache.derby.iapi.reference.SQLState;\r
+\r
+import java.util.Properties;\r
+\r
+/**\r
+ * ResultSetStatisticsFactory provides a wrapper around all of\r
+ * objects associated with run time statistics.\r
+ * <p>\r
+ * This implementation of the protocol is for returning the "real"\r
+ * run time statistics. We have modularized this so that we could\r
+ * have an implementation that just returns null for each of the\r
+ * objects should we decided to provide a configuration without\r
+ * the run time statistics feature.\r
+ *\r
+ */\r
+public class RealResultSetStatisticsFactory \r
+ implements ResultSetStatisticsFactory\r
+{\r
+\r
+ //\r
+ // ExecutionFactory interface\r
+ //\r
+ //\r
+ // ResultSetStatisticsFactory interface\r
+ //\r
+\r
+ /**\r
+ @see ResultSetStatisticsFactory#getRunTimeStatistics\r
+ */\r
+ public RunTimeStatistics getRunTimeStatistics(\r
+ Activation activation, \r
+ ResultSet rs,\r
+ NoPutResultSet[] subqueryTrackingArray)\r
+ throws StandardException\r
+ {\r
+ PreparedStatement preStmt = activation.getPreparedStatement();\r
+\r
+ // If the prepared statement is null then the result set is being\r
+ // finished as a result of a activation being closed during a recompile.\r
+ // In this case statistics should not be generated.\r
+ if (preStmt == null)\r
+ return null;\r
+\r
+\r
+\r
+\r
+ ResultSetStatistics topResultSetStatistics;\r
+\r
+ if (rs instanceof NoPutResultSet)\r
+ {\r
+ topResultSetStatistics =\r
+ getResultSetStatistics((NoPutResultSet) rs);\r
+ }\r
+ else\r
+ {\r
+ topResultSetStatistics = getResultSetStatistics(rs);\r
+ }\r
+\r
+ /* Build up the info on the materialized subqueries */\r
+ int subqueryTrackingArrayLength =\r
+ (subqueryTrackingArray == null) ? 0 :\r
+ subqueryTrackingArray.length;\r
+ ResultSetStatistics[] subqueryRSS =\r
+ new ResultSetStatistics[subqueryTrackingArrayLength];\r
+ boolean anyAttached = false;\r
+ for (int index = 0; index < subqueryTrackingArrayLength; index++)\r
+ {\r
+ if (subqueryTrackingArray[index] != null &&\r
+ subqueryTrackingArray[index].getPointOfAttachment() == -1)\r
+ {\r
+ subqueryRSS[index] =\r
+ getResultSetStatistics(subqueryTrackingArray[index]);\r
+ anyAttached = true;\r
+ }\r
+ }\r
+ if (anyAttached == false)\r
+ {\r
+ subqueryRSS = null;\r
+ }\r
+\r
+ // Get the info on all of the materialized subqueries (attachment point = -1)\r
+ return new RunTimeStatisticsImpl(\r
+ preStmt.getSPSName(),\r
+ activation.getCursorName(),\r
+ preStmt.getSource(),\r
+ preStmt.getCompileTimeInMillis(),\r
+ preStmt.getParseTimeInMillis(),\r
+ preStmt.getBindTimeInMillis(),\r
+ preStmt.getOptimizeTimeInMillis(),\r
+ preStmt.getGenerateTimeInMillis(),\r
+ rs.getExecuteTime(),\r
+ preStmt.getBeginCompileTimestamp(),\r
+ preStmt.getEndCompileTimestamp(),\r
+ rs.getBeginExecutionTimestamp(),\r
+ rs.getEndExecutionTimestamp(),\r
+ subqueryRSS,\r
+ topResultSetStatistics);\r
+ }\r
+\r
+ /**\r
+ @see ResultSetStatisticsFactory#getResultSetStatistics\r
+ */\r
+ public ResultSetStatistics getResultSetStatistics(ResultSet rs)\r
+ {\r
+ if (!rs.returnsRows())\r
+ {\r
+ return getNoRowsResultSetStatistics(rs);\r
+ }\r
+ else if (rs instanceof NoPutResultSet)\r
+ {\r
+ return getResultSetStatistics((NoPutResultSet) rs);\r
+ }\r
+ else\r
+ {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public ResultSetStatistics getNoRowsResultSetStatistics(ResultSet rs)\r
+ {\r
+ ResultSetStatistics retval = null;\r
+\r
+ /* We need to differentiate based on instanceof in order\r
+ * to find the right constructor to call. This is ugly,\r
+ * but if we don't do instanceof then rs is always seen as an\r
+ * interface instead of a class when we try to overload \r
+ * a method with both.\r
+ */\r
+ if( rs instanceof InsertResultSet)\r
+ {\r
+ InsertResultSet irs = (InsertResultSet) rs;\r
+\r
+ retval = new RealInsertResultSetStatistics(\r
+ irs.rowCount,\r
+ irs.constants.deferred,\r
+ irs.constants.irgs.length,\r
+ irs.userSpecifiedBulkInsert,\r
+ irs.bulkInsertPerformed,\r
+ irs.constants.lockMode ==\r
+ TransactionController.MODE_TABLE,\r
+ irs.getExecuteTime(), \r
+ getResultSetStatistics(irs.savedSource)\r
+ );\r
+\r
+ irs.savedSource = null;\r
+ }\r
+ else if( rs instanceof InsertVTIResultSet)\r
+ {\r
+ InsertVTIResultSet iVTIrs = (InsertVTIResultSet) rs;\r
+\r
+ retval = new RealInsertVTIResultSetStatistics(\r
+ iVTIrs.rowCount,\r
+ iVTIrs.constants.deferred,\r
+ iVTIrs.getExecuteTime(), \r
+ getResultSetStatistics(iVTIrs.savedSource)\r
+ );\r
+\r
+ iVTIrs.savedSource = null;\r
+ }\r
+ else if( rs instanceof UpdateResultSet)\r
+ {\r
+ UpdateResultSet urs = (UpdateResultSet) rs;\r
+\r
+ retval = new RealUpdateResultSetStatistics(\r
+ urs.rowCount,\r
+ urs.constants.deferred,\r
+ urs.constants.irgs.length,\r
+ urs.constants.lockMode ==\r
+ TransactionController.MODE_TABLE,\r
+ urs.getExecuteTime(),\r
+ getResultSetStatistics(urs.savedSource)\r
+ );\r
+\r
+ urs.savedSource = null;\r
+ }\r
+ else if( rs instanceof DeleteCascadeResultSet)\r
+ {\r
+ DeleteCascadeResultSet dcrs = (DeleteCascadeResultSet) rs;\r
+ int dependentTrackingArrayLength =\r
+ (dcrs.dependentResultSets == null) ? 0 :\r
+ dcrs.dependentResultSets.length;\r
+ ResultSetStatistics[] dependentTrackingArray =\r
+ new ResultSetStatistics[dependentTrackingArrayLength];\r
+ boolean anyAttached = false;\r
+ for (int index = 0; index < dependentTrackingArrayLength; index++)\r
+ {\r
+ if (dcrs.dependentResultSets[index] != null)\r
+ {\r
+ dependentTrackingArray[index] =\r
+ getResultSetStatistics(\r
+ dcrs.dependentResultSets[index]);\r
+ anyAttached = true;\r
+ }\r
+ }\r
+ if (! anyAttached)\r
+ {\r
+ dependentTrackingArray = null;\r
+ }\r
+\r
+ retval = new RealDeleteCascadeResultSetStatistics(\r
+ dcrs.rowCount,\r
+ dcrs.constants.deferred,\r
+ dcrs.constants.irgs.length,\r
+ dcrs.constants.lockMode ==\r
+ TransactionController.MODE_TABLE,\r
+ dcrs.getExecuteTime(),\r
+ getResultSetStatistics(dcrs.savedSource),\r
+ dependentTrackingArray\r
+ );\r
+\r
+ dcrs.savedSource = null;\r
+ }\r
+ else if( rs instanceof DeleteResultSet)\r
+ {\r
+ DeleteResultSet drs = (DeleteResultSet) rs;\r
+\r
+ retval = new RealDeleteResultSetStatistics(\r
+ drs.rowCount,\r
+ drs.constants.deferred,\r
+ drs.constants.irgs.length,\r
+ drs.constants.lockMode ==\r
+ TransactionController.MODE_TABLE,\r
+ drs.getExecuteTime(),\r
+ getResultSetStatistics(drs.savedSource)\r
+ );\r
+\r
+ drs.savedSource = null;\r
+ }\r
+ else if( rs instanceof DeleteVTIResultSet)\r
+ {\r
+ DeleteVTIResultSet dVTIrs = (DeleteVTIResultSet) rs;\r
+\r
+ retval = new RealDeleteVTIResultSetStatistics(\r
+ dVTIrs.rowCount,\r
+ dVTIrs.getExecuteTime(), \r
+ getResultSetStatistics(dVTIrs.savedSource)\r
+ );\r
+\r
+ dVTIrs.savedSource = null;\r
+ }\r
+\r
+\r
+ return retval;\r
+ }\r
+\r
+ public ResultSetStatistics getResultSetStatistics(NoPutResultSet rs)\r
+ {\r
+ /* We need to differentiate based on instanceof in order\r
+ * to find the right constructor to call. This is ugly,\r
+ * but if we don't do instanceof then rs is always seen as an\r
+ * interface instead of a class when we try to overload \r
+ * a method with both.\r
+ */\r
+ if( rs instanceof ProjectRestrictResultSet)\r
+ {\r
+ ProjectRestrictResultSet prrs = (ProjectRestrictResultSet) rs;\r
+ int subqueryTrackingArrayLength =\r
+ (prrs.subqueryTrackingArray == null) ? 0 :\r
+ prrs.subqueryTrackingArray.length;\r
+ ResultSetStatistics[] subqueryTrackingArray =\r
+ new ResultSetStatistics[subqueryTrackingArrayLength];\r
+ boolean anyAttached = false;\r
+ for (int index = 0; index < subqueryTrackingArrayLength; index++)\r
+ {\r
+ if (prrs.subqueryTrackingArray[index] != null &&\r
+ prrs.subqueryTrackingArray[index].getPointOfAttachment() ==\r
+ prrs.resultSetNumber)\r
+ {\r
+ subqueryTrackingArray[index] =\r
+ getResultSetStatistics(\r
+ prrs.subqueryTrackingArray[index]);\r
+ anyAttached = true;\r
+ }\r
+ }\r
+ if (! anyAttached)\r
+ {\r
+ subqueryTrackingArray = null;\r
+ }\r
+\r
+ return new RealProjectRestrictStatistics(\r
+ prrs.numOpens,\r
+ prrs.rowsSeen,\r
+ prrs.rowsFiltered,\r
+ prrs.constructorTime,\r
+ prrs.openTime,\r
+ prrs.nextTime,\r
+ prrs.closeTime,\r
+ prrs.resultSetNumber,\r
+ prrs.restrictionTime,\r
+ prrs.projectionTime,\r
+ subqueryTrackingArray,\r
+ (prrs.restriction != null),\r
+ prrs.doesProjection,\r
+ prrs.optimizerEstimatedRowCount,\r
+ prrs.optimizerEstimatedCost,\r
+ getResultSetStatistics(prrs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof SortResultSet)\r
+ {\r
+ SortResultSet srs = (SortResultSet) rs;\r
+\r
+ return new RealSortStatistics(\r
+ srs.numOpens,\r
+ srs.rowsSeen,\r
+ srs.rowsFiltered,\r
+ srs.constructorTime,\r
+ srs.openTime,\r
+ srs.nextTime,\r
+ srs.closeTime,\r
+ srs.resultSetNumber,\r
+ srs.rowsInput,\r
+ srs.rowsReturned,\r
+ srs.distinct,\r
+ srs.isInSortedOrder,\r
+ srs.sortProperties,\r
+ srs.optimizerEstimatedRowCount,\r
+ srs.optimizerEstimatedCost,\r
+ getResultSetStatistics(srs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof DistinctScalarAggregateResultSet)\r
+ {\r
+ DistinctScalarAggregateResultSet dsars = (DistinctScalarAggregateResultSet) rs;\r
+\r
+ return new RealDistinctScalarAggregateStatistics(\r
+ dsars.numOpens,\r
+ dsars.rowsSeen,\r
+ dsars.rowsFiltered,\r
+ dsars.constructorTime,\r
+ dsars.openTime,\r
+ dsars.nextTime,\r
+ dsars.closeTime,\r
+ dsars.resultSetNumber,\r
+ dsars.rowsInput,\r
+ dsars.optimizerEstimatedRowCount,\r
+ dsars.optimizerEstimatedCost,\r
+ getResultSetStatistics(dsars.source)\r
+ );\r
+ }\r
+ else if (rs instanceof ScalarAggregateResultSet)\r
+ {\r
+ ScalarAggregateResultSet sars = (ScalarAggregateResultSet) rs;\r
+\r
+ return new RealScalarAggregateStatistics(\r
+ sars.numOpens,\r
+ sars.rowsSeen,\r
+ sars.rowsFiltered,\r
+ sars.constructorTime,\r
+ sars.openTime,\r
+ sars.nextTime,\r
+ sars.closeTime,\r
+ sars.resultSetNumber,\r
+ sars.singleInputRow,\r
+ sars.rowsInput,\r
+ sars.optimizerEstimatedRowCount,\r
+ sars.optimizerEstimatedCost,\r
+ getResultSetStatistics(sars.source)\r
+ );\r
+ }\r
+ else if (rs instanceof GroupedAggregateResultSet)\r
+ {\r
+ GroupedAggregateResultSet gars = (GroupedAggregateResultSet) rs;\r
+\r
+ return new RealGroupedAggregateStatistics(\r
+ gars.numOpens,\r
+ gars.rowsSeen,\r
+ gars.rowsFiltered,\r
+ gars.constructorTime,\r
+ gars.openTime,\r
+ gars.nextTime,\r
+ gars.closeTime,\r
+ gars.resultSetNumber,\r
+ gars.rowsInput,\r
+ gars.hasDistinctAggregate,\r
+ gars.isInSortedOrder,\r
+ gars.sortProperties,\r
+ gars.optimizerEstimatedRowCount,\r
+ gars.optimizerEstimatedCost,\r
+ getResultSetStatistics(gars.source)\r
+ );\r
+ }\r
+ else if (rs instanceof TableScanResultSet)\r
+ {\r
+ boolean instantaneousLocks = false;\r
+ TableScanResultSet tsrs = (TableScanResultSet) rs;\r
+ String startPosition = null;\r
+ String stopPosition = null;\r
+ String isolationLevel = null;\r
+ String lockString = null;\r
+ String lockRequestString = null;\r
+\r
+ switch (tsrs.isolationLevel)\r
+ {\r
+ case TransactionController.ISOLATION_SERIALIZABLE:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_SERIALIZABLE);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_REPEATABLE_READ:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_REPEATABLE_READ);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+ instantaneousLocks = true;\r
+ //fall through\r
+ case TransactionController.ISOLATION_READ_COMMITTED:\r
+ isolationLevel = MessageService.getTextMessage(\r
+ SQLState.LANG_READ_COMMITTED);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_UNCOMMITTED:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_READ_UNCOMMITTED);\r
+ break;\r
+ }\r
+\r
+ if (tsrs.forUpdate)\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_EXCLUSIVE);\r
+ }\r
+ else\r
+ {\r
+ if (instantaneousLocks)\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_INSTANTANEOUS_SHARE);\r
+ }\r
+ else\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_SHARE);\r
+ }\r
+ }\r
+\r
+ switch (tsrs.lockMode)\r
+ {\r
+ case TransactionController.MODE_TABLE:\r
+ // RESOLVE: Not sure this will really work, as we\r
+ // are tacking together English words to make a phrase.\r
+ // Will this work in other languages?\r
+ lockRequestString = lockString + " " +\r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_TABLE);\r
+ break;\r
+\r
+ case TransactionController.MODE_RECORD:\r
+ // RESOLVE: Not sure this will really work, as we\r
+ // are tacking together English words to make a phrase.\r
+ // Will this work in other languages?\r
+ lockRequestString = lockString + " " +\r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_ROW);\r
+ break;\r
+ }\r
+\r
+ if (tsrs.indexName != null)\r
+ {\r
+ /* Start and stop position strings will be non-null\r
+ * if the TSRS has been closed. Otherwise, we go off\r
+ * and build the strings now.\r
+ */\r
+ startPosition = tsrs.startPositionString;\r
+ if (startPosition == null)\r
+ {\r
+ startPosition = tsrs.printStartPosition();\r
+ }\r
+ stopPosition = tsrs.stopPositionString;\r
+ if (stopPosition == null)\r
+ {\r
+ stopPosition = tsrs.printStopPosition();\r
+ }\r
+ }\r
+\r
+ return new \r
+ RealTableScanStatistics(\r
+ tsrs.numOpens,\r
+ tsrs.rowsSeen,\r
+ tsrs.rowsFiltered,\r
+ tsrs.constructorTime,\r
+ tsrs.openTime,\r
+ tsrs.nextTime,\r
+ tsrs.closeTime,\r
+ tsrs.resultSetNumber,\r
+ tsrs.tableName,\r
+ tsrs.userSuppliedOptimizerOverrides,\r
+ tsrs.indexName,\r
+ tsrs.isConstraint,\r
+ tsrs.printQualifiers(tsrs.qualifiers),\r
+ tsrs.getScanProperties(),\r
+ startPosition,\r
+ stopPosition,\r
+ isolationLevel,\r
+ lockRequestString,\r
+ tsrs.rowsPerRead,\r
+ tsrs.coarserLock,\r
+ tsrs.optimizerEstimatedRowCount,\r
+ tsrs.optimizerEstimatedCost);\r
+ }\r
+\r
+ else if (rs instanceof LastIndexKeyResultSet )\r
+ {\r
+ LastIndexKeyResultSet lrs = (LastIndexKeyResultSet) rs;\r
+ String isolationLevel = null;\r
+ String lockRequestString = null;\r
+\r
+ switch (lrs.isolationLevel)\r
+ {\r
+ case TransactionController.ISOLATION_SERIALIZABLE:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_SERIALIZABLE);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_REPEATABLE_READ:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_REPEATABLE_READ);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+ case TransactionController.ISOLATION_READ_COMMITTED:\r
+ isolationLevel = MessageService.getTextMessage(\r
+ SQLState.LANG_READ_COMMITTED);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_UNCOMMITTED:\r
+ isolationLevel = MessageService.getTextMessage(\r
+ SQLState.LANG_READ_UNCOMMITTED);\r
+ break;\r
+ }\r
+\r
+ switch (lrs.lockMode)\r
+ {\r
+ case TransactionController.MODE_TABLE:\r
+ lockRequestString = MessageService.getTextMessage(\r
+ SQLState.LANG_SHARE_TABLE);\r
+ break;\r
+\r
+ case TransactionController.MODE_RECORD:\r
+ lockRequestString = MessageService.getTextMessage(\r
+ SQLState.LANG_SHARE_ROW);\r
+ break;\r
+ }\r
+\r
+ return new RealLastIndexKeyScanStatistics(\r
+ lrs.numOpens,\r
+ lrs.constructorTime,\r
+ lrs.openTime,\r
+ lrs.nextTime,\r
+ lrs.closeTime,\r
+ lrs.resultSetNumber,\r
+ lrs.tableName,\r
+ lrs.indexName,\r
+ isolationLevel,\r
+ lockRequestString,\r
+ lrs.optimizerEstimatedRowCount,\r
+ lrs.optimizerEstimatedCost);\r
+ }\r
+ else if (rs instanceof HashLeftOuterJoinResultSet)\r
+ {\r
+ HashLeftOuterJoinResultSet hlojrs =\r
+ (HashLeftOuterJoinResultSet) rs;\r
+\r
+ return new RealHashLeftOuterJoinStatistics(\r
+ hlojrs.numOpens,\r
+ hlojrs.rowsSeen,\r
+ hlojrs.rowsFiltered,\r
+ hlojrs.constructorTime,\r
+ hlojrs.openTime,\r
+ hlojrs.nextTime,\r
+ hlojrs.closeTime,\r
+ hlojrs.resultSetNumber,\r
+ hlojrs.rowsSeenLeft,\r
+ hlojrs.rowsSeenRight,\r
+ hlojrs.rowsReturned,\r
+ hlojrs.restrictionTime,\r
+ hlojrs.optimizerEstimatedRowCount,\r
+ hlojrs.optimizerEstimatedCost,\r
+ hlojrs.userSuppliedOptimizerOverrides,\r
+ getResultSetStatistics(\r
+ hlojrs.leftResultSet),\r
+ getResultSetStatistics(\r
+ hlojrs.rightResultSet),\r
+ hlojrs.emptyRightRowsReturned);\r
+ }\r
+ else if (rs instanceof NestedLoopLeftOuterJoinResultSet)\r
+ {\r
+ NestedLoopLeftOuterJoinResultSet nllojrs =\r
+ (NestedLoopLeftOuterJoinResultSet) rs;\r
+\r
+ return new RealNestedLoopLeftOuterJoinStatistics(\r
+ nllojrs.numOpens,\r
+ nllojrs.rowsSeen,\r
+ nllojrs.rowsFiltered,\r
+ nllojrs.constructorTime,\r
+ nllojrs.openTime,\r
+ nllojrs.nextTime,\r
+ nllojrs.closeTime,\r
+ nllojrs.resultSetNumber,\r
+ nllojrs.rowsSeenLeft,\r
+ nllojrs.rowsSeenRight,\r
+ nllojrs.rowsReturned,\r
+ nllojrs.restrictionTime,\r
+ nllojrs.optimizerEstimatedRowCount,\r
+ nllojrs.optimizerEstimatedCost,\r
+ nllojrs.userSuppliedOptimizerOverrides,\r
+ getResultSetStatistics(\r
+ nllojrs.leftResultSet),\r
+ getResultSetStatistics(\r
+ nllojrs.rightResultSet),\r
+ nllojrs.emptyRightRowsReturned);\r
+ }\r
+ else if (rs instanceof HashJoinResultSet)\r
+ {\r
+ HashJoinResultSet hjrs = (HashJoinResultSet) rs;\r
+\r
+ return new RealHashJoinStatistics(\r
+ hjrs.numOpens,\r
+ hjrs.rowsSeen,\r
+ hjrs.rowsFiltered,\r
+ hjrs.constructorTime,\r
+ hjrs.openTime,\r
+ hjrs.nextTime,\r
+ hjrs.closeTime,\r
+ hjrs.resultSetNumber,\r
+ hjrs.rowsSeenLeft,\r
+ hjrs.rowsSeenRight,\r
+ hjrs.rowsReturned,\r
+ hjrs.restrictionTime,\r
+ hjrs.oneRowRightSide,\r
+ hjrs.optimizerEstimatedRowCount,\r
+ hjrs.optimizerEstimatedCost,\r
+ hjrs.userSuppliedOptimizerOverrides,\r
+ getResultSetStatistics(\r
+ hjrs.leftResultSet),\r
+ getResultSetStatistics(\r
+ hjrs.rightResultSet)\r
+ );\r
+ }\r
+ else if (rs instanceof NestedLoopJoinResultSet)\r
+ {\r
+ NestedLoopJoinResultSet nljrs = (NestedLoopJoinResultSet) rs;\r
+\r
+ return new RealNestedLoopJoinStatistics(\r
+ nljrs.numOpens,\r
+ nljrs.rowsSeen,\r
+ nljrs.rowsFiltered,\r
+ nljrs.constructorTime,\r
+ nljrs.openTime,\r
+ nljrs.nextTime,\r
+ nljrs.closeTime,\r
+ nljrs.resultSetNumber,\r
+ nljrs.rowsSeenLeft,\r
+ nljrs.rowsSeenRight,\r
+ nljrs.rowsReturned,\r
+ nljrs.restrictionTime,\r
+ nljrs.oneRowRightSide,\r
+ nljrs.optimizerEstimatedRowCount,\r
+ nljrs.optimizerEstimatedCost,\r
+ nljrs.userSuppliedOptimizerOverrides,\r
+ getResultSetStatistics(\r
+ nljrs.leftResultSet),\r
+ getResultSetStatistics(\r
+ nljrs.rightResultSet)\r
+ );\r
+ }\r
+ else if (rs instanceof IndexRowToBaseRowResultSet)\r
+ {\r
+ IndexRowToBaseRowResultSet irtbrrs =\r
+ (IndexRowToBaseRowResultSet) rs;\r
+\r
+ return new RealIndexRowToBaseRowStatistics(\r
+ irtbrrs.numOpens,\r
+ irtbrrs.rowsSeen,\r
+ irtbrrs.rowsFiltered,\r
+ irtbrrs.constructorTime,\r
+ irtbrrs.openTime,\r
+ irtbrrs.nextTime,\r
+ irtbrrs.closeTime,\r
+ irtbrrs.resultSetNumber,\r
+ irtbrrs.indexName,\r
+ irtbrrs.accessedHeapCols,\r
+ irtbrrs.optimizerEstimatedRowCount,\r
+ irtbrrs.optimizerEstimatedCost,\r
+ getResultSetStatistics(\r
+ irtbrrs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof RowResultSet)\r
+ {\r
+ RowResultSet rrs = (RowResultSet) rs;\r
+\r
+ return new RealRowResultSetStatistics(\r
+ rrs.numOpens,\r
+ rrs.rowsSeen,\r
+ rrs.rowsFiltered,\r
+ rrs.constructorTime,\r
+ rrs.openTime,\r
+ rrs.nextTime,\r
+ rrs.closeTime,\r
+ rrs.resultSetNumber,\r
+ rrs.rowsReturned,\r
+ rrs.optimizerEstimatedRowCount,\r
+ rrs.optimizerEstimatedCost);\r
+ }\r
+ else if (rs instanceof SetOpResultSet)\r
+ {\r
+ SetOpResultSet srs = (SetOpResultSet) rs;\r
+\r
+ return new RealSetOpResultSetStatistics(\r
+ srs.getOpType(),\r
+ srs.numOpens,\r
+ srs.rowsSeen,\r
+ srs.rowsFiltered,\r
+ srs.constructorTime,\r
+ srs.openTime,\r
+ srs.nextTime,\r
+ srs.closeTime,\r
+ srs.getResultSetNumber(),\r
+ srs.getRowsSeenLeft(),\r
+ srs.getRowsSeenRight(),\r
+ srs.getRowsReturned(),\r
+ srs.optimizerEstimatedRowCount,\r
+ srs.optimizerEstimatedCost,\r
+ getResultSetStatistics(srs.getLeftSourceInput()),\r
+ getResultSetStatistics(srs.getRightSourceInput())\r
+ );\r
+ }\r
+ else if (rs instanceof UnionResultSet)\r
+ {\r
+ UnionResultSet urs = (UnionResultSet)rs;\r
+\r
+ return new RealUnionResultSetStatistics(\r
+ urs.numOpens,\r
+ urs.rowsSeen,\r
+ urs.rowsFiltered,\r
+ urs.constructorTime,\r
+ urs.openTime,\r
+ urs.nextTime,\r
+ urs.closeTime,\r
+ urs.resultSetNumber,\r
+ urs.rowsSeenLeft,\r
+ urs.rowsSeenRight,\r
+ urs.rowsReturned,\r
+ urs.optimizerEstimatedRowCount,\r
+ urs.optimizerEstimatedCost,\r
+ getResultSetStatistics(urs.source1),\r
+ getResultSetStatistics(urs.source2)\r
+ );\r
+ }\r
+ else if (rs instanceof AnyResultSet)\r
+ {\r
+ AnyResultSet ars = (AnyResultSet) rs;\r
+\r
+ return new RealAnyResultSetStatistics(\r
+ ars.numOpens,\r
+ ars.rowsSeen,\r
+ ars.rowsFiltered,\r
+ ars.constructorTime,\r
+ ars.openTime,\r
+ ars.nextTime,\r
+ ars.closeTime,\r
+ ars.resultSetNumber,\r
+ ars.subqueryNumber,\r
+ ars.pointOfAttachment,\r
+ ars.optimizerEstimatedRowCount,\r
+ ars.optimizerEstimatedCost,\r
+ getResultSetStatistics(ars.source)\r
+ );\r
+ }\r
+ else if (rs instanceof OnceResultSet)\r
+ {\r
+ OnceResultSet ors = (OnceResultSet) rs;\r
+\r
+ return new RealOnceResultSetStatistics(\r
+ ors.numOpens,\r
+ ors.rowsSeen,\r
+ ors.rowsFiltered,\r
+ ors.constructorTime,\r
+ ors.openTime,\r
+ ors.nextTime,\r
+ ors.closeTime,\r
+ ors.resultSetNumber,\r
+ ors.subqueryNumber,\r
+ ors.pointOfAttachment,\r
+ ors.optimizerEstimatedRowCount,\r
+ ors.optimizerEstimatedCost,\r
+ getResultSetStatistics(ors.source)\r
+ );\r
+ }\r
+ else if (rs instanceof NormalizeResultSet)\r
+ {\r
+ NormalizeResultSet nrs = (NormalizeResultSet) rs;\r
+\r
+ return new RealNormalizeResultSetStatistics(\r
+ nrs.numOpens,\r
+ nrs.rowsSeen,\r
+ nrs.rowsFiltered,\r
+ nrs.constructorTime,\r
+ nrs.openTime,\r
+ nrs.nextTime,\r
+ nrs.closeTime,\r
+ nrs.resultSetNumber,\r
+ nrs.optimizerEstimatedRowCount,\r
+ nrs.optimizerEstimatedCost,\r
+ getResultSetStatistics(nrs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof MaterializedResultSet)\r
+ {\r
+ MaterializedResultSet mrs = (MaterializedResultSet) rs;\r
+\r
+ return new RealMaterializedResultSetStatistics(\r
+ mrs.numOpens,\r
+ mrs.rowsSeen,\r
+ mrs.rowsFiltered,\r
+ mrs.constructorTime,\r
+ mrs.openTime,\r
+ mrs.nextTime,\r
+ mrs.closeTime,\r
+ mrs.createTCTime,\r
+ mrs.fetchTCTime,\r
+ mrs.resultSetNumber,\r
+ mrs.optimizerEstimatedRowCount,\r
+ mrs.optimizerEstimatedCost,\r
+ getResultSetStatistics(mrs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof ScrollInsensitiveResultSet)\r
+ {\r
+ ScrollInsensitiveResultSet sirs = (ScrollInsensitiveResultSet) rs;\r
+\r
+ return new RealScrollInsensitiveResultSetStatistics(\r
+ sirs.numOpens,\r
+ sirs.rowsSeen,\r
+ sirs.rowsFiltered,\r
+ sirs.constructorTime,\r
+ sirs.openTime,\r
+ sirs.nextTime,\r
+ sirs.closeTime,\r
+ sirs.numFromHashTable,\r
+ sirs.numToHashTable,\r
+ sirs.resultSetNumber,\r
+ sirs.optimizerEstimatedRowCount,\r
+ sirs.optimizerEstimatedCost,\r
+ getResultSetStatistics(sirs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof CurrentOfResultSet)\r
+ {\r
+ CurrentOfResultSet cors = (CurrentOfResultSet) rs;\r
+\r
+ return new RealCurrentOfStatistics(\r
+ cors.numOpens,\r
+ cors.rowsSeen,\r
+ cors.rowsFiltered,\r
+ cors.constructorTime,\r
+ cors.openTime,\r
+ cors.nextTime,\r
+ cors.closeTime,\r
+ cors.resultSetNumber\r
+ );\r
+ }\r
+ else if (rs instanceof HashScanResultSet)\r
+ {\r
+ boolean instantaneousLocks = false;\r
+ HashScanResultSet hsrs = (HashScanResultSet) rs;\r
+ String startPosition = null;\r
+ String stopPosition = null;\r
+ String isolationLevel = null;\r
+ String lockString = null;\r
+\r
+ switch (hsrs.isolationLevel)\r
+ {\r
+ case TransactionController.ISOLATION_SERIALIZABLE:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_SERIALIZABLE);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_REPEATABLE_READ:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_REPEATABLE_READ);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+ instantaneousLocks = true;\r
+ //fall through\r
+ case TransactionController.ISOLATION_READ_COMMITTED:\r
+ isolationLevel = MessageService.getTextMessage(\r
+ SQLState.LANG_READ_COMMITTED);\r
+ break;\r
+\r
+ }\r
+\r
+ if (hsrs.forUpdate)\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_EXCLUSIVE);\r
+ }\r
+ else\r
+ {\r
+ if (instantaneousLocks)\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_INSTANTANEOUS_SHARE);\r
+ }\r
+ else\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_SHARE);\r
+ }\r
+ }\r
+\r
+ switch (hsrs.lockMode)\r
+ {\r
+ case TransactionController.MODE_TABLE:\r
+ // RESOLVE: Not sure this will really work, as we\r
+ // are tacking together English words to make a phrase.\r
+ // Will this work in other languages?\r
+ lockString = lockString + " " +\r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_TABLE);\r
+ break;\r
+\r
+ case TransactionController.MODE_RECORD:\r
+ // RESOLVE: Not sure this will really work, as we\r
+ // are tacking together English words to make a phrase.\r
+ // Will this work in other languages?\r
+ lockString = lockString + " " +\r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_ROW);\r
+ break;\r
+ }\r
+\r
+ if (hsrs.indexName != null)\r
+ {\r
+ /* Start and stop position strings will be non-null\r
+ * if the HSRS has been closed. Otherwise, we go off\r
+ * and build the strings now.\r
+ */\r
+ startPosition = hsrs.startPositionString;\r
+ if (startPosition == null)\r
+ {\r
+ startPosition = hsrs.printStartPosition();\r
+ }\r
+ stopPosition = hsrs.stopPositionString;\r
+ if (stopPosition == null)\r
+ {\r
+ stopPosition = hsrs.printStopPosition();\r
+ }\r
+ }\r
+\r
+ // DistinctScanResultSet is simple sub-class of\r
+ // HashScanResultSet\r
+ if (rs instanceof DistinctScanResultSet)\r
+ {\r
+ return new RealDistinctScanStatistics(\r
+ hsrs.numOpens,\r
+ hsrs.rowsSeen,\r
+ hsrs.rowsFiltered,\r
+ hsrs.constructorTime,\r
+ hsrs.openTime,\r
+ hsrs.nextTime,\r
+ hsrs.closeTime,\r
+ hsrs.resultSetNumber,\r
+ hsrs.tableName,\r
+ hsrs.indexName,\r
+ hsrs.isConstraint,\r
+ hsrs.hashtableSize,\r
+ hsrs.keyColumns,\r
+ hsrs.printQualifiers(\r
+ hsrs.scanQualifiers),\r
+ hsrs.printQualifiers(\r
+ hsrs.nextQualifiers),\r
+ hsrs.getScanProperties(),\r
+ startPosition,\r
+ stopPosition,\r
+ isolationLevel,\r
+ lockString,\r
+ hsrs.optimizerEstimatedRowCount,\r
+ hsrs.optimizerEstimatedCost\r
+ );\r
+ }\r
+ else\r
+ {\r
+ return new RealHashScanStatistics(\r
+ hsrs.numOpens,\r
+ hsrs.rowsSeen,\r
+ hsrs.rowsFiltered,\r
+ hsrs.constructorTime,\r
+ hsrs.openTime,\r
+ hsrs.nextTime,\r
+ hsrs.closeTime,\r
+ hsrs.resultSetNumber,\r
+ hsrs.tableName,\r
+ hsrs.indexName,\r
+ hsrs.isConstraint,\r
+ hsrs.hashtableSize,\r
+ hsrs.keyColumns,\r
+ hsrs.printQualifiers(\r
+ hsrs.scanQualifiers),\r
+ hsrs.printQualifiers(\r
+ hsrs.nextQualifiers),\r
+ hsrs.getScanProperties(),\r
+ startPosition,\r
+ stopPosition,\r
+ isolationLevel,\r
+ lockString,\r
+ hsrs.optimizerEstimatedRowCount,\r
+ hsrs.optimizerEstimatedCost\r
+ );\r
+ }\r
+ }\r
+ else if (rs instanceof HashTableResultSet)\r
+ {\r
+ HashTableResultSet htrs = (HashTableResultSet) rs;\r
+ int subqueryTrackingArrayLength =\r
+ (htrs.subqueryTrackingArray == null) ? 0 :\r
+ htrs.subqueryTrackingArray.length;\r
+ ResultSetStatistics[] subqueryTrackingArray =\r
+ new ResultSetStatistics[subqueryTrackingArrayLength];\r
+ boolean anyAttached = false;\r
+ for (int index = 0; index < subqueryTrackingArrayLength; index++)\r
+ {\r
+ if (htrs.subqueryTrackingArray[index] != null &&\r
+ htrs.subqueryTrackingArray[index].getPointOfAttachment() ==\r
+ htrs.resultSetNumber)\r
+ {\r
+ subqueryTrackingArray[index] =\r
+ getResultSetStatistics(\r
+ htrs.subqueryTrackingArray[index]);\r
+ anyAttached = true;\r
+ }\r
+ }\r
+ if (! anyAttached)\r
+ {\r
+ subqueryTrackingArray = null;\r
+ }\r
+\r
+ return new \r
+ RealHashTableStatistics(\r
+ htrs.numOpens,\r
+ htrs.rowsSeen,\r
+ htrs.rowsFiltered,\r
+ htrs.constructorTime,\r
+ htrs.openTime,\r
+ htrs.nextTime,\r
+ htrs.closeTime,\r
+ htrs.resultSetNumber,\r
+ htrs.hashtableSize,\r
+ htrs.keyColumns,\r
+ HashScanResultSet.printQualifiers(\r
+ htrs.nextQualifiers),\r
+ htrs.scanProperties,\r
+ htrs.optimizerEstimatedRowCount,\r
+ htrs.optimizerEstimatedCost,\r
+ subqueryTrackingArray,\r
+ getResultSetStatistics(htrs.source)\r
+ );\r
+ }\r
+ else if (rs instanceof VTIResultSet)\r
+ {\r
+ VTIResultSet vtirs = (VTIResultSet) rs;\r
+\r
+ return new RealVTIStatistics(\r
+ vtirs.numOpens,\r
+ vtirs.rowsSeen,\r
+ vtirs.rowsFiltered,\r
+ vtirs.constructorTime,\r
+ vtirs.openTime,\r
+ vtirs.nextTime,\r
+ vtirs.closeTime,\r
+ vtirs.resultSetNumber,\r
+ vtirs.javaClassName,\r
+ vtirs.optimizerEstimatedRowCount,\r
+ vtirs.optimizerEstimatedCost\r
+ );\r
+ }\r
+\r
+ else if (rs instanceof DependentResultSet)\r
+ {\r
+ boolean instantaneousLocks = false;\r
+ DependentResultSet dsrs = (DependentResultSet) rs;\r
+ String startPosition = null;\r
+ String stopPosition = null;\r
+ String isolationLevel = null;\r
+ String lockString = null;\r
+ String lockRequestString = null;\r
+\r
+ switch (dsrs.isolationLevel)\r
+ {\r
+ case TransactionController.ISOLATION_SERIALIZABLE:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_SERIALIZABLE);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_REPEATABLE_READ:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_REPEATABLE_READ);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:\r
+ instantaneousLocks = true;\r
+ //fall through\r
+ case TransactionController.ISOLATION_READ_COMMITTED:\r
+ isolationLevel = MessageService.getTextMessage(\r
+ SQLState.LANG_READ_COMMITTED);\r
+ break;\r
+\r
+ case TransactionController.ISOLATION_READ_UNCOMMITTED:\r
+ isolationLevel = \r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_READ_UNCOMMITTED);\r
+ break;\r
+ }\r
+\r
+ if (dsrs.forUpdate)\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_EXCLUSIVE);\r
+ }\r
+ else\r
+ {\r
+ if (instantaneousLocks)\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_INSTANTANEOUS_SHARE);\r
+ }\r
+ else\r
+ {\r
+ lockString = MessageService.getTextMessage(\r
+ SQLState.LANG_SHARE);\r
+ }\r
+ }\r
+\r
+ switch (dsrs.lockMode)\r
+ {\r
+ case TransactionController.MODE_TABLE:\r
+ // RESOLVE: Not sure this will really work, as we\r
+ // are tacking together English words to make a phrase.\r
+ // Will this work in other languages?\r
+ lockRequestString = lockString + " " +\r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_TABLE);\r
+ break;\r
+\r
+ case TransactionController.MODE_RECORD:\r
+ // RESOLVE: Not sure this will really work, as we\r
+ // are tacking together English words to make a phrase.\r
+ // Will this work in other languages?\r
+ lockRequestString = lockString + " " +\r
+ MessageService.getTextMessage(\r
+ SQLState.LANG_ROW);\r
+ break;\r
+ }\r
+\r
+ /* Start and stop position strings will be non-null\r
+ * if the dSRS has been closed. Otherwise, we go off\r
+ * and build the strings now.\r
+ */\r
+ startPosition = dsrs.startPositionString;\r
+ if (startPosition == null)\r
+ {\r
+ startPosition = dsrs.printStartPosition();\r
+ }\r
+ stopPosition = dsrs.stopPositionString;\r
+ if (stopPosition == null)\r
+ {\r
+ stopPosition = dsrs.printStopPosition();\r
+ }\r
+ \r
+ return new \r
+ RealTableScanStatistics(\r
+ dsrs.numOpens,\r
+ dsrs.rowsSeen,\r
+ dsrs.rowsFiltered,\r
+ dsrs.constructorTime,\r
+ dsrs.openTime,\r
+ dsrs.nextTime,\r
+ dsrs.closeTime,\r
+ dsrs.resultSetNumber,\r
+ dsrs.tableName,\r
+ null,\r
+ dsrs.indexName,\r
+ dsrs.isConstraint,\r
+ dsrs.printQualifiers(),\r
+ dsrs.getScanProperties(),\r
+ startPosition,\r
+ stopPosition,\r
+ isolationLevel,\r
+ lockRequestString,\r
+ dsrs.rowsPerRead,\r
+ dsrs.coarserLock,\r
+ dsrs.optimizerEstimatedRowCount,\r
+ dsrs.optimizerEstimatedCost);\r
+ }\r
+ else\r
+ {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ //\r
+ // class interface\r
+ //\r
+ public RealResultSetStatisticsFactory() \r
+ {\r
+ }\r
+\r
+}\r