diff options
author | Eike Stepper | 2015-08-15 08:27:55 +0000 |
---|---|---|
committer | Eike Stepper | 2015-08-15 08:27:55 +0000 |
commit | aff55d74f59fc7915dae22175c73e2960206b0db (patch) | |
tree | 7590bc4b89ae309bcf03fc38b6f315feabf071ff /plugins/org.eclipse.net4j.db | |
parent | 23ba5dd08145f170273ba6f4f19e8f31b102e25d (diff) | |
download | cdo-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')
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); } |