Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java33
1 files changed, 19 insertions, 14 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java
index bb6bb589de..128ac25cf3 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java
@@ -53,6 +53,7 @@ import org.eclipse.net4j.db.ddl.IDBIndex.Type;
import org.eclipse.net4j.db.ddl.IDBTable;
import org.eclipse.net4j.util.ImplementationError;
import org.eclipse.net4j.util.collection.MoveableList;
+import org.eclipse.net4j.util.collection.Pair;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EClass;
@@ -63,6 +64,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
@@ -316,7 +318,8 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
PreparedStatement stmt = null;
ResultSet resultSet = null;
- IStoreChunkReader baseReader = null;
+ // list of chunks to be read from base revision
+ ArrayList<Pair<Integer, Integer>> toReadFromBase = null;
try
{
String sql = sqlSelectChunksPrefix + sqlOrderByIndex;
@@ -336,12 +339,12 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
int index = resultSet.getInt(1);
if (index > currentIndex)
{
- if (baseReader == null)
+ if (toReadFromBase == null)
{
- baseReader = createBaseChunkReader(accessor, id, branchID);
+ toReadFromBase = new ArrayList<Pair<Integer, Integer>>();
}
+ toReadFromBase.add(new Pair<Integer, Integer>(currentIndex, index));
- baseReader.addRangedChunk(currentIndex, index);
if (TRACER.isEnabled())
{
TRACER.format("Scheduling range {0}-{1} to be read from base revision", currentIndex, index); //$NON-NLS-1$
@@ -363,17 +366,11 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
if (valuesToRead > 0)
{
- if (baseReader == null)
- {
- baseReader = createBaseChunkReader(accessor, id, branchID);
- }
-
- baseReader.addRangedChunk(currentIndex, currentIndex + valuesToRead);
- if (TRACER.isEnabled())
+ if (toReadFromBase == null)
{
- TRACER.format(
- "Scheduling range {0}-{1} to be read from base revision", currentIndex, currentIndex + valuesToRead); //$NON-NLS-1$
+ toReadFromBase = new ArrayList<Pair<Integer, Integer>>();
}
+ toReadFromBase.add(new Pair<Integer, Integer>(currentIndex, currentIndex + valuesToRead));
}
}
catch (SQLException ex)
@@ -386,14 +383,22 @@ public class BranchingListTableMappingWithRanges extends BasicAbstractListTableM
statementCache.releasePreparedStatement(stmt);
}
- if (baseReader != null)
+ // read missing values from base revision ...
+ if (toReadFromBase != null)
{
+ IStoreChunkReader baseReader = createBaseChunkReader(accessor, id, branchID);
+
if (TRACER.isEnabled())
{
TRACER.format("Reading base revision chunks for feature {0}.{1} of {2} from base revision {3}", //$NON-NLS-1$
getContainingClass().getName(), getFeature().getName(), revision, baseReader.getRevision());
}
+ for (Pair<Integer, Integer> range : toReadFromBase)
+ {
+ baseReader.addRangedChunk(range.getElement1(), range.getElement2());
+ }
+
List<Chunk> baseChunks = baseReader.executeRead();
for (Chunk chunk : baseChunks)
{

Back to the top