{
stopPosition = tsrs.printStopPosition();
}
}
return new
RealTableScanStatistics(
tsrs.numOpens,
tsrs.rowsSeen,
tsrs.rowsFiltered,
tsrs.constructorTime,
tsrs.openTime,
tsrs.nextTime,
tsrs.closeTime,
tsrs.resultSetNumber,
tsrs.tableName,
tsrs.userSuppliedOptimizerOverrides,
tsrs.indexName,
tsrs.isConstraint,
tsrs.printQualifiers(tsrs.qualifiers),
tsrs.getScanProperties(),
startPosition,
stopPosition,
isolationLevel,
lockRequestString,
tsrs.rowsPerRead,
tsrs.coarserLock,
tsrs.optimizerEstimatedRowCount,
tsrs.optimizerEstimatedCost);
}
else if (rs instanceof LastIndexKeyResultSet )
{
LastIndexKeyResultSet lrs = (LastIndexKeyResultSet) rs;
String isolationLevel = null;
String lockRequestString = null;
switch (lrs.isolationLevel)
{
case TransactionController.ISOLATION_SERIALIZABLE:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_SERIALIZABLE);
break;
case TransactionController.ISOLATION_REPEATABLE_READ:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_REPEATABLE_READ);
break;
case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:
case TransactionController.ISOLATION_READ_COMMITTED:
isolationLevel = MessageService.getTextMessage(
SQLState.LANG_READ_COMMITTED);
break;
case TransactionController.ISOLATION_READ_UNCOMMITTED:
isolationLevel = MessageService.getTextMessage(
SQLState.LANG_READ_UNCOMMITTED);
break;
}
switch (lrs.lockMode)
{
case TransactionController.MODE_TABLE:
lockRequestString = MessageService.getTextMessage(
SQLState.LANG_SHARE_TABLE);
break;
case TransactionController.MODE_RECORD:
lockRequestString = MessageService.getTextMessage(
SQLState.LANG_SHARE_ROW);
break;
}
return new RealLastIndexKeyScanStatistics(
lrs.numOpens,
lrs.constructorTime,
lrs.openTime,
lrs.nextTime,
lrs.closeTime,
lrs.resultSetNumber,
lrs.tableName,
lrs.indexName,
isolationLevel,
lockRequestString,
lrs.optimizerEstimatedRowCount,
lrs.optimizerEstimatedCost);
}
else if (rs instanceof HashLeftOuterJoinResultSet)
{
HashLeftOuterJoinResultSet hlojrs =
(HashLeftOuterJoinResultSet) rs;
return new RealHashLeftOuterJoinStatistics(
hlojrs.numOpens,
hlojrs.rowsSeen,
hlojrs.rowsFiltered,
hlojrs.constructorTime,
hlojrs.openTime,
hlojrs.nextTime,
hlojrs.closeTime,
hlojrs.resultSetNumber,
hlojrs.rowsSeenLeft,
hlojrs.rowsSeenRight,
hlojrs.rowsReturned,
hlojrs.restrictionTime,
hlojrs.optimizerEstimatedRowCount,
hlojrs.optimizerEstimatedCost,
hlojrs.userSuppliedOptimizerOverrides,
getResultSetStatistics(
hlojrs.leftResultSet),
getResultSetStatistics(
hlojrs.rightResultSet),
hlojrs.emptyRightRowsReturned);
}
else if (rs instanceof NestedLoopLeftOuterJoinResultSet)
{
NestedLoopLeftOuterJoinResultSet nllojrs =
(NestedLoopLeftOuterJoinResultSet) rs;
return new RealNestedLoopLeftOuterJoinStatistics(
nllojrs.numOpens,
nllojrs.rowsSeen,
nllojrs.rowsFiltered,
nllojrs.constructorTime,
nllojrs.openTime,
nllojrs.nextTime,
nllojrs.closeTime,
nllojrs.resultSetNumber,
nllojrs.rowsSeenLeft,
nllojrs.rowsSeenRight,
nllojrs.rowsReturned,
nllojrs.restrictionTime,
nllojrs.optimizerEstimatedRowCount,
nllojrs.optimizerEstimatedCost,
nllojrs.userSuppliedOptimizerOverrides,
getResultSetStatistics(
nllojrs.leftResultSet),
getResultSetStatistics(
nllojrs.rightResultSet),
nllojrs.emptyRightRowsReturned);
}
else if (rs instanceof HashJoinResultSet)
{
HashJoinResultSet hjrs = (HashJoinResultSet) rs;
return new RealHashJoinStatistics(
hjrs.numOpens,
hjrs.rowsSeen,
hjrs.rowsFiltered,
hjrs.constructorTime,
hjrs.openTime,
hjrs.nextTime,
hjrs.closeTime,
hjrs.resultSetNumber,
hjrs.rowsSeenLeft,
hjrs.rowsSeenRight,
hjrs.rowsReturned,
hjrs.restrictionTime,
hjrs.oneRowRightSide,
hjrs.optimizerEstimatedRowCount,
hjrs.optimizerEstimatedCost,
hjrs.userSuppliedOptimizerOverrides,
getResultSetStatistics(
hjrs.leftResultSet),
getResultSetStatistics(
hjrs.rightResultSet)
);
}
else if (rs instanceof NestedLoopJoinResultSet)
{
NestedLoopJoinResultSet nljrs = (NestedLoopJoinResultSet) rs;
return new RealNestedLoopJoinStatistics(
nljrs.numOpens,
nljrs.rowsSeen,
nljrs.rowsFiltered,
nljrs.constructorTime,
nljrs.openTime,
nljrs.nextTime,
nljrs.closeTime,
nljrs.resultSetNumber,
nljrs.rowsSeenLeft,
nljrs.rowsSeenRight,
nljrs.rowsReturned,
nljrs.restrictionTime,
nljrs.oneRowRightSide,
nljrs.optimizerEstimatedRowCount,
nljrs.optimizerEstimatedCost,
nljrs.userSuppliedOptimizerOverrides,
getResultSetStatistics(
nljrs.leftResultSet),
getResultSetStatistics(
nljrs.rightResultSet)
);
}
else if (rs instanceof IndexRowToBaseRowResultSet)
{
IndexRowToBaseRowResultSet irtbrrs =
(IndexRowToBaseRowResultSet) rs;
return new RealIndexRowToBaseRowStatistics(
irtbrrs.numOpens,
irtbrrs.rowsSeen,
irtbrrs.rowsFiltered,
irtbrrs.constructorTime,
irtbrrs.openTime,
irtbrrs.nextTime,
irtbrrs.closeTime,
irtbrrs.resultSetNumber,
irtbrrs.indexName,
irtbrrs.accessedHeapCols,
irtbrrs.optimizerEstimatedRowCount,
irtbrrs.optimizerEstimatedCost,
getResultSetStatistics(
irtbrrs.source)
);
}
else if (rs instanceof WindowResultSet)
{
WindowResultSet wrs = (WindowResultSet) rs;
return new RealWindowResultSetStatistics(
wrs.numOpens,
wrs.rowsSeen,
wrs.rowsFiltered,
wrs.constructorTime,
wrs.openTime,
wrs.nextTime,
wrs.closeTime,
wrs.resultSetNumber,
wrs.optimizerEstimatedRowCount,
wrs.optimizerEstimatedCost,
getResultSetStatistics(wrs.source)
);
}
else if (rs instanceof RowResultSet)
{
RowResultSet rrs = (RowResultSet) rs;
return new RealRowResultSetStatistics(
rrs.numOpens,
rrs.rowsSeen,
rrs.rowsFiltered,
rrs.constructorTime,
rrs.openTime,
rrs.nextTime,
rrs.closeTime,
rrs.resultSetNumber,
rrs.rowsReturned,
rrs.optimizerEstimatedRowCount,
rrs.optimizerEstimatedCost);
}
else if (rs instanceof SetOpResultSet)
{
SetOpResultSet srs = (SetOpResultSet) rs;
return new RealSetOpResultSetStatistics(
srs.getOpType(),
srs.numOpens,
srs.rowsSeen,
srs.rowsFiltered,
srs.constructorTime,
srs.openTime,
srs.nextTime,
srs.closeTime,
srs.getResultSetNumber(),
srs.getRowsSeenLeft(),
srs.getRowsSeenRight(),
srs.getRowsReturned(),
srs.optimizerEstimatedRowCount,
srs.optimizerEstimatedCost,
getResultSetStatistics(srs.getLeftSourceInput()),
getResultSetStatistics(srs.getRightSourceInput())
);
}
else if (rs instanceof UnionResultSet)
{
UnionResultSet urs = (UnionResultSet)rs;
return new RealUnionResultSetStatistics(
urs.numOpens,
urs.rowsSeen,
urs.rowsFiltered,
urs.constructorTime,
urs.openTime,
urs.nextTime,
urs.closeTime,
urs.resultSetNumber,
urs.rowsSeenLeft,
urs.rowsSeenRight,
urs.rowsReturned,
urs.optimizerEstimatedRowCount,
urs.optimizerEstimatedCost,
getResultSetStatistics(urs.source1),
getResultSetStatistics(urs.source2)
);
}
else if (rs instanceof AnyResultSet)
{
AnyResultSet ars = (AnyResultSet) rs;
return new RealAnyResultSetStatistics(
ars.numOpens,
ars.rowsSeen,
ars.rowsFiltered,
ars.constructorTime,
ars.openTime,
ars.nextTime,
ars.closeTime,
ars.resultSetNumber,
ars.subqueryNumber,
ars.pointOfAttachment,
ars.optimizerEstimatedRowCount,
ars.optimizerEstimatedCost,
getResultSetStatistics(ars.source)
);
}
else if (rs instanceof OnceResultSet)
{
OnceResultSet ors = (OnceResultSet) rs;
return new RealOnceResultSetStatistics(
ors.numOpens,
ors.rowsSeen,
ors.rowsFiltered,
ors.constructorTime,
ors.openTime,
ors.nextTime,
ors.closeTime,
ors.resultSetNumber,
ors.subqueryNumber,
ors.pointOfAttachment,
ors.optimizerEstimatedRowCount,
ors.optimizerEstimatedCost,
getResultSetStatistics(ors.source)
);
}
else if (rs instanceof NormalizeResultSet)
{
NormalizeResultSet nrs = (NormalizeResultSet) rs;
return new RealNormalizeResultSetStatistics(
nrs.numOpens,
nrs.rowsSeen,
nrs.rowsFiltered,
nrs.constructorTime,
nrs.openTime,
nrs.nextTime,
nrs.closeTime,
nrs.resultSetNumber,
nrs.optimizerEstimatedRowCount,
nrs.optimizerEstimatedCost,
getResultSetStatistics(nrs.source)
);
}
else if (rs instanceof MaterializedResultSet)
{
MaterializedResultSet mrs = (MaterializedResultSet) rs;
return new RealMaterializedResultSetStatistics(
mrs.numOpens,
mrs.rowsSeen,
mrs.rowsFiltered,
mrs.constructorTime,
mrs.openTime,
mrs.nextTime,
mrs.closeTime,
mrs.createTCTime,
mrs.fetchTCTime,
mrs.resultSetNumber,
mrs.optimizerEstimatedRowCount,
mrs.optimizerEstimatedCost,
getResultSetStatistics(mrs.source)
);
}
else if (rs instanceof ScrollInsensitiveResultSet)
{
ScrollInsensitiveResultSet sirs = (ScrollInsensitiveResultSet) rs;
return new RealScrollInsensitiveResultSetStatistics(
sirs.numOpens,
sirs.rowsSeen,
sirs.rowsFiltered,
sirs.constructorTime,
sirs.openTime,
sirs.nextTime,
sirs.closeTime,
sirs.numFromHashTable,
sirs.numToHashTable,
sirs.resultSetNumber,
sirs.optimizerEstimatedRowCount,
sirs.optimizerEstimatedCost,
getResultSetStatistics(sirs.source)
);
}
else if (rs instanceof CurrentOfResultSet)
{
CurrentOfResultSet cors = (CurrentOfResultSet) rs;
return new RealCurrentOfStatistics(
cors.numOpens,
cors.rowsSeen,
cors.rowsFiltered,
cors.constructorTime,
cors.openTime,
cors.nextTime,
cors.closeTime,
cors.resultSetNumber
);
}
else if (rs instanceof HashScanResultSet)
{
boolean instantaneousLocks = false;
HashScanResultSet hsrs = (HashScanResultSet) rs;
String startPosition = null;
String stopPosition = null;
String isolationLevel = null;
String lockString = null;
switch (hsrs.isolationLevel)
{
case TransactionController.ISOLATION_SERIALIZABLE:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_SERIALIZABLE);
break;
case TransactionController.ISOLATION_REPEATABLE_READ:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_REPEATABLE_READ);
break;
case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:
instantaneousLocks = true;
//fall through
case TransactionController.ISOLATION_READ_COMMITTED:
isolationLevel = MessageService.getTextMessage(
SQLState.LANG_READ_COMMITTED);
break;
}
if (hsrs.forUpdate)
{
lockString = MessageService.getTextMessage(
SQLState.LANG_EXCLUSIVE);
}
else
{
if (instantaneousLocks)
{
lockString = MessageService.getTextMessage(
SQLState.LANG_INSTANTANEOUS_SHARE);
}
else
{
lockString = MessageService.getTextMessage(
SQLState.LANG_SHARE);
}
}
switch (hsrs.lockMode)
{
case TransactionController.MODE_TABLE:
// RESOLVE: Not sure this will really work, as we
// are tacking together English words to make a phrase.
// Will this work in other languages?
lockString = lockString + " " +
MessageService.getTextMessage(
SQLState.LANG_TABLE);
break;
case TransactionController.MODE_RECORD:
// RESOLVE: Not sure this will really work, as we
// are tacking together English words to make a phrase.
// Will this work in other languages?
lockString = lockString + " " +
MessageService.getTextMessage(
SQLState.LANG_ROW);
break;
}
if (hsrs.indexName != null)
{
/* Start and stop position strings will be non-null
* if the HSRS has been closed. Otherwise, we go off
* and build the strings now.
*/
startPosition = hsrs.startPositionString;
if (startPosition == null)
{
startPosition = hsrs.printStartPosition();
}
stopPosition = hsrs.stopPositionString;
if (stopPosition == null)
{
stopPosition = hsrs.printStopPosition();
}
}
// DistinctScanResultSet is simple sub-class of
// HashScanResultSet
if (rs instanceof DistinctScanResultSet)
{
return new RealDistinctScanStatistics(
hsrs.numOpens,
hsrs.rowsSeen,
hsrs.rowsFiltered,
hsrs.constructorTime,
hsrs.openTime,
hsrs.nextTime,
hsrs.closeTime,
hsrs.resultSetNumber,
hsrs.tableName,
hsrs.indexName,
hsrs.isConstraint,
hsrs.hashtableSize,
hsrs.keyColumns,
hsrs.printQualifiers(
hsrs.scanQualifiers),
hsrs.printQualifiers(
hsrs.nextQualifiers),
hsrs.getScanProperties(),
startPosition,
stopPosition,
isolationLevel,
lockString,
hsrs.optimizerEstimatedRowCount,
hsrs.optimizerEstimatedCost
);
}
else
{
return new RealHashScanStatistics(
hsrs.numOpens,
hsrs.rowsSeen,
hsrs.rowsFiltered,
hsrs.constructorTime,
hsrs.openTime,
hsrs.nextTime,
hsrs.closeTime,
hsrs.resultSetNumber,
hsrs.tableName,
hsrs.indexName,
hsrs.isConstraint,
hsrs.hashtableSize,
hsrs.keyColumns,
hsrs.printQualifiers(
hsrs.scanQualifiers),
hsrs.printQualifiers(
hsrs.nextQualifiers),
hsrs.getScanProperties(),
startPosition,
stopPosition,
isolationLevel,
lockString,
hsrs.optimizerEstimatedRowCount,
hsrs.optimizerEstimatedCost
);
}
}
else if (rs instanceof HashTableResultSet)
{
HashTableResultSet htrs = (HashTableResultSet) rs;
int subqueryTrackingArrayLength =
(htrs.subqueryTrackingArray == null) ? 0 :
htrs.subqueryTrackingArray.length;
ResultSetStatistics[] subqueryTrackingArray =
new ResultSetStatistics[subqueryTrackingArrayLength];
boolean anyAttached = false;
for (int index = 0; index < subqueryTrackingArrayLength; index++)
{
if (htrs.subqueryTrackingArray[index] != null &&
htrs.subqueryTrackingArray[index].getPointOfAttachment() ==
htrs.resultSetNumber)
{
subqueryTrackingArray[index] =
getResultSetStatistics(
htrs.subqueryTrackingArray[index]);
anyAttached = true;
}
}
if (! anyAttached)
{
subqueryTrackingArray = null;
}
return new
RealHashTableStatistics(
htrs.numOpens,
htrs.rowsSeen,
htrs.rowsFiltered,
htrs.constructorTime,
htrs.openTime,
htrs.nextTime,
htrs.closeTime,
htrs.resultSetNumber,
htrs.hashtableSize,
htrs.keyColumns,
HashScanResultSet.printQualifiers(
htrs.nextQualifiers),
htrs.scanProperties,
htrs.optimizerEstimatedRowCount,
htrs.optimizerEstimatedCost,
subqueryTrackingArray,
getResultSetStatistics(htrs.source)
);
}
else if (rs instanceof VTIResultSet)
{
VTIResultSet vtirs = (VTIResultSet) rs;
return new RealVTIStatistics(
vtirs.numOpens,
vtirs.rowsSeen,
vtirs.rowsFiltered,
vtirs.constructorTime,
vtirs.openTime,
vtirs.nextTime,
vtirs.closeTime,
vtirs.resultSetNumber,
vtirs.javaClassName,
vtirs.optimizerEstimatedRowCount,
vtirs.optimizerEstimatedCost
);
}
else if (rs instanceof DependentResultSet)
{
boolean instantaneousLocks = false;
DependentResultSet dsrs = (DependentResultSet) rs;
String startPosition = null;
String stopPosition = null;
String isolationLevel = null;
String lockString = null;
String lockRequestString = null;
switch (dsrs.isolationLevel)
{
case TransactionController.ISOLATION_SERIALIZABLE:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_SERIALIZABLE);
break;
case TransactionController.ISOLATION_REPEATABLE_READ:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_REPEATABLE_READ);
break;
case TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK:
instantaneousLocks = true;
//fall through
case TransactionController.ISOLATION_READ_COMMITTED:
isolationLevel = MessageService.getTextMessage(
SQLState.LANG_READ_COMMITTED);
break;
case TransactionController.ISOLATION_READ_UNCOMMITTED:
isolationLevel =
MessageService.getTextMessage(
SQLState.LANG_READ_UNCOMMITTED);
break;
}
if (dsrs.forUpdate)
{
lockString = MessageService.getTextMessage(
SQLState.LANG_EXCLUSIVE);
}
else
{
if (instantaneousLocks)
{
lockString = MessageService.getTextMessage(
SQLState.LANG_INSTANTANEOUS_SHARE);
}
else
{
lockString = MessageService.getTextMessage(
SQLState.LANG_SHARE);
}
}
switch (dsrs.lockMode)
{
case TransactionController.MODE_TABLE:
// RESOLVE: Not sure this will really work, as we
// are tacking together English words to make a phrase.
// Will this work in other languages?
lockRequestString = lockString + " " +
MessageService.getTextMessage(
SQLState.LANG_TABLE);
break;
case TransactionController.MODE_RECORD:
// RESOLVE: Not sure this will really work, as we
// are tacking together English words to make a phrase.
// Will this work in other languages?
lockRequestString = lockString + " " +
MessageService.getTextMessage(
SQLState.LANG_ROW);
break;
}
/* Start and stop position strings will be non-null
* if the dSRS has been closed. Otherwise, we go off
* and build the strings now.
*/
startPosition = dsrs.startPositionString;
if (startPosition == null)
{
startPosition = dsrs.printStartPosition();
}
stopPosition = dsrs.stopPositionString;
if (stopPosition == null)
{
stopPosition = dsrs.printStopPosition();
}
return new
RealTableScanStatistics(
dsrs.numOpens,
dsrs.rowsSeen,
dsrs.rowsFiltered,
dsrs.constructorTime,