Class PositionExtraValueBatcher<I>

java.lang.Object
net.sf.basedb.core.AbstractBatcher
net.sf.basedb.core.PositionExtraValueBatcher<I>
All Implemented Interfaces:
AutoCloseable, 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: 2014-06-10 15:52:45 +0200 (ti, 10 jun 2014) $
  • Field Details

    • 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 Details

    • 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 Details

    • 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)