Package org.apache.derby.impl.sql.execute.rts

Examples of org.apache.derby.impl.sql.execute.rts.RealTableScanStatistics


        {
          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 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,
View Full Code Here


        {
          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 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,
View Full Code Here

        {
          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,
View Full Code Here

        {
          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 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 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 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,
View Full Code Here

        {
          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 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 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 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,
View Full Code Here

        {
          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 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 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 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,
View Full Code Here

        {
          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 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 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 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,
View Full Code Here

        {
          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,
View Full Code Here

        {
          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.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,
                      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,
                      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,
                      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,
                      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 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 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,
View Full Code Here

TOP

Related Classes of org.apache.derby.impl.sql.execute.rts.RealTableScanStatistics

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.