Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2019-09-19 06:07:54 +0000
committerEike Stepper2019-09-19 06:07:54 +0000
commit8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac (patch)
treec06b2cbfb572d28613cba7c768d310be94c3f951 /plugins/org.eclipse.emf.cdo.server.db
parent8580a5382feae010a8276d7b10cff84778121668 (diff)
downloadcdo-8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac.tar.gz
cdo-8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac.tar.xz
cdo-8c2bdd31d762cf3958af1cb0ba0735162d2aa3ac.zip
[551232] [DB] Support range-based mappings in CDOServerImporter
https://bugs.eclipse.org/bugs/show_bug.cgi?id=551232
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.db')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/META-INF/MANIFEST.MF16
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/pom.xml2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IClassMapping.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IListMapping4.java41
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBBrowserPage.java20
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java10
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java23
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditListTableMappingWithRanges.java68
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingListTableMappingWithRanges.java56
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java17
10 files changed, 198 insertions, 59 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.db/META-INF/MANIFEST.MF
index 28dbed16d0..483bc116a8 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.server.db/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.eclipse.emf.cdo.server.db;singleton:=true
-Bundle-Version: 4.6.100.qualifier
+Bundle-Version: 4.7.0.qualifier
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -12,11 +12,11 @@ Bundle-ClassPath: .
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
org.eclipse.net4j.db;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport
-Export-Package: org.eclipse.emf.cdo.server.db;version="4.6.100",
- org.eclipse.emf.cdo.server.db.mapping;version="4.6.100",
- org.eclipse.emf.cdo.server.internal.db;version="4.6.100";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db,org.eclipse.emf.cdo.explorer.ui",
- org.eclipse.emf.cdo.server.internal.db.bundle;version="4.6.100";x-internal:=true,
- org.eclipse.emf.cdo.server.internal.db.mapping;version="4.6.100";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db",
- org.eclipse.emf.cdo.server.internal.db.mapping.horizontal;version="4.6.100";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db",
- org.eclipse.emf.cdo.server.internal.db.messages;version="4.6.100";x-internal:=true
+Export-Package: org.eclipse.emf.cdo.server.db;version="4.7.0",
+ org.eclipse.emf.cdo.server.db.mapping;version="4.7.0",
+ org.eclipse.emf.cdo.server.internal.db;version="4.7.0";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db,org.eclipse.emf.cdo.explorer.ui",
+ org.eclipse.emf.cdo.server.internal.db.bundle;version="4.7.0";x-internal:=true,
+ org.eclipse.emf.cdo.server.internal.db.mapping;version="4.7.0";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db",
+ org.eclipse.emf.cdo.server.internal.db.mapping.horizontal;version="4.7.0";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db",
+ org.eclipse.emf.cdo.server.internal.db.messages;version="4.7.0";x-internal:=true
Automatic-Module-Name: org.eclipse.emf.cdo.server.db
diff --git a/plugins/org.eclipse.emf.cdo.server.db/pom.xml b/plugins/org.eclipse.emf.cdo.server.db/pom.xml
index 4479ad80cb..b9bbbb2f03 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/pom.xml
+++ b/plugins/org.eclipse.emf.cdo.server.db/pom.xml
@@ -25,7 +25,7 @@
<groupId>org.eclipse.emf.cdo</groupId>
<artifactId>org.eclipse.emf.cdo.server.db</artifactId>
- <version>4.6.100-SNAPSHOT</version>
+ <version>4.7.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IClassMapping.java
index e462b09462..fd25c86097 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IClassMapping.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IClassMapping.java
@@ -100,7 +100,7 @@ public interface IClassMapping
* the accessor to use.
* @param revision
* the revision to write.
- * @param mapType
+ * @param firstRevision
* <code>true</code> if the type of the object is supposed to be mapped, <code>false</code> otherwise.
* @param revise
* <code>true</code> if the previous revision is supposed to be revised, <code>false</code> otherwise.
@@ -108,7 +108,7 @@ public interface IClassMapping
* the monitor to indicate progress.
* @since 4.0
*/
- public void writeRevision(IDBStoreAccessor accessor, InternalCDORevision revision, boolean mapType, boolean revise, OMMonitor monitor);
+ public void writeRevision(IDBStoreAccessor accessor, InternalCDORevision revision, boolean firstRevision, boolean revise, OMMonitor monitor);
/**
* Detaches (deletes) a CDO object leaving a "ghost" revision behind.
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IListMapping4.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IListMapping4.java
new file mode 100644
index 0000000000..5e53e7e796
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/mapping/IListMapping4.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2019 Eike Stepper (Loehne, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.server.db.mapping;
+
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.server.IStoreAccessor.Raw;
+import org.eclipse.emf.cdo.server.db.IDBStoreAccessor;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
+
+/**
+ * Extension interface to {@link IListMapping3}.
+ *
+ * @author Eike Stepper
+ * @since 4.7
+ */
+public interface IListMapping4
+{
+ /**
+ * Write a complete list of values to the database.
+ *
+ * @param accessor
+ * the accessor to use.
+ * @param revision
+ * the revision containing the list to be written.
+ * @param firstRevision
+ * <code>true</code> if the type of the object is supposed to be mapped, <code>false</code> otherwise.
+ * @param raw
+ * <code>true</code> if this method is called as part of the
+ * {@link Raw#rawStore(InternalCDORevision, org.eclipse.net4j.util.om.monitor.OMMonitor) raw} storage,
+ * <code>false</code> otherwise.
+ */
+ public void writeValues(IDBStoreAccessor accessor, CDORevision revision, boolean firstRevision, boolean raw);
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBBrowserPage.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBBrowserPage.java
index fe6b898f77..b04fa210da 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBBrowserPage.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBBrowserPage.java
@@ -10,8 +10,11 @@
*/
package org.eclipse.emf.cdo.server.internal.db;
+import org.eclipse.emf.cdo.internal.server.ServerDebugUtil;
import org.eclipse.emf.cdo.server.CDOServerBrowser;
import org.eclipse.emf.cdo.server.CDOServerBrowser.AbstractPage;
+import org.eclipse.emf.cdo.server.IStoreAccessor;
+import org.eclipse.emf.cdo.server.db.IDBStoreAccessor;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.net4j.db.DBException;
@@ -47,10 +50,20 @@ public class DBBrowserPage extends AbstractPage
{
IDBConnectionProvider connectionProvider = (IDBConnectionProvider)repository.getStore();
Connection connection = null;
+ boolean closeConnection = false;
try
{
- connection = connectionProvider.getConnection();
+ IStoreAccessor accessor = ServerDebugUtil.getAccessor(repository);
+ if (accessor instanceof IDBStoreAccessor)
+ {
+ connection = ((IDBStoreAccessor)accessor).getConnection();
+ }
+ else
+ {
+ connection = connectionProvider.getConnection();
+ closeConnection = true;
+ }
out.print("<table border=\"0\">\r\n");
out.print("<tr>\r\n");
@@ -75,7 +88,10 @@ public class DBBrowserPage extends AbstractPage
}
finally
{
- DBUtil.close(connection);
+ if (closeConnection)
+ {
+ DBUtil.close(connection);
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
index 99bfa0f933..b3d1278872 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
@@ -607,7 +607,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
throw new UnsupportedOperationException();
}
- protected void writeRevision(InternalCDORevision revision, boolean mapType, boolean revise, OMMonitor monitor)
+ protected void writeRevision(InternalCDORevision revision, boolean firstRevision, boolean revise, OMMonitor monitor)
{
if (TRACER.isEnabled())
{
@@ -617,7 +617,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
EClass eClass = revision.getEClass();
IClassMapping mapping = getStore().getMappingStrategy().getClassMapping(eClass);
- mapping.writeRevision(this, revision, mapType, revise, monitor);
+ mapping.writeRevision(this, revision, firstRevision, revise, monitor);
}
@Override
@@ -1349,8 +1349,8 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
IMappingStrategy mappingStrategy = getStore().getMappingStrategy();
CDOClassifierRef classifierRef = mappingStrategy.readObjectType(this, id);
- boolean isFirstRevision = classifierRef == null;
- if (!isFirstRevision)
+ boolean firstRevision = classifierRef == null;
+ if (!firstRevision)
{
boolean namesMatch = classifierRef.getClassifierName().equals(eClass.getName());
boolean packagesMatch = classifierRef.getPackageURI().equals(eClass.getEPackage().getNsURI());
@@ -1360,7 +1360,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
}
}
- writeRevision(revision, isFirstRevision, false, monitor);
+ writeRevision(revision, firstRevision, false, monitor);
getStore().getIDHandler().adjustLastObjectID(id);
}
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java
index fbd69b3ee6..162eb46651 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java
@@ -39,6 +39,7 @@ import org.eclipse.emf.cdo.server.db.IIDHandler;
import org.eclipse.emf.cdo.server.db.mapping.IClassMapping;
import org.eclipse.emf.cdo.server.db.mapping.IListMapping;
import org.eclipse.emf.cdo.server.db.mapping.IListMapping3;
+import org.eclipse.emf.cdo.server.db.mapping.IListMapping4;
import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping;
import org.eclipse.emf.cdo.server.internal.db.DBIndexAnnotation;
@@ -613,15 +614,22 @@ public abstract class AbstractHorizontalClassMapping implements IClassMapping, I
}
}
- protected void writeLists(IDBStoreAccessor accessor, InternalCDORevision revision)
+ protected void writeLists(IDBStoreAccessor accessor, InternalCDORevision revision, boolean firstRevision, boolean raw)
{
for (IListMapping listMapping : listMappings)
{
- listMapping.writeValues(accessor, revision);
+ if (listMapping instanceof IListMapping4)
+ {
+ ((IListMapping4)listMapping).writeValues(accessor, revision, firstRevision, raw);
+ }
+ else
+ {
+ listMapping.writeValues(accessor, revision);
+ }
}
}
- public void writeRevision(IDBStoreAccessor accessor, InternalCDORevision revision, boolean mapType, boolean revise, OMMonitor monitor)
+ public void writeRevision(IDBStoreAccessor accessor, InternalCDORevision revision, boolean firstRevision, boolean revise, OMMonitor monitor)
{
if (table == null)
{
@@ -660,7 +668,7 @@ public abstract class AbstractHorizontalClassMapping implements IClassMapping, I
try
{
async = monitor.forkAsync();
- if (mapType)
+ if (firstRevision)
{
mappingStrategy.putObjectType(accessor, timeStamp, id, eClass);
}
@@ -718,7 +726,7 @@ public abstract class AbstractHorizontalClassMapping implements IClassMapping, I
if (listMappings != null)
{
async = monitor.forkAsync(7);
- writeLists(accessor, revision);
+ writeLists(accessor, revision, firstRevision, !revise);
}
else
{
@@ -796,6 +804,11 @@ public abstract class AbstractHorizontalClassMapping implements IClassMapping, I
}
}
+ builder.append(" ORDER BY "); //$NON-NLS-1$
+ builder.append(ATTRIBUTES_ID);
+ builder.append(", "); //$NON-NLS-1$
+ builder.append(ATTRIBUTES_VERSION);
+
IIDHandler idHandler = getMappingStrategy().getStore().getIDHandler();
IDBPreparedStatement stmt = accessor.getDBConnection().prepareStatement(builder.toString(), ReuseProbability.LOW);
ResultSet resultSet = null;
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditListTableMappingWithRanges.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditListTableMappingWithRanges.java
index 8a27cfa925..96d5c782e2 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditListTableMappingWithRanges.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditListTableMappingWithRanges.java
@@ -16,9 +16,12 @@
package org.eclipse.emf.cdo.server.internal.db.mapping.horizontal;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDOList;
import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionManager;
+import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOClearFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta;
@@ -38,12 +41,14 @@ import org.eclipse.emf.cdo.server.db.IDBStoreAccessor;
import org.eclipse.emf.cdo.server.db.IDBStoreChunkReader;
import org.eclipse.emf.cdo.server.db.IIDHandler;
import org.eclipse.emf.cdo.server.db.mapping.IClassMapping;
+import org.eclipse.emf.cdo.server.db.mapping.IListMapping4;
import org.eclipse.emf.cdo.server.db.mapping.IListMappingDeltaSupport;
import org.eclipse.emf.cdo.server.db.mapping.IListMappingUnitSupport;
import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping;
import org.eclipse.emf.cdo.server.internal.db.bundle.OM;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.net4j.db.DBException;
@@ -74,14 +79,14 @@ import java.util.List;
* This is a list-table mapping for audit mode. It is optimized for frequent insert operations at the list's end, which
* causes just 1 DB row to be changed. This is achieved by introducing a version range (columns cdo_version_added and
* cdo_version_removed) which records for which revisions a particular entry existed. Also, this mapping is mainly
- * optimized for potentially very large lists: the need for having the complete list stored in memopy to do
+ * optimized for potentially very large lists: the need for having the complete list stored in memory to do
* in-the-middle-moved and inserts is traded in for a few more DB access operations.
*
* @author Eike Stepper
* @author Stefan Winkler
* @author Lothar Werzinger
*/
-public class AuditListTableMappingWithRanges extends AbstractBasicListTableMapping implements IListMappingDeltaSupport, IListMappingUnitSupport
+public class AuditListTableMappingWithRanges extends AbstractBasicListTableMapping implements IListMappingDeltaSupport, IListMappingUnitSupport, IListMapping4
{
private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, AuditListTableMappingWithRanges.class);
@@ -503,6 +508,30 @@ public class AuditListTableMappingWithRanges extends AbstractBasicListTableMappi
}
}
+ public void writeValues(IDBStoreAccessor accessor, CDORevision revision, boolean firstRevision, boolean raw)
+ {
+ if (firstRevision || !raw)
+ {
+ writeValues(accessor, (InternalCDORevision)revision);
+ }
+ else
+ {
+ InternalCDORevisionManager revisionManager = (InternalCDORevisionManager)getMappingStrategy().getStore().getRepository().getRevisionManager();
+ InternalCDORevision baseRevision = revisionManager.getBaseRevision(revision, CDORevision.UNCHUNKED, true);
+
+ EStructuralFeature feature = getFeature();
+ CDOListFeatureDelta delta = CDORevisionUtil.compareLists(baseRevision, revision, feature);
+
+ if (delta != null && !delta.getListChanges().isEmpty())
+ {
+ int oldVersion = baseRevision.getVersion();
+ int newVersion = revision.getVersion();
+
+ processDelta(accessor, baseRevision, oldVersion, newVersion, delta.getListChanges());
+ }
+ }
+ }
+
public void writeValues(IDBStoreAccessor accessor, InternalCDORevision revision)
{
CDOList values = revision.getListOrNull(getFeature());
@@ -596,11 +625,11 @@ public class AuditListTableMappingWithRanges extends AbstractBasicListTableMappi
TRACER.format("objectRevised {0}: {1}", id, revised); //$NON-NLS-1$
}
- CDOBranch main = getMappingStrategy().getStore().getRepository().getBranchManager().getMainBranch();
+ IRepository repository = getMappingStrategy().getStore().getRepository();
+ CDOBranch main = repository.getBranchManager().getMainBranch();
// get revision from cache to find out version number
- CDORevision revision = getMappingStrategy().getStore().getRepository().getRevisionManager().getRevision(id, main.getHead(), /* chunksize = */0,
- CDORevision.DEPTH_NONE, true);
+ CDORevision revision = repository.getRevisionManager().getRevision(id, main.getHead(), 0, CDORevision.DEPTH_NONE, true);
// set cdo_revision_removed for all list items (so we have no NULL values)
clearList(accessor, id, revision.getVersion(), FINAL_VERSION);
@@ -869,34 +898,37 @@ public class AuditListTableMappingWithRanges extends AbstractBasicListTableMappi
}
}
- public void processDelta(final IDBStoreAccessor accessor, final CDOID id, final int branchId, int oldVersion, final int newVersion, long created,
- CDOListFeatureDelta delta)
+ public void processDelta(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, long created, CDOListFeatureDelta delta)
{
List<CDOFeatureDelta> listChanges = delta.getListChanges();
- int size = listChanges.size();
- if (size == 0)
+ if (listChanges.size() == 0)
{
// nothing to do.
return;
}
- if (table == null)
- {
- initTable(accessor);
- }
-
- IRepository repo = accessor.getStore().getRepository();
- InternalCDORevision originalRevision = (InternalCDORevision)repo.getRevisionManager().getRevision(id, repo.getBranchManager().getMainBranch().getHead(),
- /* chunksize = */0, CDORevision.DEPTH_NONE, true);
+ IRepository repository = accessor.getStore().getRepository();
+ CDORevisionManager revisionManager = repository.getRevisionManager();
+ CDOBranchPoint head = repository.getBranchManager().getMainBranch().getHead();
- int oldListSize = originalRevision.size(getFeature());
+ InternalCDORevision originalRevision = (InternalCDORevision)revisionManager.getRevision(id, head, /* chunksize = */0, CDORevision.DEPTH_NONE, true);
+ processDelta(accessor, originalRevision, oldVersion, newVersion, listChanges);
+ }
+ private void processDelta(IDBStoreAccessor accessor, InternalCDORevision originalRevision, int oldVersion, int newVersion, List<CDOFeatureDelta> listChanges)
+ {
if (TRACER.isEnabled())
{
+ int oldListSize = originalRevision.size(getFeature());
TRACER.format("ListTableMapping.processDelta for revision {0} - previous list size: {1}", originalRevision, //$NON-NLS-1$
oldListSize);
}
+ if (table == null)
+ {
+ initTable(accessor);
+ }
+
// let the visitor collect the changes
ListDeltaVisitor visitor = new ListDeltaVisitor(accessor, originalRevision, oldVersion, newVersion);
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 8aa6f61f7f..1f17e24dd9 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
@@ -19,6 +19,7 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDOList;
import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOClearFeatureDelta;
import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta;
@@ -38,6 +39,7 @@ import org.eclipse.emf.cdo.server.db.IDBStore;
import org.eclipse.emf.cdo.server.db.IDBStoreAccessor;
import org.eclipse.emf.cdo.server.db.IDBStoreChunkReader;
import org.eclipse.emf.cdo.server.db.IIDHandler;
+import org.eclipse.emf.cdo.server.db.mapping.IListMapping4;
import org.eclipse.emf.cdo.server.db.mapping.IListMappingDeltaSupport;
import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping;
@@ -84,7 +86,7 @@ import java.util.List;
* @author Stefan Winkler
* @author Lothar Werzinger
*/
-public class BranchingListTableMappingWithRanges extends AbstractBasicListTableMapping implements IListMappingDeltaSupport
+public class BranchingListTableMappingWithRanges extends AbstractBasicListTableMapping implements IListMappingDeltaSupport, IListMapping4
{
private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, BranchingListTableMappingWithRanges.class);
@@ -648,6 +650,31 @@ public class BranchingListTableMappingWithRanges extends AbstractBasicListTableM
}
}
+ public void writeValues(IDBStoreAccessor accessor, CDORevision revision, boolean firstRevision, boolean raw)
+ {
+ if (firstRevision || !raw)
+ {
+ writeValues(accessor, (InternalCDORevision)revision);
+ }
+ else
+ {
+ InternalCDORevisionManager revisionManager = (InternalCDORevisionManager)getMappingStrategy().getStore().getRepository().getRevisionManager();
+ InternalCDORevision baseRevision = revisionManager.getBaseRevision(revision, CDORevision.UNCHUNKED, true);
+
+ EStructuralFeature feature = getFeature();
+ CDOListFeatureDelta delta = CDORevisionUtil.compareLists(baseRevision, revision, feature);
+
+ if (delta != null && !delta.getListChanges().isEmpty())
+ {
+ int branchID = revision.getBranch().getID();
+ int oldVersion = baseRevision.getVersion();
+ int newVersion = revision.getVersion();
+
+ processDelta(accessor, baseRevision, branchID, oldVersion, newVersion, delta.getListChanges());
+ }
+ }
+ }
+
public void writeValues(IDBStoreAccessor accessor, InternalCDORevision revision)
{
CDOList values = revision.getListOrNull(getFeature());
@@ -761,31 +788,34 @@ public class BranchingListTableMappingWithRanges extends AbstractBasicListTableM
throw new UnsupportedOperationException("Raw deletion does not work in range-based mappings");
}
- public void processDelta(final IDBStoreAccessor accessor, final CDOID id, final int branchId, final int oldVersion, final int newVersion, long created,
- CDOListFeatureDelta delta)
+ public void processDelta(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, long created, CDOListFeatureDelta delta)
{
List<CDOFeatureDelta> listChanges = delta.getListChanges();
- int size = listChanges.size();
- if (size == 0)
+ if (listChanges.size() == 0)
{
// nothing to do.
return;
}
- if (table == null)
- {
- initTable(accessor);
- }
-
InternalCDORevision originalRevision = (InternalCDORevision)accessor.getTransaction().getRevision(id);
- int oldListSize = originalRevision.size(getFeature());
+ processDelta(accessor, originalRevision, branchId, oldVersion, newVersion, listChanges);
+ }
+ private void processDelta(IDBStoreAccessor accessor, InternalCDORevision originalRevision, int branchId, int oldVersion, int newVersion,
+ List<CDOFeatureDelta> listChanges)
+ {
if (TRACER.isEnabled())
{
+ int oldListSize = originalRevision.size(getFeature());
TRACER.format("ListTableMapping.processDelta for revision {0} - previous list size: {1}", originalRevision, //$NON-NLS-1$
oldListSize);
}
+ if (table == null)
+ {
+ initTable(accessor);
+ }
+
// let the visitor collect the changes
ListDeltaVisitor visitor = new ListDeltaVisitor(accessor, originalRevision, branchId, oldVersion, newVersion);
@@ -797,7 +827,7 @@ public class BranchingListTableMappingWithRanges extends AbstractBasicListTableM
// optimization: it's only necessary to process deltas
// starting with the last feature delta which clears the list
// (any operation before the clear is cascaded by it anyway)
- int index = size - 1;
+ int index = listChanges.size() - 1;
while (index > 0)
{
CDOFeatureDelta listDelta = listChanges.get(index);
@@ -808,7 +838,7 @@ public class BranchingListTableMappingWithRanges extends AbstractBasicListTableM
index--;
}
- while (index < size)
+ while (index < listChanges.size())
{
listChanges.get(index++).accept(visitor);
}
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java
index 89938c3fa5..a921177c34 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java
@@ -578,7 +578,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
}
@Override
- public void writeRevision(IDBStoreAccessor accessor, InternalCDORevision revision, boolean mapType, boolean revise, OMMonitor monitor)
+ public void writeRevision(IDBStoreAccessor accessor, InternalCDORevision revision, boolean firstRevision, boolean revise, OMMonitor monitor)
{
if (getTable() == null)
{
@@ -617,7 +617,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
try
{
async = monitor.forkAsync();
- if (mapType)
+ if (firstRevision)
{
// Put new objects into objectTypeMapper
EClass eClass = getEClass();
@@ -625,11 +625,11 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
AbstractHorizontalMappingStrategy mappingStrategy = (AbstractHorizontalMappingStrategy)getMappingStrategy();
if (!mappingStrategy.putObjectType(accessor, timeStamp, id, eClass))
{
- mapType = false;
+ firstRevision = false;
}
}
- if (!mapType && revise && version > CDOBranchVersion.FIRST_VERSION)
+ if (!firstRevision && revise && version > CDOBranchVersion.FIRST_VERSION)
{
// If revision is not the first one, revise the old revision
long revised = timeStamp - 1;
@@ -685,7 +685,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
async = monitor.forkAsync(7);
if (getListMappings() != null)
{
- writeLists(accessor, revision);
+ writeLists(accessor, revision, firstRevision, !revise);
}
}
finally
@@ -757,6 +757,13 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp
}
}
+ builder.append(" ORDER BY "); //$NON-NLS-1$
+ builder.append(ATTRIBUTES_ID);
+ builder.append(", "); //$NON-NLS-1$
+ builder.append(ATTRIBUTES_VERSION);
+ builder.append(", "); //$NON-NLS-1$
+ builder.append(ATTRIBUTES_BRANCH);
+
IRepository repository = accessor.getStore().getRepository();
CDORevisionManager revisionManager = repository.getRevisionManager();
CDOBranchManager branchManager = repository.getBranchManager();

Back to the top