Class RIBulkChecker
- java.lang.Object
-
- org.apache.derby.impl.sql.execute.RIBulkChecker
-
public class RIBulkChecker extends java.lang.Object
Do a merge run comparing all the foreign keys from the foreign key conglomerate against the referenced keys from the primary key conglomerate. The scanControllers are passed in by the caller (caller controls locking on said conglomerates).The comparision is done via a merge. Consequently, it is imperative that the scans are on keyed conglomerates (indexes) and that the referencedKeyScan is a unique scan.
Performance is no worse than N + M where N is foreign key rows and M is primary key rows.
Bulk fetch is used to further speed performance. The fetch size is LanguageProperties.BULK_FETCH_DEFAULT
- See Also:
LanguageProperties
-
-
Field Summary
Fields Modifier and Type Field Description private UUID
constraintId
private int
currFKRowIndex
private int
currRefRowIndex
private boolean
deferred
private BackingStoreHashtable
deferredRowsHashTable
private static int
EQUAL
private int
failedCounter
private ExecRow
firstRowToFail
private long
fkCID
private DataValueDescriptor[][]
foreignKeyRowArray
private GroupFetchScanController
foreignKeyScan
private static int
GREATER_THAN
private int
lastFKRowIndex
private int
lastRefRowIndex
private LanguageConnectionContext
lcc
private static int
LESS_THAN
private int
numColumns
private long
pkCID
private boolean
quitOnFirstFailure
private DataValueDescriptor[][]
referencedKeyRowArray
private GroupFetchScanController
referencedKeyScan
private java.lang.String
schemaName
private java.lang.String
tableName
private ConglomerateController
unreferencedCC
-
Constructor Summary
Constructors Constructor Description RIBulkChecker(Activation a, GroupFetchScanController referencedKeyScan, GroupFetchScanController foreignKeyScan, ExecRow templateRow, boolean quitOnFirstFailure, ConglomerateController unreferencedCC, ExecRow firstRowToFail, java.lang.String schemaName, java.lang.String tableName, UUID constraintId, boolean deferrable, long fkCID, long pkCID)
Create a RIBulkChecker
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private boolean
anyNull(DataValueDescriptor[] fkRowArray)
int
doCheck()
Perform the check.private void
failure(DataValueDescriptor[] foreignKeyRow)
private DataValueDescriptor[]
getNextFK()
private DataValueDescriptor[]
getNextRef()
private int
greaterThan(DataValueDescriptor[] fkRowArray, DataValueDescriptor[] refRowArray)
-
-
-
Field Detail
-
EQUAL
private static final int EQUAL
- See Also:
- Constant Field Values
-
GREATER_THAN
private static final int GREATER_THAN
- See Also:
- Constant Field Values
-
LESS_THAN
private static final int LESS_THAN
- See Also:
- Constant Field Values
-
fkCID
private final long fkCID
-
pkCID
private final long pkCID
-
schemaName
private final java.lang.String schemaName
-
tableName
private final java.lang.String tableName
-
constraintId
private final UUID constraintId
-
deferredRowsHashTable
private BackingStoreHashtable deferredRowsHashTable
-
lcc
private final LanguageConnectionContext lcc
-
deferred
private final boolean deferred
-
referencedKeyScan
private GroupFetchScanController referencedKeyScan
-
referencedKeyRowArray
private DataValueDescriptor[][] referencedKeyRowArray
-
foreignKeyScan
private GroupFetchScanController foreignKeyScan
-
foreignKeyRowArray
private DataValueDescriptor[][] foreignKeyRowArray
-
unreferencedCC
private ConglomerateController unreferencedCC
-
failedCounter
private int failedCounter
-
quitOnFirstFailure
private boolean quitOnFirstFailure
-
numColumns
private int numColumns
-
currRefRowIndex
private int currRefRowIndex
-
currFKRowIndex
private int currFKRowIndex
-
lastRefRowIndex
private int lastRefRowIndex
-
lastFKRowIndex
private int lastFKRowIndex
-
firstRowToFail
private ExecRow firstRowToFail
-
-
Constructor Detail
-
RIBulkChecker
public RIBulkChecker(Activation a, GroupFetchScanController referencedKeyScan, GroupFetchScanController foreignKeyScan, ExecRow templateRow, boolean quitOnFirstFailure, ConglomerateController unreferencedCC, ExecRow firstRowToFail, java.lang.String schemaName, java.lang.String tableName, UUID constraintId, boolean deferrable, long fkCID, long pkCID) throws StandardException
Create a RIBulkChecker- Parameters:
a
- the activationreferencedKeyScan
- scan of the referenced key's backing index. must be uniqueforeignKeyScan
- scan of the foreign key's backing indextemplateRow
- a template row for the indexes. Will be cloned when it is used. Must be a full index row.quitOnFirstFailure
- quit on first unreferenced keyunreferencedCC
- put unreferenced keys herefirstRowToFail
- the first row that fails the constraint is copied to this, if non-nullschemaName
- schema name of the table we insert intotableName
- table name of the table we insert intoconstraintId
- constraint id of the foreign constraintdeferrable
-true
if the constraint is deferrablefkCID
- conglomerate id of the foreign key supporting indexpkCID
- conglomerate id of the referenced primary key or unique index.- Throws:
StandardException
-
-
Method Detail
-
doCheck
public int doCheck() throws StandardException
Perform the check. If deferred constraint mode, the numbers of failed rows returned will be always be 0 (but any violating keys will have been saved for later checking).- Returns:
- the number of failed rows
- Throws:
StandardException
- on error
-
getNextFK
private DataValueDescriptor[] getNextFK() throws StandardException
- Throws:
StandardException
-
getNextRef
private DataValueDescriptor[] getNextRef() throws StandardException
- Throws:
StandardException
-
failure
private void failure(DataValueDescriptor[] foreignKeyRow) throws StandardException
- Throws:
StandardException
-
anyNull
private boolean anyNull(DataValueDescriptor[] fkRowArray) throws StandardException
- Throws:
StandardException
-
greaterThan
private int greaterThan(DataValueDescriptor[] fkRowArray, DataValueDescriptor[] refRowArray) throws StandardException
- Throws:
StandardException
-
-