Class SpotExtraValueBatcher<I>

  • All Implemented Interfaces:
    AutoCloseable, Batcher

    public class SpotExtraValueBatcher<I>
    extends AbstractBatcher
    Batcher class for per-spot 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 intensities of channel 1 and 2

    // Get source bioassayset, extra value type and job(null can be used if no job)
    DbControl dc = ...
    BioAssaySet source = ...
    ExtraValueType type = ...
    Job job = ...
    
    // 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 from
    // the source bioassayset
    DynamicSpotQuery query = source.getSpotData();
    
    // Execute the query, and use the batcher to insert the new values
    SpotExtraValueBatcher<Float> batcher = bas.getSpotExtraValueBatcher(Float.class, type, job);
    DynamicResultIterator spots = query.iterate(dc);
    int column = spots.getIndex(VirtualColumn.COLUMN.getName());
    int position = spots.getIndex(VirtualColumn.POSITION.getName());
    int ch1 = spots.getIndex(VirtualColumn.channel(1).getName());
    int ch2 = spots.getIndex(VirtualColumn.channel(2).getName());
    while (spots.hasNext())
    {
       SqlResult r = spots.next();
       batcher.insert(r.getShort(column), r.getInt(position), 
          r.getFloat(ch1) * r.getFloat(ch2));
    }
    
    // Close and commit
    batcher.close();
    dc.commit();
    
    Version:
    2.0
    Author:
    Nicklas
    See Also:
    BioAssaySet.getSpotExtraValueBatcher(Class, ExtraValueType, Job)
    Last modified
    $Date: 2015-05-12 11:27:08 +0200 (ti, 12 maj 2015) $
    • 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#SpotExtraXxx (cube, extra, column, position, value)
        VALUES (cube, extra, ?, ?, ?)
        
      • extraSqlStatement

        private String extraSqlStatement
        The SQL string for the extraSql statement.
    • Constructor Detail

      • SpotExtraValueBatcher

        SpotExtraValueBatcher​(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 hasn't been committed to the database).
    • Method Detail

      • insert

        public void insert​(short column,
                           int position,
                           I value)
                    throws InvalidDataException,
                           BaseException
        Insert an extra value for a given column/position coordinate.
        Parameters:
        column - The column coordinate
        position - The position coordinate
        value - The extra value
        Throws:
        BaseException - If there is another error
        InvalidDataException
      • insert

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

        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.

        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(short, 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 from
        // the source bioassayset
        DynamicSpotQuery query = source.getSpotData();
        query.select(Dynamic.select(VirtualColumn.COLUMN));
        query.select(Dynamic.select(VirtualColumn.POSITION));
        Expression product = Expressions.multiply(
                Dynamic.column(VirtualColumn.channel(1)),
                Dynamic.column(VirtualColumn.channel(2))
        );
        query.select(Selections.expression(product, "product"));
        
        // 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 spots inserted
        Throws:
        BaseException - If there is an error
      • getExtraValue

        public ExtraValue getExtraValue()
        Get the extra value item representing all extra values.