org.apache.derby.impl.sql.execute
Class MultiProbeTableScanResultSet

java.lang.Object
  extended by org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl
      extended by org.apache.derby.impl.sql.execute.NoPutResultSetImpl
          extended by org.apache.derby.impl.sql.execute.ScanResultSet
              extended by org.apache.derby.impl.sql.execute.TableScanResultSet
                  extended by org.apache.derby.impl.sql.execute.MultiProbeTableScanResultSet
All Implemented Interfaces:
java.lang.Cloneable, CursorResultSet, NoPutResultSet, ResultSet, RowLocationRetRowSource, RowSource

 class MultiProbeTableScanResultSet
extends TableScanResultSet
implements CursorResultSet

Result set that fetches rows from a scan by "probing" the underlying table with a given list of values. Repeated calls to getNextRowCore() will first return all rows matching probeValues[0], then all rows matching probeValues[1], and so on (duplicate probe values are ignored). Once all matching rows for all values in probeValues have been returned, the call to getNextRowCore() will return null, thereby ending the scan. The expectation is that this kind of result set only ever appears beneath some other top-level result set (esp. IndexRowToBaseRowResultSet), in which case all result sets higher up in the result set tree will just see a stream of rows satisfying the list of probe values. Currently this type of result is used for evaluation of IN lists, where the user wants to retrieve all rows for which some target column has a value that equals one of values in the IN list. In that case the IN list values are represented by the probeValues array. Most of the work for this class is inherited from TableScanResultSet. This class overrides four public methods and two protected methods from TableScanResultSet. In all cases the methods here set probing state and then call the corresponding methods on "super".


Field Summary
protected  DataValueDescriptor[] origProbeValues
          The values with which we will probe the table, as they were passed to the constructor.
protected  int probeValIndex
          0-based position of the next value to lookup w.r.t. the probe values list.
protected  DataValueDescriptor[] probeValues
          The values with which we will probe the table.
private  boolean skipNextScan
          Tells whether or not we should skip the next attempt to (re)open the scan controller.
private  int sortRequired
          Indicator as to which type of sort we need: ASCENDING, DESCENDING, or NONE (NONE is represented by "RowOrdering.DONTCARE" and is used for cases where all necessary sorting occurred at compilation time).
 
Fields inherited from class org.apache.derby.impl.sql.execute.TableScanResultSet
coarserLock, compareToLastKey, conglomId, currentRowPrescanned, dcoci, firstScan, forUpdate, futureForUpdateRows, futureRowResultSet, indexCols, indexName, isConstraint, isKeyed, lastCursorKey, oneRowScan, past2FutureTbl, qualifiers, resultRowAllocator, rowsPerRead, rowsThisScan, runTimeStatisticsOn, sameStartStopPosition, scanController, scanControllerOpened, scoci, skipFutureRowHolder, sourceDrained, startKeyGetter, startPosition, startPositionString, startSearchOperator, stopKeyGetter, stopPosition, stopPositionString, stopSearchOperator, tableName, userSuppliedOptimizerOverrides
 
Fields inherited from class org.apache.derby.impl.sql.execute.ScanResultSet
accessedCols, candidate, isolationLevel, lockMode
 
Fields inherited from class org.apache.derby.impl.sql.execute.NoPutResultSetImpl
checkNullCols, clonedExecRow, cncLen, resultSetNumber, targetResultSet
 
Fields inherited from class org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl
activation, beginTime, closeTime, compactRow, constructorTime, currentRow, endExecutionTime, finished, isOpen, isTopResultSet, nextTime, numOpens, openTime, optimizerEstimatedCost, optimizerEstimatedRowCount, resultDescription, rowsFiltered, rowsSeen, startExecutionTime, subqueryTrackingArray
 
Fields inherited from interface org.apache.derby.iapi.sql.ResultSet
CURRENT_RESULTSET_ONLY, ENTIRE_RESULTSET_TREE, ISAFTERLAST, ISBEFOREFIRST, ISFIRST, ISLAST
 
Fields inherited from interface org.apache.derby.iapi.sql.execute.NoPutResultSet
ABSOLUTE, FIRST, LAST, NEXT, PREVIOUS, RELATIVE
 
Constructor Summary
MultiProbeTableScanResultSet(long conglomId, StaticCompiledOpenConglomInfo scoci, Activation activation, GeneratedMethod resultRowAllocator, int resultSetNumber, GeneratedMethod startKeyGetter, int startSearchOperator, GeneratedMethod stopKeyGetter, int stopSearchOperator, boolean sameStartStopPosition, Qualifier[][] qualifiers, DataValueDescriptor[] probingVals, int sortRequired, java.lang.String tableName, java.lang.String userSuppliedOptimizerOverrides, java.lang.String indexName, boolean isConstraint, boolean forUpdate, int colRefItem, int indexColItem, int lockMode, boolean tableLocked, int isolationLevel, boolean oneRowScan, double optimizerEstimatedRowCount, double optimizerEstimatedCost)
          Constructor.
 
Method Summary
 void close()
          If the result set has been opened, close the open scan.
private  DataValueDescriptor getNextProbeValue()
          Return the next non-duplicate value from the probe list.
 ExecRow getNextRowCore()
          Return the next row (if any) from the scan (if open).
(package private)  void initStartAndStopKey()
          Initialize the start key and the stop key used in the scan.
private  boolean moreInListVals()
          Figure out whether or not we can (re-)position the scan controller based on the next value in probeValues.
 void openCore()
          open a scan on the table. scan parameters are evaluated at each open, so there is probably some way of altering their values...
 void reopenCore()
          Reopen a table scan.
private  void reopenCore(boolean forNextProbe)
          There are two scenarios for which we reopen this kind of scan: A - The first is for join processing.
protected  void reopenScanController()
          Reopen the scan controller
protected  boolean skipScan(ExecIndexRow startPosition, ExecIndexRow stopPosition)
          Check if the scan should be skipped.
 
Methods inherited from class org.apache.derby.impl.sql.execute.TableScanResultSet
canGetInstantaneousLocks, clone, getCurrentRow, getRowLocation, getScanProperties, getTimeSpent, isForUpdate, openScanController, positionScanAtRowLocation, printStartPosition, printStopPosition, requiresRelocking, setRowCountIfPossible
 
Methods inherited from class org.apache.derby.impl.sql.execute.ScanResultSet
getScanIsolationLevel, initIsolationLevel
 
Methods inherited from class org.apache.derby.impl.sql.execute.NoPutResultSetImpl
clearCurrentRow, clearOrderableCache, closeRowSource, getCursorName, getNextRowFromRowSource, getResultDescription, getValidColumns, markRowAsDeleted, needsRowLocation, needsToClone, printQualifiers, resultSetNumber, rowLocation, setCurrentRow, setNeedsRowLocation, setTargetResultSet, skipRow, updateRow
 
Methods inherited from class org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl
addWarning, attachStatementContext, checkCancellationFlag, checkRowPosition, cleanUp, dumpTimeStats, finish, finishAndRTS, getAbsoluteRow, getActivation, getAutoGeneratedKeysResultset, getBeginExecutionTimestamp, getCompactRow, getCurrentTimeMillis, getElapsedMillis, getEndExecutionTimestamp, getEstimatedRowCount, getExecuteTime, getExecutionFactory, getFirstRow, getLanguageConnectionContext, getLastRow, getNextRow, getPointOfAttachment, getPreviousRow, getRelativeRow, getRowNumber, getSubqueryTrackingArray, getTransactionController, getWarnings, isClosed, markAsTopResultSet, modifiedRowCount, open, recordConstructorTime, returnsRows, setAfterLastRow, setBeforeFirstRow, setCompactRow, setCompatRow
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.apache.derby.iapi.sql.execute.CursorResultSet
getCurrentRow, getRowLocation
 
Methods inherited from interface org.apache.derby.iapi.sql.ResultSet
checkRowPosition, cleanUp, clearCurrentRow, finish, getAbsoluteRow, getActivation, getAutoGeneratedKeysResultset, getBeginExecutionTimestamp, getCursorName, getEndExecutionTimestamp, getExecuteTime, getFirstRow, getLastRow, getNextRow, getPreviousRow, getRelativeRow, getResultDescription, getRowNumber, getSubqueryTrackingArray, getTimeSpent, getWarnings, isClosed, modifiedRowCount, open, returnsRows, setAfterLastRow, setBeforeFirstRow
 

Field Detail

probeValues

protected DataValueDescriptor[] probeValues
The values with which we will probe the table.


origProbeValues

protected DataValueDescriptor[] origProbeValues
The values with which we will probe the table, as they were passed to the constructor. We need to keep them unchanged in case the result set is reused when a statement is re-executed (see DERBY-827).


probeValIndex

protected int probeValIndex
0-based position of the next value to lookup w.r.t. the probe values list.


sortRequired

private int sortRequired
Indicator as to which type of sort we need: ASCENDING, DESCENDING, or NONE (NONE is represented by "RowOrdering.DONTCARE" and is used for cases where all necessary sorting occurred at compilation time).


skipNextScan

private boolean skipNextScan
Tells whether or not we should skip the next attempt to (re)open the scan controller. If it is true it means that the previous call to initStartAndStopKey() did not find a new probe value, which means that the probe list is exhausted and we shouldn't perform a scan.

Constructor Detail

MultiProbeTableScanResultSet

MultiProbeTableScanResultSet(long conglomId,
                             StaticCompiledOpenConglomInfo scoci,
                             Activation activation,
                             GeneratedMethod resultRowAllocator,
                             int resultSetNumber,
                             GeneratedMethod startKeyGetter,
                             int startSearchOperator,
                             GeneratedMethod stopKeyGetter,
                             int stopSearchOperator,
                             boolean sameStartStopPosition,
                             Qualifier[][] qualifiers,
                             DataValueDescriptor[] probingVals,
                             int sortRequired,
                             java.lang.String tableName,
                             java.lang.String userSuppliedOptimizerOverrides,
                             java.lang.String indexName,
                             boolean isConstraint,
                             boolean forUpdate,
                             int colRefItem,
                             int indexColItem,
                             int lockMode,
                             boolean tableLocked,
                             int isolationLevel,
                             boolean oneRowScan,
                             double optimizerEstimatedRowCount,
                             double optimizerEstimatedCost)
                       throws StandardException
Constructor. Just save off the relevant probing state and pass everything else up to TableScanResultSet.

Throws:
StandardException - thrown on failure to open
See Also:
ResultSetFactory.getMultiProbeTableScanResultSet(org.apache.derby.iapi.sql.Activation, long, int, org.apache.derby.iapi.services.loader.GeneratedMethod, int, org.apache.derby.iapi.services.loader.GeneratedMethod, int, org.apache.derby.iapi.services.loader.GeneratedMethod, int, boolean, org.apache.derby.iapi.store.access.Qualifier[][], org.apache.derby.iapi.types.DataValueDescriptor[], int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean, int, int, int, boolean, int, boolean, double, double)
Method Detail

openCore

public void openCore()
              throws StandardException
Description copied from class: TableScanResultSet
open a scan on the table. scan parameters are evaluated at each open, so there is probably some way of altering their values...

Specified by:
openCore in interface NoPutResultSet
Overrides:
openCore in class TableScanResultSet
Throws:
StandardException - thrown on failure to open
See Also:
NoPutResultSet.openCore()

reopenCore

public void reopenCore()
                throws StandardException
Description copied from class: TableScanResultSet
Reopen a table scan. Here we take advantage of the reopenScan() interface on scanController for optimimal performance on joins where we are an inner table.

Specified by:
reopenCore in interface NoPutResultSet
Overrides:
reopenCore in class TableScanResultSet
Throws:
StandardException - thrown on failure to open
See Also:
NoPutResultSet.reopenCore()

reopenCore

private void reopenCore(boolean forNextProbe)
                 throws StandardException
There are two scenarios for which we reopen this kind of scan: A - The first is for join processing. In this case we have a(nother) row from some outer table and we want to reopen this scan to look for rows matching the new outer row. B - The second is for multi-probing. Here we want to reopen the scan on this table to look for rows matching the next value in the probe list. If we are reopening the scan for scenario A (join processing) then we need to reset our position within the probe list. If we are reopening the scan for scenario B then we do *not* want to reset our position within the probe list because that position tells us where to find the next probe value. That said, this method does the work of reopenCore() using the received boolean to determine which of the two scenarios we are in. Note that if our current position (i.e. the value of probeValIndex) is beyond the length of the probe list then we know that we are reopening the scan for scenario A. Or put another away, we should never get here for scenario B if probeValIndex is greater than or equal to the length of the probe list. The reason is that the call to reopenCore() for scenario B will only ever happen when moreInListVals() returns true--and in that case we know that probeValIndex will be less than the length of the probeValues. But the opposite is not true: i.e. it is *not* safe to say that a probeValIndex which is less than the length of probe list is always for scenario B. That's not true because it's possible that the join to which this scan belongs is a "oneRowRightSide" join, meaning that this, the "right" side scan, will be "interrupted" after we return a single row for the current outer row. If we then come back with a new outer row we need to reset our position-- even though probeValIndex will be less than probeValues.length in that case. DERBY-3603.

Throws:
StandardException

reopenScanController

protected void reopenScanController()
                             throws StandardException
Reopen the scan controller

Overrides:
reopenScanController in class TableScanResultSet
Throws:
StandardException - thrown on failure to open

initStartAndStopKey

void initStartAndStopKey()
                   throws StandardException
Initialize the start key and the stop key used in the scan. Both keys will be set to the probe value. If no new probe value was found (the probe list was exhausted), the flag skipNextScan will be true when the method returns to prevent a new scan from being reopened with a missing or incorrect probe value.

Overrides:
initStartAndStopKey in class TableScanResultSet
Throws:
StandardException

skipScan

protected boolean skipScan(ExecIndexRow startPosition,
                           ExecIndexRow stopPosition)
                    throws StandardException
Check if the scan should be skipped. It should be skipped if (1) initStartAndStopKey() exhausted the probe list, or (2) the scan should return no results because of nulls in the start key or stop key. See NoPutResultSetImpl.skipScan(ExecIndexRow,ExecIndexRow) for details about (2).

Overrides:
skipScan in class NoPutResultSetImpl
Parameters:
startPosition - the key on which to start the scan
stopPosition - the key on which to stop the scan
Returns:
true if scan should be skipped, false otherwise
Throws:
StandardException

getNextRowCore

public ExecRow getNextRowCore()
                       throws StandardException
Return the next row (if any) from the scan (if open). More specifically we do the following: 1 - See if we have a row to read from the current scan position. If so, return that row (done). 2 - If there are no more rows to read from the current scan position AND if there are more probe values to look at, then a) reposition the scan using the next probe value as the start/stop key and b) go back to step 1. Otherwise proceed to step 3. 3 - Return null (no more rows). Note that step 1 is important for cases where multiple rows in this table match a single probe value. In such a scenario we have to be sure that we do *not* move on to the next probe value until we have returned all of the rows for the _current_ probe value.

Specified by:
getNextRowCore in interface NoPutResultSet
Overrides:
getNextRowCore in class TableScanResultSet
Returns:
the next row in the result
Throws:
StandardException - thrown on failure to get next row
See Also:
NoPutResultSet.getNextRowCore()

close

public void close()
           throws StandardException
Description copied from class: TableScanResultSet
If the result set has been opened, close the open scan.

Specified by:
close in interface ResultSet
Overrides:
close in class TableScanResultSet
Throws:
StandardException - on error
See Also:
ResultSet.close()

moreInListVals

private boolean moreInListVals()
Figure out whether or not we can (re-)position the scan controller based on the next value in probeValues. This will return false when we have exhausted the probe list (i.e. when we've gone through all of the values).


getNextProbeValue

private DataValueDescriptor getNextProbeValue()
                                       throws StandardException
Return the next non-duplicate value from the probe list. Assumption is that the list is sorted so that duplicates appear next to each other, and that probeValIndex is the index of the next value. If we've exhausted the probe list then just return null.

Throws:
StandardException

Built on Thu 2011-03-10 11:54:14+0000, from revision ???

Apache Derby V10.6 Internals - Copyright © 2004,2007 The Apache Software Foundation. All Rights Reserved.