Class FilterBatcher

  • All Implemented Interfaces:
    AutoCloseable, Batcher

    public class FilterBatcher
    extends AbstractBatcher
    Batcher class for filtered bioassaysets. A filtered bioassayset is normally the result of a filtering transformation and uses the same data cube and layer as the source bioassayset to store it's data. This batcher is used to specify the column/position coordinates of the original spots that remains after the filter has been applied.

    Code example: Filter spots where ch1 <= 2 * ch2

    // Get source bioassayset
    DbControl dc = ...
    BioAssaySet source = ...
    
    // Create new transformation and bioassayset to hold the
    // filtered result
    Transformation t = source.newTransformation();
    dc.saveItem(t);
    BioAssaySet filtered = t.newProduct(null, null, true);
    dc.saveItem(filtered);
    
    // Create a query that selects the column
    // and position of all spots where ch1 > 2 * ch2
    DynamicSpotQuery query = source.getSpotData();
    query.select(Dynamic.select(VirtualColumn.COLUMN));
    query.select(Dynamic.select(VirtualColumn.POSITION));
    query.restrict(
       Restriction.gt(
          Dynamic.column(VirtualColumn.channel(1)),
          Expressions.multiply(
             Expressions.integer(2),
             Dynamic.column(VirtualColumn.channel(2))
          )
       )
    );
    
    // Execute the query, and use the batcher to insert the result
    FilterBatcher batcher = filtered.getFilterBatcher();
    DynamicResultIterator result = query.iterate(dc);
    int column = result.getIndex(VirtualColumn.COLUMN.getName());
    int position = result.getIndex(VirtualColumn.POSITION.getName());
    while (result.hasNext())
    {
       SqlResult r = result.next();
       batcher.insert(r.getShort(column), r.getInt(position));
    }
    
    // Close, save and commit
    batcher.close();
    dc.commit();
    
    Version:
    2.0
    Author:
    Nicklas
    See Also:
    BioAssaySet.getFilterBatcher()
    Last modified
    $Date: 2014-06-10 15:52:45 +0200 (ti, 10 jun 2014) $
    • Field Detail

      • bioAssaySet

        private final BioAssaySet bioAssaySet
        The bioassayset this batcher inserts data for.
      • 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.
      • bytesPerRow

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

        private PreparedStatement filterSql
        The statement that inserts filter data.
        INSERT INTO Dynamic#Filter (cube, filter, column, position)
        VALUES (cube, filter, ?, ?)
        
      • filterSqlStatement

        private String filterSqlStatement
        The SQL string for the filterSql statement.
    • Constructor Detail

      • FilterBatcher

        FilterBatcher​(DbControl dc,
                      BioAssaySet bioAssaySet)
        Create a new filter 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)
                    throws BaseException
        Insert a column/position coordinate that passed the filter.
        Parameters:
        column - The column number
        position - The position number
        Throws:
        BaseException - If there is an error
      • insert

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

        Internally this method converts the query into a INSERT INTO ... SELECT ... query, making it very fast, since the data for each coordinate 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
        // filtered result
        Transformation t = source.newTransformation();
        dc.saveItem(t);
        BioAssaySet filtered = t.newProduct(null, null, true);
        dc.saveItem(filtered);
        
        // Create a query that selects the column
        // and position of all spots where ch1 > 2 * ch2
        DynamicSpotQuery query = source.getSpotData();
        query.select(Dynamic.select(VirtualColumn.COLUMN));
        query.select(Dynamic.select(VirtualColumn.POSITION));
        query.restrict(
           Restriction.gt(
              Dynamic.column(VirtualColumn.channel(1)),
              Expressions.multiply(
                 Expressions.integer(2),
                 Dynamic.column(VirtualColumn.channel(2))
              )
           )
        );
        
        // Execute the query, and use the batcher to insert the result
        FilterBatcher batcher = filtered.getFilterBatcher();
        batcher.insert(query);
        
        // Close, save 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