From 8bf0de8a4e7f61f80184724343beb05ed5247863 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Wed, 30 May 2012 16:28:00 +0000
Subject: [PATCH] Experimental fix to overcome an issue with Oracle which
 doesn't accept more than 1000 entries in a set used in a SELECT statement.

SVN: 25411
---
 .../task/MaterialExternalDBSyncTask.java      | 45 ++++++++++++++-----
 1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java
index 67be37c431b..6a307b7bc7e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/MaterialExternalDBSyncTask.java
@@ -137,6 +137,8 @@ public class MaterialExternalDBSyncTask implements IMaintenanceTask
     @Private
     static final class MappingInfo
     {
+        private final int SELECT_CHUNK_SIZE = 500;
+
         private final String materialTypeCode;
 
         private final String tableName;
@@ -246,14 +248,29 @@ public class MaterialExternalDBSyncTask implements IMaintenanceTask
             return result;
         }
 
-        String createSelectStatement(List<Material> materials)
+        List<String> createSelectStatement(List<Material> materials)
+        {
+            final List<String> sqls = new ArrayList<String>();
+            int startIndex = 0;
+            int endIndex = Math.min(SELECT_CHUNK_SIZE, materials.size());
+            while (startIndex != endIndex)
+            {
+                sqls.add(createPartialSelectStatement(materials, startIndex, endIndex));
+                startIndex = endIndex;
+                endIndex = Math.min(endIndex + SELECT_CHUNK_SIZE, materials.size());
+            }
+            return sqls;
+        }
+
+        String createPartialSelectStatement(List<Material> materials, int startIndex, int endIndex)
         {
-            StringBuilder builder = new StringBuilder("select * from ");
+            final StringBuilder builder = new StringBuilder("select * from ");
             builder.append(tableName).append(" where ");
             builder.append(codeColumnName).append(" in ");
             String delim = "(";
-            for (Material material : materials)
+            for (int i = startIndex; i < endIndex; ++i)
             {
+                final Material material = materials.get(i);
                 builder.append(delim).append('\'').append(material.getCode()).append('\'');
                 delim = ", ";
             }
@@ -520,7 +537,7 @@ public class MaterialExternalDBSyncTask implements IMaintenanceTask
 
     private void addOrUpdate(MappingInfo mappingInfo, final List<Material> materials)
     {
-        String sql = mappingInfo.createSelectStatement(materials);
+        final List<String> sql = mappingInfo.createSelectStatement(materials);
         List<Map<String, Object>> rows = retrieveRowsToBeUpdated(sql);
         Map<String, Map<String, Object>> reportedMaterials = mappingInfo.groupByMaterials(rows);
         List<Material> newMaterials = new ArrayList<Material>();
@@ -556,16 +573,20 @@ public class MaterialExternalDBSyncTask implements IMaintenanceTask
     }
 
     @SuppressWarnings("unchecked")
-    private List<Map<String, Object>> retrieveRowsToBeUpdated(String sql)
+    private List<Map<String, Object>> retrieveRowsToBeUpdated(List<String> sqls)
     {
-        List<Map<String, Object>> rows = jdbcTemplate.query(sql, new ColumnMapRowMapper()
-            {
-                @Override
-                protected String getColumnKey(String columnName)
+        final List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
+        for (String sql : sqls)
+        {
+            rows.addAll(jdbcTemplate.query(sql, new ColumnMapRowMapper()
                 {
-                    return columnName.toLowerCase();
-                }
-            });
+                    @Override
+                    protected String getColumnKey(String columnName)
+                    {
+                        return columnName.toLowerCase();
+                    }
+                }));
+        }
         return rows;
     }
 
-- 
GitLab