From 598199dbb0779590c0b1a93c13d0458a99a596d4 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Mon, 25 May 2009 11:02:31 +0000
Subject: [PATCH] add: support for schema versioning change: use new batch
 update support of eodsql

SVN: 11131
---
 rtd_yeastx/.classpath                         |  28 ++---
 .../ch/systemsx/cisd/yeastx/db/DBFactory.java |  40 +++++--
 .../cisd/yeastx/eicml/EICML2Database.java     |  34 ++++--
 .../cisd/yeastx/eicml/IEICMSRunDAO.java       |  21 ++--
 .../yeastx/eicml/ListChromatogramLabels.java  |   2 +-
 .../cisd/yeastx/fiaml/FIAML2Database.java     | 104 ++++++------------
 .../cisd/yeastx/fiaml/IFIAMSRunDAO.java       |  15 +--
 .../cisd/yeastx/fiaml/ProfileDTO.java         |  87 +++++++++++++++
 .../001/schema-001.sql}                       |  24 ++--
 .../ReadChromatogramsPerformanceTest.java     |   2 +-
 10 files changed, 227 insertions(+), 130 deletions(-)
 create mode 100644 rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/ProfileDTO.java
 rename rtd_yeastx/source/sql/{schema.sql => postgresql/001/schema-001.sql} (87%)

diff --git a/rtd_yeastx/.classpath b/rtd_yeastx/.classpath
index ecca2a6ee13..eb162b4b474 100644
--- a/rtd_yeastx/.classpath
+++ b/rtd_yeastx/.classpath
@@ -1,13 +1,15 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="source/java"/>
-	<classpathentry kind="src" path="sourceTest/java"/>
-	<classpathentry kind="lib" path="/libraries/commons-codec/commons-codec.jar" sourcepath="/libraries/commons-codec/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/commons-lang/commons-lang.jar" sourcepath="/libraries/commons-lang/src.zip"/>
-	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
-	<classpathentry kind="lib" path="/libraries/postgresql/postgresql.jar" sourcepath="/libraries/postgresql/postgresql-src.zip"/>
-	<classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar" sourcepath="/libraries/eodsql/eodsql_src.zip"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="targets/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="source/java"/>
+	<classpathentry kind="src" path="sourceTest/java"/>
+	<classpathentry kind="lib" path="/libraries/commons-codec/commons-codec.jar" sourcepath="/libraries/commons-codec/src.zip"/>
+	<classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip"/>
+	<classpathentry kind="lib" path="/libraries/commons-lang/commons-lang.jar" sourcepath="/libraries/commons-lang/src.zip"/>
+	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
+	<classpathentry kind="lib" path="/libraries/postgresql/postgresql.jar" sourcepath="/libraries/postgresql/postgresql-src.zip"/>
+	<classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar" sourcepath="/libraries/eodsql/eodsql_src.zip"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/dbmigration"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
+	<classpathentry kind="output" path="targets/classes"/>
+</classpath>
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBFactory.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBFactory.java
index 2381ba6ac2f..a4090b816f6 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBFactory.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/db/DBFactory.java
@@ -17,11 +17,13 @@
 package ch.systemsx.cisd.yeastx.db;
 
 import java.sql.Connection;
-import java.sql.DriverManager;
 import java.sql.SQLException;
 
 import net.lemnik.eodsql.QueryTool;
 
+import ch.systemsx.cisd.dbmigration.DBMigrationEngine;
+import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
+
 /**
  * Factory for database connections.
  *
@@ -29,25 +31,39 @@ import net.lemnik.eodsql.QueryTool;
  */
 public class DBFactory
 {
+    /** Current version of the database. */
+    public static final String DATABASE_VERSION = "001";
+    
     static
     {
         QueryTool.getTypeMap().put(float[].class, new FloatArrayMapper());
     }
 
-    public static Connection getConnection() throws SQLException
+    private final DatabaseConfigurationContext context;
+
+    public DBFactory(DatabaseConfigurationContext context)
+    {
+        this.context = context;
+        DBMigrationEngine.createOrMigrateDatabaseAndGetScriptProvider(context, DATABASE_VERSION);
+    }
+    
+    public Connection getConnection() throws SQLException
     {
-        try
-        {
-            Class.forName("org.postgresql.Driver");
-        } catch (ClassNotFoundException ex)
-        {
-            throw new SQLException("No suitable driver.");
-        }
-        final Connection conn =
-            DriverManager.getConnection("jdbc:postgresql:metabol", System.getProperties()
-                    .getProperty("user.name"), "");
+        final Connection conn = context.getDataSource().getConnection();
         conn.setAutoCommit(false);
         return conn;
     }
 
+    public static DatabaseConfigurationContext createDefaultDBContext()
+    {
+        final DatabaseConfigurationContext context = new DatabaseConfigurationContext();
+        context.setDatabaseEngineCode("postgresql");
+        context.setBasicDatabaseName("metabol");
+        context.setDatabaseKind("dev");
+        context.setReadOnlyGroup("metabol_readonly");
+        context.setReadWriteGroup("metabol_readwrite");
+        context.setScriptFolder("source/sql");
+        return context;
+    }
+
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java
index 43c5ef19f56..624930e02a9 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICML2Database.java
@@ -20,6 +20,8 @@ import java.io.File;
 import java.io.IOException;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.xml.parsers.ParserConfigurationException;
 
@@ -40,18 +42,32 @@ import ch.systemsx.cisd.yeastx.eicml.EICMLParser.IMSRunObserver;
 public class EICML2Database
 {
 
+    private final static int CHROMATOGRAM_BATCH_SIZE = 100;
+
     public static IEICMSRunDAO getDAO(Connection conn)
     {
         return QueryTool.getQuery(conn, IEICMSRunDAO.class);
     }
 
+    private static void addChromatograms(IEICMSRunDAO dao, long eicMLId,
+            List<ChromatogramDTO> chromatograms, int threshold)
+    {
+        if (chromatograms.size() >= CHROMATOGRAM_BATCH_SIZE)
+        {
+            dao.addChromatograms(eicMLId, chromatograms);
+            chromatograms.clear();
+        }
+    }
+
     /**
      * Method for uploading an <var>eicMLFile</var> to the database.
      */
-    public static void uploadEicMLFile(final Connection conn, final File eicMLFile,
-            String permId) throws SQLException
+    public static void uploadEicMLFile(final Connection conn, final File eicMLFile, String permId)
+            throws SQLException
     {
-        final long[] id = new long[1];
+        final long[] eicMLId = new long[1];
+        final List<ChromatogramDTO> chromatograms =
+                new ArrayList<ChromatogramDTO>(CHROMATOGRAM_BATCH_SIZE);
         try
         {
             final IEICMSRunDAO dao = getDAO(conn);
@@ -59,16 +75,18 @@ public class EICML2Database
                 {
                     public void observe(EICMSRunDTO run)
                     {
-                        id[0] = dao.addMSRun(run);
+                        eicMLId[0] = dao.addMSRun(run);
+                        addChromatograms(dao, eicMLId[0], chromatograms, 1);
                     }
                 }, new IChromatogramObserver()
                 {
                     public void observe(ChromatogramDTO chromatogram)
                     {
-                        chromatogram.setEicMsRunId(id[0]);
-                        dao.addChromatogram(chromatogram);
+                        chromatograms.add(chromatogram);
+                        addChromatograms(dao, eicMLId[0], chromatograms, CHROMATOGRAM_BATCH_SIZE);
                     }
                 });
+            addChromatograms(dao, eicMLId[0], chromatograms, 1);
             conn.commit();
         } catch (Throwable th)
         {
@@ -86,7 +104,8 @@ public class EICML2Database
     public static void main(String[] args) throws ParserConfigurationException, SAXException,
             IOException, SQLException
     {
-        final Connection conn = DBFactory.getConnection();
+        final long start = System.currentTimeMillis();
+        final Connection conn = new DBFactory(DBFactory.createDefaultDBContext()).getConnection();
         try
         {
             final String dir = args[0];
@@ -99,6 +118,7 @@ public class EICML2Database
         {
             conn.close();
         }
+        System.out.println((System.currentTimeMillis() - start) / 1000.0);
     }
 
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java
index 1e7d0ecfd22..a32d0a685b6 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/IEICMSRunDAO.java
@@ -16,9 +16,12 @@
 
 package ch.systemsx.cisd.yeastx.eicml;
 
+import java.util.List;
+
 import net.lemnik.eodsql.BaseQuery;
 import net.lemnik.eodsql.DataIterator;
 import net.lemnik.eodsql.Select;
+import net.lemnik.eodsql.Update;
 
 /**
  * Interface for querying / updating the metabol database.
@@ -42,11 +45,11 @@ public interface IEICMSRunDAO extends BaseQuery
             + "?{1.methodSeparation}, ?{1.setId}, ?{1.operator}, ?{1.startTime}, ?{1.endTime}) returning eicMsRunId")
     public long addMSRun(EICMSRunDTO msRun);
 
-    @Select("INSERT INTO chromatograms (eicMsRunId, Q1MZ, Q3LowMz, Q3HighMz, label, polarity, runTimes, "
-            + "intensities) values (?{1.eicMsRunId}, ?{1.q1Mz}, "
-            + "?{1.q3LowMz}, ?{1.q3HighMz}, ?{1.label}, "
-            + "?{1.polarity}, ?{1.runTimes}, ?{1.intensities}) returning chromId")
-    public long addChromatogram(ChromatogramDTO chromatogram);
+    @Update(sql = "INSERT INTO chromatograms (eicMsRunId, Q1MZ, Q3LowMz, Q3HighMz, label, polarity, runTimes, "
+            + "intensities) values (?{1}, ?{2.q1Mz}, ?{2.q3LowMz}, ?{2.q3HighMz}, ?{2.label}, "
+            + "?{2.polarity}, ?{2.runTimes}, ?{2.intensities})", batchUpdate = true, parameterTypes =
+        { Long.class, ChromatogramDTO.class })
+    public void addChromatograms(long eicMsRunId, List<ChromatogramDTO> chromatogram);
 
     @Select(sql = "SELECT * from eicmsruns", rubberstamp = true)
     public DataIterator<EICMSRunDTO> getMsRuns();
@@ -70,16 +73,16 @@ public interface IEICMSRunDAO extends BaseQuery
 
     @Select("SELECT chromatograms.* FROM chromatograms where chromId=?{1}")
     public ChromatogramDTO getChromatogramById(long id);
-    
+
     @Select("SELECT chromatograms.* FROM chromatograms where label=?{1}")
     public ChromatogramDTO getChromatogramByLabel(String label);
 
-    @Select(sql = "SELECT chromatograms.* FROM chromatograms LEFT JOIN eicmsruns USING(eicMsRunId) "
-            + "where eicMsRunId=?{1.eicMsRunId}", rubberstamp = true)
+    @Select("SELECT chromatograms.* FROM chromatograms LEFT JOIN eicmsruns USING(eicMsRunId) "
+            + "where eicMsRunId=?{1.eicMsRunId}")
     public DataIterator<ChromatogramDTO> getChromatogramsForRun(EICMSRunDTO msRun);
 
     @Select(sql = "SELECT chromId, eicMsRunId, Q1Mz, Q3LowMz, Q3HighMz, label, polarity FROM chromatograms "
-            + "LEFT JOIN eicmsruns USING(eicMsRunId) " + "where eicMsRunId=?{1.eicMsRunId}", rubberstamp = true)
+            + "LEFT JOIN eicmsruns USING(eicMsRunId) " + "where eicMsRunId=?{1.eicMsRunId}")
     public DataIterator<ChromatogramDTO> getChromatogramsForRunNoData(EICMSRunDTO msRun);
 
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/ListChromatogramLabels.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/ListChromatogramLabels.java
index 7ac602839b7..e5b50a783bd 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/ListChromatogramLabels.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/ListChromatogramLabels.java
@@ -33,7 +33,7 @@ public class ListChromatogramLabels
 
     public static void main(String[] args) throws SQLException
     {
-        final Connection conn = DBFactory.getConnection();
+        final Connection conn = new DBFactory(DBFactory.createDefaultDBContext()).getConnection();
         try
         {
             final IEICMSRunDAO dao = EICML2Database.getDAO(conn);
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java
index d8856dc148f..f017266053b 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/FIAML2Database.java
@@ -17,10 +17,9 @@
 package ch.systemsx.cisd.yeastx.fiaml;
 
 import java.io.File;
-import java.sql.BatchUpdateException;
 import java.sql.Connection;
-import java.sql.PreparedStatement;
 import java.sql.SQLException;
+import java.util.Iterator;
 
 import net.lemnik.eodsql.QueryTool;
 
@@ -43,67 +42,39 @@ public class FIAML2Database
         return QueryTool.getQuery(conn, IFIAMSRunDAO.class);
     }
 
-    private static void addProfilesForRun(final Connection conn, final long fiaMsRunId,
-            FIAMSRunDataDTO runData) throws SQLException
+    private static Iterable<ProfileDTO> profileChunk(final FIAMSRunDataDTO runData)
     {
-        try
-        {
-            final PreparedStatement prepProfile =
-                    conn.prepareStatement("INSERT INTO profiles "
-                            + "(fiaMsRunId, lowMz, highMz, mz, "
-                            + "intensities) values (?, ?, ?, ?, ?)");
-            final float[] mz = runData.getProfileMz();
-            final float[] intensities = runData.getProfileIntensities();
-            for (int i = 0; i < mz.length; i += PROFILE_CHUNK_SIZE)
+        return new Iterable<ProfileDTO>()
             {
-                final int imax = Math.min(mz.length, i + PROFILE_CHUNK_SIZE);
-                prepProfile.setLong(1, fiaMsRunId);
-                prepProfile.setFloat(2, mz[i]);
-                prepProfile.setFloat(3, mz[imax - 1]);
-                prepProfile.setString(4, toString(mz, i, imax));
-                prepProfile.setString(5, toString(intensities, i, imax));
-                prepProfile.addBatch();
-            }
-            prepProfile.executeBatch();
-        } catch (BatchUpdateException ex)
-        {
-            throw ex.getNextException();
-        }
-    }
+                public Iterator<ProfileDTO> iterator()
+                {
+                    return new Iterator<ProfileDTO>()
+                        {
+                            int i = 0;
 
-    private static String toString(float[] array, int start, int end)
-    {
-        StringBuilder b = new StringBuilder();
-        for (int i = start; i < end; ++i)
-        {
-            b.append(array[i]);
-            b.append(',');
-        }
-        b.setLength(b.length() - 1);
-        return b.toString();
-    }
+                            public boolean hasNext()
+                            {
+                                return i < runData.getProfileMz().length;
+                            }
 
-    private static void addCentroidsForRun(final Connection conn, final long fiaMsRunId,
-            FIAMSRunDataDTO runData) throws SQLException
-    {
-        try
-        {
-            final PreparedStatement prepCentroid =
-                    conn.prepareStatement("INSERT INTO centroids (fiaMsRunId, mz, "
-                            + "intensity, correlation) values (?, ?, ?, ?)");
-            for (int i = 0; i < runData.getCentroidMz().length; ++i)
-            {
-                prepCentroid.setLong(1, fiaMsRunId);
-                prepCentroid.setFloat(2, runData.getCentroidMz()[i]);
-                prepCentroid.setFloat(3, runData.getCentroidIntensities()[i]);
-                prepCentroid.setFloat(4, runData.getCentroidCorrelations()[i]);
-                prepCentroid.addBatch();
-            }
-            prepCentroid.executeBatch();
-        } catch (BatchUpdateException ex)
-        {
-            throw ex.getNextException();
-        }
+                            public ProfileDTO next()
+                            {
+                                final int imax =
+                                        Math.min(runData.getProfileMz().length, i
+                                                + PROFILE_CHUNK_SIZE);
+                                final int imin = i;
+                                i = imax;
+                                return ProfileDTO.split(runData.getProfileMz(), runData
+                                        .getProfileIntensities(), imin, imax);
+                            }
+
+                            public void remove()
+                            {
+                                throw new UnsupportedOperationException();
+                            }
+                        };
+                }
+            };
     }
 
     /**
@@ -120,14 +91,11 @@ public class FIAML2Database
                     public void observe(FIAMSRunDTO run, FIAMSRunDataDTO runData)
                     {
                         final long fiaMsRunId = dao.addMSRun(run);
-                        try
-                        {
-                            addProfilesForRun(conn, fiaMsRunId, runData);
-                            addCentroidsForRun(conn, fiaMsRunId, runData);
-                        } catch (SQLException ex)
-                        {
-                            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
-                        }
+                        getDAO(conn).addProfiles(fiaMsRunId, profileChunk(runData));
+                        getDAO(conn)
+                                .addCentroids(fiaMsRunId, runData.getCentroidMz(),
+                                        runData.getCentroidIntensities(),
+                                        runData.getCentroidCorrelations());
                     }
                 });
             conn.commit();
@@ -147,7 +115,7 @@ public class FIAML2Database
     public static void main(String[] args) throws SQLException
     {
         final long start = System.currentTimeMillis();
-        final Connection conn = DBFactory.getConnection();
+        final Connection conn = new DBFactory(DBFactory.createDefaultDBContext()).getConnection();
         try
         {
             final String dir = args[0];
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/IFIAMSRunDAO.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/IFIAMSRunDAO.java
index 796b8db17a2..a5359fdeac2 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/IFIAMSRunDAO.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/IFIAMSRunDAO.java
@@ -44,12 +44,13 @@ public interface IFIAMSRunDAO extends BaseQuery
             + "?{1.internalStandard}, ?{1.od}, ?{1.operator}) returning fiaMsRunId")
     public long addMSRun(FIAMSRunDTO msRun);
 
-    // Too slow as eodsql 2.0 doesn't support batch updates.
-    @Update("INSERT INTO profiles (fiaMsRunId, mz, intensity) values (?{1}, ?{2}, ?{3})")
-    public void addProfileEntry(long fiaMsRunId, float mz, float intensity);
+    @Update(sql = "INSERT INTO centroids (fiaMsRunId, mz, intensity, correlation) "
+            + "values (?{1}, ?{2}, ?{3}, ?{4})", batchUpdate = true)
+    public void addCentroids(long fiaMsRunId, float[] mz, float[] intensity, float[] correlation);
+
+    @Update(sql = "INSERT INTO profiles (fiaMsRunId, lowMz, highMz, mz, intensities) "
+            + "values (?{1}, ?{2.lowMz}, ?{2.highMz}, ?{2.mz}, ?{2.intensities})", batchUpdate = true, parameterTypes =
+        { Long.class, ProfileDTO.class })
+    public void addProfiles(long fiaMsRunId, Iterable<ProfileDTO> profiles);
 
-    // Too slow as eodsql 2.0 doesn't support batch updates.
-    @Update("INSERT INTO centroids (fiaMsRunId, mz, intensity, correlation) "
-            + "values (?{1}, ?{2}, ?{3}, ?{4})")
-    public void addCentroidEntry(long fiaMsRunId, float mz, float intensity, float correlation);
 }
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/ProfileDTO.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/ProfileDTO.java
new file mode 100644
index 00000000000..8d9a06abee7
--- /dev/null
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/fiaml/ProfileDTO.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.yeastx.fiaml;
+
+/**
+ * A data transfer object for "mz over intensity" profiles.
+ *
+ * @author Bernd Rinn
+ */
+public class ProfileDTO
+{
+    private float lowMz;
+    
+    private float highMz;
+    
+    private float[] mz;
+
+    private float[] intensities;
+
+    public static ProfileDTO split(float[] mz, float[] intensities, int imin, int imax)
+    {
+        final ProfileDTO dto = new ProfileDTO();
+        final float[] mzChunk = new float[imax - imin];
+        System.arraycopy(mz, imin, mzChunk, 0, imax - imin);
+        dto.setMz(mzChunk);
+        dto.setLowMz(mzChunk[0]);
+        dto.setHighMz(mzChunk[mzChunk.length - 1]);
+        final float[] intChunk = new float[imax - imin];
+        System.arraycopy(intensities, imin, intChunk, 0, imax - imin);
+        dto.setIntensities(intChunk);
+        return dto;
+    }
+    
+    public float getLowMz()
+    {
+        return lowMz;
+    }
+
+    public void setLowMz(float lowMz)
+    {
+        this.lowMz = lowMz;
+    }
+
+    public float getHighMz()
+    {
+        return highMz;
+    }
+
+    public void setHighMz(float highMz)
+    {
+        this.highMz = highMz;
+    }
+
+    public float[] getMz()
+    {
+        return mz;
+    }
+
+    public void setMz(float[] mz)
+    {
+        this.mz = mz;
+    }
+
+    public float[] getIntensities()
+    {
+        return intensities;
+    }
+
+    public void setIntensities(float[] intensities)
+    {
+        this.intensities = intensities;
+    }
+}
\ No newline at end of file
diff --git a/rtd_yeastx/source/sql/schema.sql b/rtd_yeastx/source/sql/postgresql/001/schema-001.sql
similarity index 87%
rename from rtd_yeastx/source/sql/schema.sql
rename to rtd_yeastx/source/sql/postgresql/001/schema-001.sql
index cd1301e9484..94f5cc3ec0c 100644
--- a/rtd_yeastx/source/sql/schema.sql
+++ b/rtd_yeastx/source/sql/postgresql/001/schema-001.sql
@@ -1,12 +1,6 @@
-CREATE DATABASE metabol ENCODING 'UTF8';
-
-CREATE ROLE metabol_readonly;
-
-CREATE ROLE metabol_readwrite;
-
-GRANT metabol_readwrite to brinn;
-
-\c metabol
+-----------------------------------
+-- Version 001
+-----------------------------------
 
 CREATE TABLE eicmsruns (
   eicMsRunId BIGSERIAL NOT NULL,
@@ -66,26 +60,30 @@ CREATE TABLE fiamsruns (
 );
 
 CREATE TABLE profiles (
+  profileId BIGSERIAL NOT NULL,
   fiaMsRunId BIGINT NOT NULL,
   lowMz REAL NOT NULL,
   highMz REAL NOT NULL,
   mz TEXT NOT NULL,
   intensities TEXT NOT NULL,
-  PRIMARY KEY (fiaMsRunId, lowMz),
+  PRIMARY KEY (profileId),
   CONSTRAINT FK_profiles_1 FOREIGN KEY (fiaMsRunId) REFERENCES fiamsruns (fiaMsRunId) ON DELETE CASCADE ON UPDATE CASCADE
 );
 
-CREATE INDEX profile_idx on profiles(fiaMsRunId, lowMz, highMz);
+CREATE INDEX profile_i on profiles(fiaMsRunId, lowMz, highMz);
 
 CREATE TABLE centroids (
+  centroidId BIGSERIAL NOT NULL,
   fiaMsRunId BIGINT NOT NULL,
   mz REAL NOT NULL,
   intensity REAL NOT NULL,
   correlation REAL NOT NULL,
-  PRIMARY KEY (fiaMsRunId, mz),
+  PRIMARY KEY (centroidId),
   CONSTRAINT FK_centroids_1 FOREIGN KEY (fiaMsRunId) REFERENCES fiamsruns (fiaMsRunId) ON DELETE CASCADE ON UPDATE CASCADE
 );
 
+CREATE INDEX centroid_i on centroids(fiaMsRunId, mz);
+
 GRANT SELECT ON TABLE eicmsruns TO GROUP metabol_readonly;
 GRANT SELECT ON TABLE chromatograms TO GROUP metabol_readonly;
 GRANT SELECT ON TABLE fiamsruns TO GROUP metabol_readonly;
@@ -103,3 +101,5 @@ GRANT ALL PRIVILEGES ON TABLE centroids TO GROUP metabol_readwrite;
 GRANT ALL PRIVILEGES ON SEQUENCE eicmsruns_eicmsrunid_seq TO GROUP metabol_readwrite;
 GRANT ALL PRIVILEGES ON SEQUENCE chromatograms_chromid_seq TO GROUP metabol_readwrite;
 GRANT ALL PRIVILEGES ON SEQUENCE fiamsruns_fiamsrunid_seq TO GROUP metabol_readwrite;
+GRANT ALL PRIVILEGES ON SEQUENCE profiles_profileid_seq TO GROUP metabol_readwrite;
+GRANT ALL PRIVILEGES ON SEQUENCE centroids_centroidid_seq TO GROUP metabol_readwrite;
diff --git a/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/ReadChromatogramsPerformanceTest.java b/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/ReadChromatogramsPerformanceTest.java
index 783a5c309bd..ba7fb6d009c 100644
--- a/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/ReadChromatogramsPerformanceTest.java
+++ b/rtd_yeastx/sourceTest/java/ch/systemsx/cisd/yeastx/eicml/ReadChromatogramsPerformanceTest.java
@@ -31,8 +31,8 @@ public class ReadChromatogramsPerformanceTest
 
     public static void main(String[] args) throws SQLException
     {
+        final Connection conn = new DBFactory(DBFactory.createDefaultDBContext()).getConnection();
         long start = System.currentTimeMillis();
-        final Connection conn = DBFactory.getConnection();
         try
         {
             final IEICMSRunDAO dao = EICML2Database.getDAO(conn);
-- 
GitLab