Class 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 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

      • 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