2.17.2: 2011-06-17

net.sf.basedb.core
Class PositionExtraValueBatcher<I>

java.lang.Object
  extended by net.sf.basedb.core.AbstractBatcher
      extended by net.sf.basedb.core.PositionExtraValueBatcher<I>
All Implemented Interfaces:
Batcher

public class PositionExtraValueBatcher<I>
extends AbstractBatcher

Batcher class for per-position extra values. This batcher can only be used for a new bioassayset that hasn't yet been committed to the database.

Code example: Multiply the mean of intensities of channel 1 and 2

// Get source bioassayset and extra value type
DbControl dc = ...
BioAssaySet source = ...
ExtraValueType type = ...

// Create new transformation and bioassayset to hold the
// new intensities, we use the same data cube and layer as the source
Transformation t = source.newTransformation();
dc.saveItem(t);
BioAssaySet bas = t.newProduct(null, null, true);
dc.saveItem(bas);

// Create a query that selects the data of
// the source bioassayset
DynamicSpotQuery query = source.getSpotData();

// Multiply the mean of the intensities
Expression meanCh1 = Aggregations.mean(Dynamic.column(VirtualColumn.channel(1)));
Expression meanCh2 = Aggregations.mean(Dynamic.column(VirtualColumn.channel(2)));
Expression product = Expressions.multiply(meanCh1, meanCh2);

// Select the position and product, and group by position
query.select(Dynamic.select(VirtualColumn.POSITION));
query.select(Selects.expression(product, "product"));
query.group(Dynamic.column(VirtualColumn.POSITION));

// Execute the query, and use the batcher to insert the new values
SpotExtraValueBatcher<Float> batcher = bas.getSpotExtraValueBatcher(Float.class, type);
DynamicResultIterator spots = query.iterate(dc);
int position = spots.getIndex(VirtualColumn.POSITION.getName());
int prod = spots.getIndex("product");
while (spots.hasNext())
{
   SqlResult r = spots.next();
   batcher.insert(r.getInt(position), r.getFloat(prod));
}

// Close and commit
batcher.close();
dc.commit();

Version:
2.0
Author:
Nicklas
See Also:
BioAssaySet.getPositionExtraValueBatcher(Class, ExtraValueType, Job)
Last modified
$Date: 2010-01-18 08:31:09 +0100 (Mon, 18 Jan 2010) $

Field Summary
private  long bytes
          The number of bytes this batcher has added to the experiment.
private  long bytesPerRow
          The number of bytes used by a single row.
private  PreparedStatement extraSql
          The statement that inserts spot data.
private  String extraSqlStatement
          The SQL string for the extraSql statement.
private  ExtraValue extraValue
          The extra value object which links the extra value type.
private  int queuedInsertCount
          The number of queued inserts.
private  int sqlType
          The sql type code of the value to insert.
private  int totalInsertCount
          The total number of inserts done by this batcher.
private  Type valueType
          The type of values to insert.
 
Fields inherited from class net.sf.basedb.core.AbstractBatcher
debugSqlEnabled, logSql
 
Constructor Summary
PositionExtraValueBatcher(DbControl dc, ExtraValue extraValue)
          Create a new spot batcher for a bioassayset.
 
Method Summary
private  String buildInsertSelectSql(String selectSql)
          Build the INSERT INTO ...
private  void buildSpotSql()
          Builds the insert SQL statement.
 void flush()
          Flush the batcher and send all remaining items in memory to the database.
 int insert(AbstractSqlQuery query)
          Insert position extra values using a query.
 void insert(int position, I value)
          Insert an extra value for a given position coordinate.
(package private)  void onBeforeClose()
          Update disk usage and close open SQL statements
 
Methods inherited from class net.sf.basedb.core.AbstractBatcher
analyzeTable, close, getBatchSize, getDbControl, getSessionControl, isClosed, setBatchSize, setDbControl, updateLastAccess
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

extraValue

private final ExtraValue extraValue
The extra value object which links the extra value type.


valueType

private final Type valueType
The type of values to insert.


sqlType

private final int sqlType
The sql type code of the value to insert.

See Also:
Types

bytesPerRow

private final long bytesPerRow
The number of bytes used by a single row.


queuedInsertCount

private int queuedInsertCount
The number of queued inserts. Used to check when a flush is needed.


totalInsertCount

private int totalInsertCount
The total number of inserts done by this batcher.


bytes

private long bytes
The number of bytes this batcher has added to the experiment.


extraSql

private PreparedStatement extraSql
The statement that inserts spot data.
INSERT INTO Dynamic#PositionExtraXxx (cube, extra, position, value)
VALUES (cube, extra, ?, ?)


extraSqlStatement

private String extraSqlStatement
The SQL string for the extraSql statement.

Constructor Detail

PositionExtraValueBatcher

PositionExtraValueBatcher(DbControl dc,
                          ExtraValue extraValue)
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 Detail

flush

public void flush()
           throws BaseException
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:
Batcher.close()

onBeforeClose

void onBeforeClose()
             throws BaseException
Update disk usage and close open SQL statements

Overrides:
onBeforeClose in class AbstractBatcher
Throws:
BaseException

insert

public void insert(int position,
                   I value)
            throws InvalidDataException,
                   BaseException
Insert an extra value for a given position coordinate.

Parameters:
position - The position coordinate
value - The extra value
Throws:
InvalidDataException - If some data is corrupted
BaseException - If there is another error

insert

public int insert(AbstractSqlQuery query)
           throws BaseException
Insert position extra values using a query. The query MUST select data in the following order: position, extraValue

Internally this method converts the query into a INSERT INTO ... SELECT ... query, making it very fast, since the data for each position 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.

Note! This method can't be called for string extra values. This is because the length of each string must be added to the disk usage. So they must be processed individually in any case. Use the other insert(int, Object) method.

Here is an alternative to the example above:

// Get source bioassayset and extra value type
DbControl dc = ...
BioAssaySet source = ...
ExtraValueType type = ...

// Create new transformation and bioassayset to hold the
// new intensities, we use the same data cube and layer as the source
Transformation t = source.newTransformation();
dc.saveItem(t);
BioAssaySet bas = t.newProduct(null, null, true);
dc.saveItem(bas);


// Create a query that selects the data of
// the source bioassayset
DynamicQuery query = source.getSpotData();

// Multiply the mean of the intensities
Expression meanCh1 = Aggregations.mean(Dynamic.column(VirtualColumn.channel(1)));
Expression meanCh2 = Aggregations.mean(Dynamic.column(VirtualColumn.channel(2)));
Expression product = Expressions.multiply(meanCh1, meanCh2);

// Select the position and product, and group by position
query.select(Dynamic.select(VirtualColumn.POSITION));
query.select(Selects.expression(product, "product"));
query.group(Dynamic.column(VirtualColumn.POSITION));

// Execute the query, and use the batcher to insert the new values
SpotExtraValueBatcher<Float> batcher = bas.getSpotExtraValueBatcher(Float.class, type);
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 rows inserted
Throws:
BaseException - If there is an error

buildSpotSql

private void buildSpotSql()
                   throws SQLException,
                          BaseException
Builds the insert SQL statement. Also creates the Dynamic#PositionExtraXxx table if it doesn't exists.

Throws:
SQLException
BaseException
See Also:
BatchUtil.buildInsertSql(VirtualDb, VirtualTable, VirtualColumn[], Object[])

buildInsertSelectSql

private String buildInsertSelectSql(String selectSql)
                             throws BaseException
Build the INSERT INTO ... SELECT ... statment. Also creates the Dynamic#PositionExtraXxx table if it doesn't exists.

Parameters:
selectSql - The SELECT part of the query
Throws:
BaseException
See Also:
BatchUtil.buildInsertSelectSql(VirtualDb, VirtualTable, VirtualColumn[], String)

2.17.2: 2011-06-17