Author: [log in to unmask] Date: Fri Aug 28 15:27:16 2015 New Revision: 3450 Log: Rewrite scaler data backend in run database. HPSJAVA-594 Modified: java/trunk/record-util/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java Modified: java/trunk/record-util/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java ============================================================================= --- java/trunk/record-util/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java (original) +++ java/trunk/record-util/src/main/java/org/hps/rundb/ScalerDataDaoImpl.java Fri Aug 28 15:27:16 2015 @@ -8,6 +8,7 @@ import java.util.List; import org.hps.record.scalers.ScalerData; +import org.hps.record.scalers.ScalerDataIndex; /** * Implementation of database API for {@link org.hps.record.scalers.ScalerData} in the run database. @@ -22,17 +23,30 @@ private static final class ScalerDataQuery { /** - * Delete by run. - */ - private static final String DELETE_RUN = "DELETE FROM run_scalers WHERE run = ?"; - /** * Insert a record. */ - private static final String INSERT = "INSERT INTO run_scalers (run, event, idx, value) VALUES (?, ?, ?, ?)"; - /** - * Select by run. - */ - private static final String SELECT_RUN = "SELECT event, idx, value FROM run_scalers WHERE run = ? ORDER BY event, idx"; + private static final String INSERT = createInsertSql(); + } + + /** + * Create insert SQL for scaler data. + * + * @return the SQL insert string + */ + private static String createInsertSql() { + final StringBuffer sb = new StringBuffer(); + sb.append("INSERT INTO scalers ( run, event, timestamp, "); + for (final ScalerDataIndex index : ScalerDataIndex.values()) { + sb.append(index.name().toLowerCase() + ", "); + } + sb.setLength(sb.length() - 2); + sb.append(" ) VALUES ( ?, ?, ?, "); + for (int i = 0; i < ScalerDataIndex.values().length; i++) { + sb.append("?, "); + } + sb.setLength(sb.length() - 2); + sb.append(" )"); + return sb.toString(); } /** @@ -61,7 +75,7 @@ public void deleteScalerData(final int run) { PreparedStatement preparedStatement = null; try { - preparedStatement = connection.prepareStatement(ScalerDataQuery.DELETE_RUN); + preparedStatement = connection.prepareStatement("DELETE FROM scalers WHERE run = ?"); preparedStatement.setInt(1, run); preparedStatement.executeUpdate(); } catch (final SQLException e) { @@ -85,48 +99,28 @@ */ @Override public List<ScalerData> getScalerData(final int run) { - PreparedStatement preparedStatement = null; + PreparedStatement selectScalers = null; final List<ScalerData> scalerDataList = new ArrayList<ScalerData>(); try { - preparedStatement = this.connection.prepareStatement(ScalerDataQuery.SELECT_RUN); - preparedStatement.setInt(1, run); - final ResultSet resultSet = preparedStatement.executeQuery(); - - int[] scalerArray = new int[ScalerData.ARRAY_SIZE]; - int event = 0; - + selectScalers = this.connection.prepareStatement("SELECT * FROM scalers WHERE run = ? ORDER BY event"); + selectScalers.setInt(1, run); + final ResultSet resultSet = selectScalers.executeQuery(); while (resultSet.next()) { - - // Get record data. - event = resultSet.getInt("event"); - final int idx = resultSet.getInt("idx"); - final int value = resultSet.getInt("value"); - - // Is this the start of a new scaler data set and not the first one? - if (idx == 0 && resultSet.getRow() > 1) { - // Create new scaler data object and add to list. - final ScalerData scalerData = new ScalerData(scalerArray, event); - scalerDataList.add(scalerData); - - // Reset the data array for next object. - scalerArray = new int[ScalerData.ARRAY_SIZE]; + final int[] data = new int[ScalerData.ARRAY_SIZE]; + for (final ScalerDataIndex index : ScalerDataIndex.values()) { + data[index.index()] = resultSet.getInt(index.name().toLowerCase()); } - - // Set value by index. - scalerArray[idx] = value; + final int event = resultSet.getInt("event"); + final int timestamp = resultSet.getInt("timestamp"); + final ScalerData scalerData = new ScalerData(data, event, timestamp); + scalerDataList.add(scalerData); } - - // Add the last object which will not happen inside the loop. - if (scalerArray != null) { - scalerDataList.add(new ScalerData(scalerArray, event)); - } - } catch (final SQLException e) { throw new RuntimeException(e); } finally { - if (preparedStatement != null) { + if (selectScalers != null) { try { - preparedStatement.close(); + selectScalers.close(); } catch (final SQLException e) { e.printStackTrace(); } @@ -143,29 +137,29 @@ */ @Override public void insertScalerData(final List<ScalerData> scalerDataList, final int run) { - PreparedStatement preparedStatement = null; + PreparedStatement insertScalers = null; try { - preparedStatement = this.connection.prepareStatement(ScalerDataQuery.INSERT); + insertScalers = this.connection.prepareStatement(ScalerDataQuery.INSERT); for (final ScalerData scalerData : scalerDataList) { - final int size = scalerData.size(); - final Integer event = scalerData.getEventId(); - if (event == null) { - throw new IllegalStateException("The scaler data is missing the event ID."); + insertScalers.setInt(1, run); + insertScalers.setInt(2, scalerData.getEventId()); + insertScalers.setInt(3, scalerData.getTimestamp()); + int parameterIndex = 4; + for (final ScalerDataIndex index : ScalerDataIndex.values()) { + insertScalers.setInt(parameterIndex, scalerData.getValue(index)); + ++parameterIndex; } - for (int i = 0; i < size; i++) { - preparedStatement.setInt(1, run); - preparedStatement.setInt(2, event); - preparedStatement.setInt(3, i); - preparedStatement.setInt(4, scalerData.getValue(i)); - preparedStatement.executeUpdate(); + final int rowsAffected = insertScalers.executeUpdate(); + if (rowsAffected == 0) { + throw new SQLException("Creation of scalers failed; no rows affected."); } } } catch (final SQLException e) { throw new RuntimeException(e); } finally { - if (preparedStatement != null) { + if (insertScalers != null) { try { - preparedStatement.close(); + insertScalers.close(); } catch (final SQLException e) { e.printStackTrace(); }