org.sormula.operation
Class ScalarSelectOperation<R>

java.lang.Object
  extended by org.sormula.operation.SqlOperation<R>
      extended by org.sormula.operation.ScalarSelectOperation<R>
Type Parameters:
R - class type which contains members for columns of a row in a table
Direct Known Subclasses:
SelectAggregateOperation, SelectCountOperation, SelectOperation

public class ScalarSelectOperation<R>
extends SqlOperation<R>

Select operation that reads one value at a time. It does not have any methods that use Collection objects.

Since:
1.0
Author:
Jeff Miller

Constructor Summary
ScalarSelectOperation(Table<R> table)
          Constructs standard sql select by primary key as:
SELECT c1, c2, c3, ...
ScalarSelectOperation(Table<R> table, java.lang.String whereConditionName)
          Constructs standard sql select by primary key as:
SELECT c1, c2, c3, ...
 
Method Summary
 void close()
          Cleans up after operation is no longer needed.
 void execute()
          Performs query.
 int getMaximumRowsRead()
          Gets the maximum number of rows to read from result set.
 java.lang.String getOrderByName()
          Gets order by name set with setOrderBy(String).
protected  OrderByTranslator<R> getOrderByTranslator()
          Gets the OrderByTranslator.
protected  java.sql.ResultSet getResultSet()
          Gets the result set of the most recent select.
 int getRowsReadCount()
          Gets the count of rows that were read since the most recent execute().
protected  java.lang.String getSql()
          Gets full sql statement to prepare. Order by clause is appended to supergetSql().
protected  void initBaseSql()
          Sets the base sql with SqlOperation.setBaseSql(String).
 boolean isLazySelectsCascades()
          Reports that operation has at least one field with SelectCascade.lazy() true.
 boolean isNotifyLazySelects()
          Reports that isLazySelectsCascades() is true and row is instanceof LazySelectable.
protected  void postRead(R row)
          Invoked after reading columns into row.
protected  void postReadCascade(R row)
          Invoked after reading row.
protected  java.util.List<CascadeOperation<R,?>> prepareCascades(java.lang.reflect.Field field)
          Creates and prepares cascade operations based upon cascade annotations for a field.
protected  void preRead(R row)
          Invoked prior to reading columns into row.
protected  void preReadCascade(R row)
          Invoked prior to reading row.
 R readNext()
          Reads one row from current result set.
 R select(java.lang.Object... parameters)
          Set parameters, executes, reads one row, closes.
 R select(R whereParameters)
          Set parameters, executes, reads one row, closes.
 void setMaximumRowsRead(int maximumRowsRead)
          Gets the maximum number of rows to read from result set.
 void setOrderBy(java.lang.String orderByName)
          Sets order of results in list.
protected  void setOrderByTranslator(OrderByTranslator<R> orderByTranslator)
          Sets the OrderByTranslator that creates the sql "order by" phrase based upon the OrderBy annotations.
 void setParameters(java.lang.Object... parameters)
          Sets any parameters to be used by operation.
 void setRowParameters(R rowParameters)
          Set parameters using values from a row object.
 
Methods inherited from class org.sormula.operation.SqlOperation
cancel, cascade, closeCascades, closeStatement, createTargetField, getBaseSql, getConnection, getCustomSql, getNextParameter, getOperationTime, getParameters, getPreparedSql, getPreparedStatement, getQueryTimeout, getTable, getTargetTable, getTimingId, getWhereConditionName, getWhereTranslator, initOperationTime, isAutoGeneratedKeys, isIncludeIdentityColumns, isReadOnly, isTimings, logTimings, prepare, prepareCascades, prepareCheck, prepareColumns, prepareParameters, prepareWhere, setAutoGeneratedKeys, setBaseSql, setCustomSql, setIncludeIdentityColumns, setNextParameter, setQueryTimeout, setReadOnly, setTimingId, setTimings, setWhere, setWhereTranslator, writeColumns, writeParameter, writeParameters, writeWhere
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ScalarSelectOperation

public ScalarSelectOperation(Table<R> table)
                      throws OperationException
Constructs standard sql select by primary key as:
SELECT c1, c2, c3, ... FROM table WHERE primary key clause

Parameters:
table - select from this table
Throws:
OperationException - if error

ScalarSelectOperation

public ScalarSelectOperation(Table<R> table,
                             java.lang.String whereConditionName)
                      throws OperationException
Constructs standard sql select by primary key as:
SELECT c1, c2, c3, ... FROM table WHERE ...

Parameters:
table - select from this table
whereConditionName - name of where condition to use ("primaryKey" to select by primary key; empty string to select all rows in table)
Throws:
OperationException - if error
Method Detail

getMaximumRowsRead

public int getMaximumRowsRead()
Gets the maximum number of rows to read from result set. The default is Integer.MAX_VALUE.

Returns:
0..Integer.MAX_VALUE
Since:
1.4

setMaximumRowsRead

public void setMaximumRowsRead(int maximumRowsRead)
Gets the maximum number of rows to read from result set. This method does NOT alter SQL to contain anything to limit query but only limits the number of rows read by readNext() and SelectOperation.readAll(). Limiting rows read is usefull to avoid reading too many rows and thus creating memory or display problems.

In the future, when more databases support a standard way to limit rows, I will add support for SQL level limits through a method like "setMaximumRows(int)" and SQL "FETCH FIRST n ROWS ONLY".

Parameters:
maximumRowsRead - 0..Integer.MAX_VALUE
Since:
1.4

getRowsReadCount

public int getRowsReadCount()
Gets the count of rows that were read since the most recent execute().

Returns:
number of rows read
Since:
1.4

setRowParameters

public void setRowParameters(R rowParameters)
Set parameters using values from a row object. Use this instead of setParameters(Object...).

Parameters:
rowParameters - where parameters are read from this object using fields definted in Where or Column.primaryKey().

setParameters

public void setParameters(java.lang.Object... parameters)
Sets any parameters to be used by operation. Parameters must be in the same order as defined by Column.primaryKey() or Where annotation.

Overrides:
setParameters in class SqlOperation<R>
Parameters:
parameters - parameters as objects (not from row fields)

execute

public void execute()
             throws OperationException
Performs query. Use readNext() to get the next row selected.

Specified by:
execute in class SqlOperation<R>
Throws:
OperationException - if error

close

public void close()
           throws OperationException
Cleans up after operation is no longer needed. The connection is not closed but all other objects created by this operations are closed. Prepared statement is closed and close method is invoked on all CascadeOperation objects. This method should be invoked when operation is no longer needed for proper JDBC clean up.

Overrides:
close in class SqlOperation<R>
Throws:
OperationException - if error

readNext

public R readNext()
           throws OperationException
Reads one row from current result set.

Returns:
new instance of row or null if no more row in the current result set
Throws:
OperationException - if error

setOrderBy

public void setOrderBy(java.lang.String orderByName)
                throws OperationException
Sets order of results in list. Setting the order condition affects the order of the rows are read from database but is only meaningful if the resulting collection type is also ordered.

Parameters:
orderByName - name of order phrase to use as defined in OrderBy.name() in OrderBy annotation on row R; use empty string for no ordering
Throws:
OperationException - if error

getOrderByName

public java.lang.String getOrderByName()
Gets order by name set with setOrderBy(String).

Returns:
order by name

select

public R select(java.lang.Object... parameters)
         throws OperationException
Set parameters, executes, reads one row, closes.

Parameters:
parameters - query parameters as objects (see setParameters(Object...))
Returns:
readNext()
Throws:
OperationException - if error
Since:
1.4

select

public R select(R whereParameters)
         throws OperationException
Set parameters, executes, reads one row, closes.

Parameters:
whereParameters - query parameters are read from an existing row object (see setRowParameters(Object))
Returns:
readNext()
Throws:
OperationException - if error
Since:
1.4

isLazySelectsCascades

public boolean isLazySelectsCascades()
Reports that operation has at least one field with SelectCascade.lazy() true. This status is set during SqlOperation.prepare().

Returns:
true if there are lazy select cascades annotated
Since:
1.8 and 2.2

isNotifyLazySelects

public boolean isNotifyLazySelects()
Reports that isLazySelectsCascades() is true and row is instanceof LazySelectable. This is set as an optimization so the readNext() only tests a boolean to know when to invoke LazySelectable.pendingLazySelects(org.sormula.Database).

Returns:
true if LazySelectable.pendingLazySelects(org.sormula.Database) will be inovked for each row selected
Since:
1.8 and 2.2

getOrderByTranslator

protected OrderByTranslator<R> getOrderByTranslator()
Gets the OrderByTranslator. See setOrderByTranslator(OrderByTranslator) for details.

Returns:
order translator or null if no ordering desired

setOrderByTranslator

protected void setOrderByTranslator(OrderByTranslator<R> orderByTranslator)
Sets the OrderByTranslator that creates the sql "order by" phrase based upon the OrderBy annotations. Default is null. Set by setOrderBy(String).

Parameters:
orderByTranslator - order translator or null if no ordering desired

getSql

protected java.lang.String getSql()
Gets full sql statement to prepare. Default implementation is to use base sql + custom sql + where sql. Subclasses may override to create more detailed sql. Order by clause is appended to supergetSql().

Overrides:
getSql in class SqlOperation<R>
Returns:
sql to use in SqlOperation.prepare()

getResultSet

protected java.sql.ResultSet getResultSet()
Gets the result set of the most recent select.

Returns:
JDBC result set

initBaseSql

protected void initBaseSql()
Sets the base sql with SqlOperation.setBaseSql(String).


preRead

protected void preRead(R row)
Invoked prior to reading columns into row. Override to modify the row prior to JDBC reads. Default implementaion does nothing.

Parameters:
row - row that will get column values from table

postRead

protected void postRead(R row)
Invoked after reading columns into row. Override to modify the row after to JDBC reads. Default implementaion does nothing.

Parameters:
row - row that got column values from table

preReadCascade

protected void preReadCascade(R row)
                       throws OperationException
Invoked prior to reading row. Performs all select cascade operations where SelectCascade.post() is false.

Parameters:
row - row that will get column values from table
Throws:
OperationException

postReadCascade

protected void postReadCascade(R row)
                        throws OperationException
Invoked after reading row. Performs all select cascade operations where SelectCascade.post() is true.

Parameters:
row - row that got column values from table
Throws:
OperationException

prepareCascades

protected java.util.List<CascadeOperation<R,?>> prepareCascades(java.lang.reflect.Field field)
                                                         throws OperationException
Creates and prepares cascade operations based upon cascade annotations for a field.

Specified by:
prepareCascades in class SqlOperation<R>
Parameters:
field - annotation is for this field of row class R
Returns:
list of cascade operations; empty list for none
Throws:
OperationException - if error