Print

Print


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();
                 }