Package net.sf.basedb.core
Class SpotBatcher
java.lang.Object
net.sf.basedb.core.AbstractBatcher
net.sf.basedb.core.SpotBatcher
- All Implemented Interfaces:
AutoCloseable
,Batcher
Batcher class for per-spot intensity values for bioassaysets. This batcher
is normally used when a new bioassayset has been created that uses a different
cube and/or layer to store it's data than the source bioassayset.
Code example: Swap the intensities of channel 1 and 2
// Get source bioassayset DbControl dc = ... BioAssaySet source = ... // Create new transformation and bioassayset to hold the // new intensities, we use the same data cube as the source // but a different layer Transformation t = source.newTransformation(); dc.saveItem(t); BioAssaySet bas = t.newProduct(null, "new", true); dc.saveItem(bas); // Create a query that selects the data of // the source bioassayset DynamicSpotQuery query = source.getSpotData(); // Execute the query, and use the batcher to swap the // intensities SpotBatcher batcher = bas.getSpotBatcher(); DynamicResultIterator result = query.iterate(dc); int column = result.getIndex(VirtualColumn.COLUMN.getName()); int position = result.getIndex(VirtualColumn.POSITION.getName()); int ch1 = result.getIndex(VirtualColumn.channel(1).getName()); int ch2 = result.getIndex(VirtualColumn.channel(2).getName()); while (result.hasNext()) { SqlResult r = result.next(); batcher.insert(r.getShort(column), r.getInt(position), r.getFloat(ch2), r.getFloat(ch1)); } // Close and commit batcher.close(); dc.commit();
- Version:
- 2.0
- Author:
- Nicklas
- See Also:
- Last modified
- $Date: 2014-06-10 15:52:45 +0200 (ti, 10 jun 2014) $
-
Field Summary
Modifier and TypeFieldDescriptionprivate final BioAssaySet
The bioassayset this batcher inserts data for.private long
The number of bytes this batcher has added to the experiment.private final long
The number of bytes used by a single row.private final int
The number of channels used in the raw data type of the experiment where the bioassayset belongs.private int
The number of queued inserts.private PreparedStatement
The statement that inserts spot data.private String
The SQL string for thespotSql
statement.private int
The total number of inserts done by this batcher.Fields inherited from class net.sf.basedb.core.AbstractBatcher
debugSqlEnabled, logSql
-
Constructor Summary
ConstructorDescriptionSpotBatcher
(DbControl dc, BioAssaySet bioAssaySet) Create a new spot batcher for a bioassayset. -
Method Summary
Modifier and TypeMethodDescriptionprivate String
buildInsertSelectSql
(String selectSql) Build the INSERT INTO ...private void
Builds the insert SQL statement.void
flush()
Flush the batcher and send all remaining items in memory to the database.void
insert
(short column, int position, float... intensities) Insert intensities for a given column/position coordinate.int
insert
(AbstractSqlQuery query) Insert spot intensities using a query.(package private) void
Update disk usage and close open SQL statementsMethods inherited from class net.sf.basedb.core.AbstractBatcher
analyzeTable, close, getBatchSize, getDbControl, getSessionControl, isClosed, setBatchSize, setDbControl, updateLastAccess
-
Field Details
-
bioAssaySet
The bioassayset this batcher inserts data for. -
numChannels
private final int numChannelsThe number of channels used in the raw data type of the experiment where the bioassayset belongs. -
queuedInsertCount
private int queuedInsertCountThe number of queued inserts. Used to check when a flush is needed. -
totalInsertCount
private int totalInsertCountThe total number of inserts done by this batcher. -
bytes
private long bytesThe number of bytes this batcher has added to the experiment. -
bytesPerRow
private final long bytesPerRowThe number of bytes used by a single row. -
spotSql
The statement that inserts spot data.INSERT INTO Dynamic#PerSpot (cube, layer, column, position, ch1, ch2, ...) VALUES (cube, layer, ?, ?, ?, ?, ...)
-
spotSqlStatement
The SQL string for thespotSql
statement.
-
-
Constructor Details
-
SpotBatcher
SpotBatcher(DbControl dc, BioAssaySet bioAssaySet) Create a new spot batcher for a bioassayset. It is assumed that the calling code has checked that the bioassayset is allowed to receive more data (ie. it's data cube layer hasn't been committed to the database).
-
-
Method Details
-
flush
Description copied from interface:Batcher
Flush the batcher and send all remaining items in memory to the database.- Throws:
BaseException
- If there is an error- See Also:
-
onBeforeClose
Update disk usage and close open SQL statements- Overrides:
onBeforeClose
in classAbstractBatcher
- Throws:
BaseException
-
insert
Insert intensities for a given column/position coordinate.- Parameters:
column
- The column coordinateposition
- The position coordinateintensities
- An array holding the intensities for the coordinate, the length must match the number of channels of the raw data type- Throws:
InvalidDataException
- If the intensities array is null or of the incorrect lengthBaseException
- If there is another error
-
insert
Insert spot intensities using a query. The query MUST select data in the following order: column, position, ch1, ch2, ...Internally this method converts the query into a
INSERT INTO ... SELECT ...
query, making it very fast, since the data for each spot doesn't have to be retreived, processed and then inserted one row at a time. It is possible to call this method multiple times with the same or different query.Here is an alternative to the example above:
// Get source bioassayset DbControl dc = ... BioAssaySet source = ... // Create new transformation and bioassayset to hold the // new intensities, we use the same data cube as the source // but a different layer Transformation t = source.newTransformation(); dc.saveItem(t); BioAssaySet bas = t.newProduct(null, "new", true); dc.saveItem(bas); // Create a query that selects the data of // the source bioassayset, swap the order of the channels DynamicSpotQuery query = source.getSpotData(); query.select(Dynamic.select(VirtualColumn.COLUMN)); query.select(Dynamic.select(VirtualColumn.POSITION)); query.select(Dynamic.select(VirtualColumn.channel(2))); query.select(Dynamic.select(VirtualColumn.channel(1))); // Execute the query, and use the batcher to insert the result SpotBatcher batcher = bas.getSpotBatcher(); batcher.insert(query); // Close and commit batcher.close(); dc.commit();
- Parameters:
query
- The query that selects the data to be inserted- Returns:
- int The number of spots inserted
- Throws:
BaseException
- If there is an error
-
buildSpotSql
Builds the insert SQL statement. Also creates the Dynamic#PerSpot table if it doesn't exists. -
buildInsertSelectSql
Build the INSERT INTO ... SELECT ... statment. Also creates the Dynamic#PerSpot table if it doesn't exists.- Parameters:
selectSql
- The SELECT part of the query- Throws:
BaseException
- See Also:
-