Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2015-08-15 08:27:55 +0000
committerEike Stepper2015-08-15 08:27:55 +0000
commitaff55d74f59fc7915dae22175c73e2960206b0db (patch)
tree7590bc4b89ae309bcf03fc38b6f315feabf071ff /plugins/org.eclipse.net4j.db
parent23ba5dd08145f170273ba6f4f19e8f31b102e25d (diff)
downloadcdo-aff55d74f59fc7915dae22175c73e2960206b0db.tar.gz
cdo-aff55d74f59fc7915dae22175c73e2960206b0db.tar.xz
cdo-aff55d74f59fc7915dae22175c73e2960206b0db.zip
[474681] Add mapping strategy option to support index creation on all cross references
https://bugs.eclipse.org/bugs/show_bug.cgi?id=474681
Diffstat (limited to 'plugins/org.eclipse.net4j.db')
-rw-r--r--plugins/org.eclipse.net4j.db/META-INF/MANIFEST.MF24
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/IDBTable.java5
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/delta/IDBIndexDelta.java5
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBIndex.java12
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBSchema.java3
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBTable.java34
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBIndex.java10
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBTable.java5
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBIndexDelta.java8
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java5
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java52
-rw-r--r--plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/ddl/InternalDBIndex.java10
12 files changed, 154 insertions, 19 deletions
diff --git a/plugins/org.eclipse.net4j.db/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.db/META-INF/MANIFEST.MF
index 01089f321b..85f44d8a3c 100644
--- a/plugins/org.eclipse.net4j.db/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j.db/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.net4j.db;singleton:=true
-Bundle-Version: 4.4.100.qualifier
+Bundle-Version: 4.5.0.qualifier
Bundle-Activator: org.eclipse.net4j.internal.db.bundle.OM$Activator
Bundle-Vendor: %providerName
Bundle-ClassPath: .
@@ -11,16 +11,16 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
org.eclipse.net4j.util;bundle-version="[3.0.0,4.0.0)";visibility:=reexport,
org.eclipse.net4j.db.jdbc;bundle-version="[4.0.0,5.0.0)"
-Export-Package: org.eclipse.net4j.db;version="4.4.100",
- org.eclipse.net4j.db.ddl;version="4.4.100",
- org.eclipse.net4j.db.ddl.delta;version="4.4.100",
- org.eclipse.net4j.db.dml;version="4.4.100",
- org.eclipse.net4j.internal.db;version="4.4.100";x-internal:=true,
- org.eclipse.net4j.internal.db.bundle;version="4.4.100";x-internal:=true,
- org.eclipse.net4j.internal.db.ddl;version="4.4.100";x-friends:="org.eclipse.emf.cdo.server.db",
- org.eclipse.net4j.internal.db.ddl.delta;version="4.4.100";x-internal:=true,
- org.eclipse.net4j.internal.db.dml;version="4.4.100";x-internal:=true,
- org.eclipse.net4j.spi.db;version="4.4.100",
- org.eclipse.net4j.spi.db.ddl;version="4.4.100"
+Export-Package: org.eclipse.net4j.db;version="4.5.0",
+ org.eclipse.net4j.db.ddl;version="4.5.0",
+ org.eclipse.net4j.db.ddl.delta;version="4.5.0",
+ org.eclipse.net4j.db.dml;version="4.5.0",
+ org.eclipse.net4j.internal.db;version="4.5.0";x-internal:=true,
+ org.eclipse.net4j.internal.db.bundle;version="4.5.0";x-internal:=true,
+ org.eclipse.net4j.internal.db.ddl;version="4.5.0";x-friends:="org.eclipse.emf.cdo.server.db",
+ org.eclipse.net4j.internal.db.ddl.delta;version="4.5.0";x-internal:=true,
+ org.eclipse.net4j.internal.db.dml;version="4.5.0";x-internal:=true,
+ org.eclipse.net4j.spi.db;version="4.5.0",
+ org.eclipse.net4j.spi.db.ddl;version="4.5.0"
Bundle-ActivationPolicy: lazy
Eclipse-BuddyPolicy: registered
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/IDBTable.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/IDBTable.java
index f029f12a2e..af5cfc8845 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/IDBTable.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/IDBTable.java
@@ -57,6 +57,11 @@ public interface IDBTable extends IDBSchemaElement
public IDBField[] getFields(String... fieldNames) throws SchemaElementNotFoundException;
/**
+ * @since 4.5
+ */
+ public boolean hasIndexFor(IDBField... fields);
+
+ /**
* @since 4.2
*/
public IDBIndex addIndex(String name, IDBIndex.Type type, IDBField... fields);
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/delta/IDBIndexDelta.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/delta/IDBIndexDelta.java
index 4e51feab0e..9162f65078 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/delta/IDBIndexDelta.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/db/ddl/delta/IDBIndexDelta.java
@@ -25,6 +25,11 @@ public interface IDBIndexDelta extends IDBDeltaWithProperties
{
public static final String TYPE_PROPERTY = "type";
+ /**
+ * @since 4.5
+ */
+ public static final String OPTIONAL_PROPERTY = "optional";
+
public IDBTableDelta getParent();
public int getIndexFieldDeltaCount();
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBIndex.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBIndex.java
index 0e76c53c39..3258cabbe0 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBIndex.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBIndex.java
@@ -54,6 +54,8 @@ public class DBIndex extends DBSchemaElement implements InternalDBIndex
private List<IDBIndexField> indexFields = new ArrayList<IDBIndexField>();
+ private boolean optional;
+
public DBIndex(IDBTable table, String name, Type type, IDBField[] fields)
{
super(name);
@@ -111,6 +113,16 @@ public class DBIndex extends DBSchemaElement implements InternalDBIndex
this.type = type;
}
+ public boolean isOptional()
+ {
+ return optional;
+ }
+
+ public void setOptional(boolean optional)
+ {
+ this.optional = optional;
+ }
+
@Deprecated
public int getPosition()
{
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBSchema.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBSchema.java
index 4bb34c2778..b4349c0398 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBSchema.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBSchema.java
@@ -25,6 +25,7 @@ import org.eclipse.net4j.db.ddl.IDBTable;
import org.eclipse.net4j.db.ddl.SchemaElementNotFoundException;
import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta;
import org.eclipse.net4j.internal.db.ddl.delta.DBSchemaDelta;
+import org.eclipse.net4j.spi.db.ddl.InternalDBIndex;
import org.eclipse.net4j.spi.db.ddl.InternalDBSchema;
import javax.sql.DataSource;
@@ -75,6 +76,8 @@ public class DBSchema extends DBSchemaElement implements InternalDBSchema
for (IDBIndex sourceIndex : sourceTable.getIndices())
{
IDBIndex index = table.addIndexEmpty(sourceIndex.getName(), sourceIndex.getType());
+ ((InternalDBIndex)index).setOptional(((InternalDBIndex)sourceIndex).isOptional());
+
for (IDBField sourceField : sourceIndex.getFields())
{
IDBField field = table.getField(sourceField.getPosition());
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBTable.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBTable.java
index 8b602d1e39..2502e88641 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBTable.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DBTable.java
@@ -180,6 +180,20 @@ public class DBTable extends DBSchemaElement implements InternalDBTable
return result.toArray(new IDBField[result.size()]);
}
+ public boolean hasIndexFor(IDBField... fields)
+ {
+ for (IDBIndex index : indices)
+ {
+ IDBField[] indexFields = index.getFields();
+ if (startsWith(indexFields, fields))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
public IDBIndex addIndex(String name, IDBIndex.Type type, IDBField... fields)
{
assertUnlocked();
@@ -339,4 +353,24 @@ public class DBTable extends DBSchemaElement implements InternalDBTable
{
((InternalDBSchema)schema).assertUnlocked();
}
+
+ private static boolean startsWith(IDBField[] indexFields, IDBField[] fields)
+ {
+ int length = fields.length;
+ if (length <= indexFields.length)
+ {
+ for (int i = 0; i < length; i++)
+ {
+ IDBField field = fields[i];
+ if (field != indexFields[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
}
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBIndex.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBIndex.java
index 4fb261f9de..65df3641fc 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBIndex.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBIndex.java
@@ -80,6 +80,16 @@ public final class DelegatingDBIndex extends DelegatingDBSchemaElement implement
getDelegate().removeIndexField(unwrap(indexFieldToRemove));
}
+ public boolean isOptional()
+ {
+ return getDelegate().isOptional();
+ }
+
+ public void setOptional(boolean optional)
+ {
+ getDelegate().setOptional(optional);
+ }
+
@Deprecated
public int getPosition()
{
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBTable.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBTable.java
index 8b4575bba5..b3dffb2583 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBTable.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/DelegatingDBTable.java
@@ -139,6 +139,11 @@ public final class DelegatingDBTable extends DelegatingDBSchemaElement implement
return wrap(getDelegate().getFields(fieldNames), IDBField.class);
}
+ public boolean hasIndexFor(IDBField... fields)
+ {
+ return getDelegate().hasIndexFor(unwrap(fields, IDBField.class));
+ }
+
public IDBIndex addIndex(String name, Type type, IDBField... fields)
{
return wrap(getDelegate().addIndex(name, type, unwrap(fields, IDBField.class)));
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBIndexDelta.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBIndexDelta.java
index ec8c902e01..fcd559ec79 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBIndexDelta.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBIndexDelta.java
@@ -55,6 +55,14 @@ public final class DBIndexDelta extends DBDeltaWithProperties implements IDBInde
new DBPropertyDelta<IDBIndex.Type>(this, TYPE_PROPERTY, IDBPropertyDelta.Type.STRING, type, oldType));
}
+ Boolean optional = index == null ? null : ((InternalDBIndex)index).isOptional();
+ Boolean oldOptional = oldIndex == null ? null : ((InternalDBIndex)oldIndex).isOptional();
+ if (!ObjectUtil.equals(optional, oldOptional))
+ {
+ addPropertyDelta(
+ new DBPropertyDelta<Boolean>(this, OPTIONAL_PROPERTY, IDBPropertyDelta.Type.BOOLEAN, optional, oldOptional));
+ }
+
IDBIndexField[] indexFields = index == null ? InternalDBIndex.NO_INDEX_FIELDS : index.getIndexFields();
IDBIndexField[] oldIndexFields = oldIndex == null ? InternalDBIndex.NO_INDEX_FIELDS : oldIndex.getIndexFields();
compare(indexFields, oldIndexFields, new SchemaElementComparator<IDBIndexField>()
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java
index 8975ed4620..8a5b1357f3 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/ddl/delta/DBSchemaDelta.java
@@ -23,6 +23,7 @@ import org.eclipse.net4j.db.ddl.delta.IDBIndexDelta;
import org.eclipse.net4j.db.ddl.delta.IDBIndexFieldDelta;
import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta;
import org.eclipse.net4j.db.ddl.delta.IDBTableDelta;
+import org.eclipse.net4j.spi.db.ddl.InternalDBIndex;
import org.eclipse.net4j.spi.db.ddl.InternalDBSchema;
import java.text.MessageFormat;
@@ -201,9 +202,11 @@ public final class DBSchemaDelta extends DBDelta implements IDBSchemaDelta
{
String name = delta.getName();
IDBIndex.Type type = delta.getPropertyValue(IDBIndexDelta.TYPE_PROPERTY);
+ Boolean optional = delta.getPropertyValue(IDBIndexDelta.OPTIONAL_PROPERTY);
IDBTable table = delta.getParent().getSchemaElement(schema);
- table.addIndexEmpty(name, type);
+ InternalDBIndex index = (InternalDBIndex)table.addIndexEmpty(name, type);
+ index.setOptional(optional == Boolean.TRUE);
}
@Override
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java
index 030fa78a1d..fbd52b6c73 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/DBAdapter.java
@@ -27,6 +27,7 @@ import org.eclipse.net4j.db.ddl.delta.IDBSchemaDelta;
import org.eclipse.net4j.db.ddl.delta.IDBTableDelta;
import org.eclipse.net4j.internal.db.bundle.OM;
import org.eclipse.net4j.internal.db.ddl.DBField;
+import org.eclipse.net4j.spi.db.ddl.InternalDBIndex;
import org.eclipse.net4j.util.CheckUtil;
import org.eclipse.net4j.util.om.trace.ContextTracer;
@@ -395,21 +396,41 @@ public abstract class DBAdapter implements IDBAdapter
@Override
public void visit(IDBIndexDelta delta)
{
- IDBIndex element = delta.getSchemaElement(schema);
+ InternalDBIndex index = (InternalDBIndex)delta.getSchemaElement(schema);
ChangeKind changeKind = delta.getChangeKind();
switch (changeKind)
{
case ADD:
- createIndex(connection, element, delta);
+ try
+ {
+ createIndex(connection, index, delta);
+ }
+ catch (RuntimeException ex)
+ {
+ if (!index.isOptional())
+ {
+ throw ex;
+ }
+ }
break;
case REMOVE:
- dropIndex(connection, element, delta);
+ dropIndex(connection, index, delta);
break;
case CHANGE:
- dropIndex(connection, element, delta);
- createIndex(connection, element, delta);
+ dropIndex(connection, index, delta);
+ try
+ {
+ createIndex(connection, index, delta);
+ }
+ catch (RuntimeException ex)
+ {
+ if (!index.isOptional())
+ {
+ throw ex;
+ }
+ }
break;
default:
@@ -769,7 +790,26 @@ public abstract class DBAdapter implements IDBAdapter
IDBIndex[] indices = table.getIndices();
for (int i = 0; i < indices.length; i++)
{
- createIndex(indices[i], statement, i);
+ InternalDBIndex index = (InternalDBIndex)indices[i];
+
+ try
+ {
+ createIndex(index, statement, i);
+ }
+ catch (SQLException ex)
+ {
+ if (!index.isOptional())
+ {
+ throw ex;
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ if (!index.isOptional())
+ {
+ throw ex;
+ }
+ }
}
}
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/ddl/InternalDBIndex.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/ddl/InternalDBIndex.java
index 2494661b20..ff3dfafe73 100644
--- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/ddl/InternalDBIndex.java
+++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/spi/db/ddl/InternalDBIndex.java
@@ -26,4 +26,14 @@ public interface InternalDBIndex extends IDBIndex, InternalDBSchemaElement
public IDBIndex getWrapper();
public void removeIndexField(IDBIndexField indexFieldToRemove);
+
+ /**
+ * @since 4.5
+ */
+ public boolean isOptional();
+
+ /**
+ * @since 4.5
+ */
+ public void setOptional(boolean optional);
}

Back to the top