2.17.2: 2011-06-17

net.sf.basedb.core
Class FilterBatcher

java.lang.Object
  extended by net.sf.basedb.core.AbstractBatcher
      extended by net.sf.basedb.core.FilterBatcher
All Implemented Interfaces:
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: 2009-06-23 11:47:46 +0200 (Tue, 23 Jun 2009) $

Field Summary
private  BioAssaySet bioAssaySet
          The bioassayset this batcher inserts data for.
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 filterSql
          The statement that inserts filter data.
private  String filterSqlStatement
          The SQL string for the filterSql statement.
private  int queuedInsertCount
          The number of queued inserts.
private  int totalInsertCount
          The total number of inserts done by this batcher.
 
Fields inherited from class net.sf.basedb.core.AbstractBatcher
debugSqlEnabled, logSql
 
Constructor Summary
FilterBatcher(DbControl dc, BioAssaySet bioAssaySet)
          Create a new filter batcher for a bioassayset.
 
Method Summary
private  void buildFilterSql()
          Builds the insert SQL statement.
private  String buildInsertSelectSql(String selectSql)
          Build the INSERT INTO ...
 void flush()
          Flush the batcher and send all remaining items in memory to the database.
 int insert(AbstractSqlQuery query)
          Insert column/position coordinates using a query.
 void insert(short column, int position)
          Insert a column/position coordinate that passed the filter.
(package private)  void onBeforeClose()
          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

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

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
Close open SQL statements.

Overrides:
onBeforeClose in class AbstractBatcher
Throws:
BaseException

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

buildFilterSql

private void buildFilterSql()
                     throws SQLException,
                            BaseException
Builds the insert SQL statement. Also creates the Dynamic#Filter 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#Filter 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