/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.metamodels.relational.aspects.sql; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.index.IndexConstants; import org.teiid.designer.core.metamodel.aspect.MetamodelEntity; import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect; import org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper; import org.teiid.designer.core.metamodel.aspect.sql.SqlProcedureAspect; import org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect; import org.teiid.designer.core.resource.EmfResource; import org.teiid.designer.extension.ExtensionPlugin; import org.teiid.designer.metadata.runtime.MetadataConstants; import org.teiid.designer.metamodels.core.ModelAnnotation; import org.teiid.designer.metamodels.core.ModelType; import org.teiid.designer.metamodels.relational.BaseTable; import org.teiid.designer.metamodels.relational.Column; import org.teiid.designer.metamodels.relational.Index; import org.teiid.designer.metamodels.relational.RelationalPlugin; import org.teiid.designer.metamodels.relational.Table; import org.teiid.designer.metamodels.relational.UniqueKey; import org.teiid.designer.metamodels.relational.View; import org.teiid.designer.metamodels.relational.util.RelationalUtil; /** * BaseTableAspect * * @since 8.0 */ public class TableAspect extends RelationalEntityAspect implements SqlTableAspect { public TableAspect(final MetamodelEntity entity) { super(entity); } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#supportsUpdate(org.eclipse.emf.ecore.EObject) */ @Override public boolean supportsUpdate(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table table = (Table) eObject; return table.isSupportsUpdate(); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#getTableType(org.eclipse.emf.ecore.EObject) */ @Override public int getTableType(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table table = (Table) eObject; if(table instanceof View) { return MetadataConstants.TABLE_TYPES.VIEW_TYPE; } // Check if the table belongs to a materialized view model ... final Resource resource = eObject.eResource(); if (resource instanceof EmfResource) { final ModelAnnotation annot = ((EmfResource)resource).getModelAnnotation(); if (annot.getModelType() == ModelType.MATERIALIZATION_LITERAL) { return MetadataConstants.TABLE_TYPES.MATERIALIZED_TYPE; } if( annot.getModelType() == ModelType.VIRTUAL_LITERAL && RelationalUtil.isGlobalTempTable(eObject)) { return MetadataConstants.TABLE_TYPES.GLOBAL_TEMPORARY_TABLE_TYPE; } } return MetadataConstants.TABLE_TYPES.TABLE_TYPE; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#isSystem(org.eclipse.emf.ecore.EObject) */ @Override public boolean isSystem(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table table = (Table) eObject; return table.isSystem(); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#getMaterializedTableId(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public String getMaterializedTableId(EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table table = (Table) eObject; if( table != null ) { Table materializedTable = table.getMaterializedTable(); if( materializedTable != null ) { return ModelerCore.getObjectId(materializedTable).toString(); } } return null; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#isVirtual(org.eclipse.emf.ecore.EObject) */ @Override public boolean isVirtual(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table table = (Table) eObject; try { ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(table); return (ma != null && ma.getModelType().getValue() == ModelType.VIRTUAL); } catch(Exception e) { RelationalPlugin.Util.log(IStatus.ERROR, e, e.getMessage()); } return false; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#isMaterialized(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public boolean isMaterialized(EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table table = (Table) eObject; return table.isMaterialized(); } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#isMaterialized(org.eclipse.emf.ecore.EObject) * @since 4.2 */ @Override public boolean isGlobalTempTable(EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); // Find extension property, if it doesnt exist, it's "false" // else check the value and return proper boolean Properties props = new Properties(); try { props = ExtensionPlugin.getInstance().getModelExtensionAssistantAggregator().getPropertyValues(eObject); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if( props == null || props.isEmpty() ) return false; for( Object key : props.keySet() ) { String keyStr = (String)key; if( keyStr.equalsIgnoreCase("global-temp-table")) { String value = props.getProperty(keyStr); return Boolean.getBoolean(value); } } return false; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#getColumns(org.eclipse.emf.ecore.EObject) */ @Override public List getColumns(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table baseTable = (Table) eObject; return baseTable.getColumns(); } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#getIndexes(org.eclipse.emf.ecore.EObject) */ @Override public Collection getIndexes(final EObject eObject) { // Go through the columns and grab the indexes used by each column final List results = new ArrayList(); if ( eObject instanceof BaseTable ) { final BaseTable baseTable = (BaseTable)eObject; final Iterator iter = baseTable.getColumns().iterator(); while (iter.hasNext()) { final Column column = (Column)iter.next(); // For each column, get the indexes that reference the column final List indexesUsingColumn = column.getIndexes(); // Add indexes to the results, ensuring not to add the same index more than once final Iterator indexIter = indexesUsingColumn.iterator(); while (indexIter.hasNext()) { final Index index = (Index)indexIter.next(); if (!results.contains(index) ) { results.add(index); } } } } return results; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#getForeignKeys(org.eclipse.emf.ecore.EObject) */ @Override public Collection getForeignKeys(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); if(eObject instanceof BaseTable){ BaseTable baseTable = (BaseTable) eObject; return baseTable.getForeignKeys(); } return Collections.EMPTY_LIST; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#getPrimaryKey(org.eclipse.emf.ecore.EObject) */ @Override public Object getPrimaryKey(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); if(eObject instanceof BaseTable){ BaseTable baseTable = (BaseTable) eObject; return baseTable.getPrimaryKey(); } return null; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#getUniqueKeys(org.eclipse.emf.ecore.EObject) */ @Override public Collection getUniqueKeys(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); // Go through the columns and grab the indexes used by each column final List results = new ArrayList(); if ( eObject instanceof BaseTable ) { final BaseTable table = (BaseTable)eObject; final Iterator iter = table.getColumns().iterator(); while (iter.hasNext()) { final Column column = (Column)iter.next(); // For each column, get the unique keys that reference the column final List ukeysUsingColumn = column.getUniqueKeys(); // Add indexes to the results, ensuring not to add the same index more than once final Iterator uKIter = ukeysUsingColumn.iterator(); while (uKIter.hasNext()) { final UniqueKey uniqueKey = (UniqueKey) uKIter.next(); if (!results.contains(uniqueKey) ) { results.add(uniqueKey); } } } } return results; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#getAccessPatterns(org.eclipse.emf.ecore.EObject) */ @Override public Collection getAccessPatterns(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table baseTable = (Table) eObject; return baseTable.getAccessPatterns(); } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlBaseTableAspect#getCardinality(org.eclipse.emf.ecore.EObject) */ @Override public int getCardinality(final EObject eObject) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table baseTable = (Table) eObject; return baseTable.getCardinality(); } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnSetAspect#getType() */ @Override public int getColumnSetType() { return MetadataConstants.COLUMN_SET_TYPES.TABLE; } /* (non-Javadoc) * @See org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#isRecordType(char) */ @Override public boolean isRecordType(final char recordType) { return (recordType == IndexConstants.RECORD_TYPE.TABLE); } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#isMappable(org.eclipse.emf.ecore.EObject, int) */ @Override public boolean isMappable(final EObject eObject, final int mappingType) { if(isVirtual(eObject)) { return (mappingType == SqlTableAspect.MAPPINGS.SQL_TRANSFORM); } return false; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#canAcceptTransformationSource(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject) * @since 4.3 */ @Override public boolean canAcceptTransformationSource(EObject target, EObject source) { CoreArgCheck.isInstanceOf(Table.class, target); CoreArgCheck.isNotNull(source); // no object should be source of itself if(source == target) { return false; } if(isVirtual(target)) { SqlAspect sourceAspect = SqlAspectHelper.getSqlAspect(source); if(sourceAspect instanceof SqlTableAspect || sourceAspect instanceof SqlProcedureAspect) { return true; } } return false; } /** * @see org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#canBeTransformationSource(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject) * @since 4.3 */ @Override public boolean canBeTransformationSource(EObject source, EObject target) { CoreArgCheck.isInstanceOf(Table.class, source); CoreArgCheck.isNotNull(target); // no object should be source of itself if(source == target) { return false; } SqlAspect targetAspect = SqlAspectHelper.getSqlAspect(target); if(targetAspect instanceof SqlTableAspect) { return ((SqlTableAspect) targetAspect).isVirtual(target); } else if(targetAspect instanceof SqlProcedureAspect) { return ((SqlProcedureAspect) targetAspect).isVirtual(target); } return false; } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#updateObject(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject) */ @Override public void updateObject(final EObject targetObject, final EObject sourceObject) { } /* * @See org.teiid.designer.core.metamodel.aspect.sql.SqlTableAspect#setSupportsUpdate(org.eclipse.emf.ecore.EObject, boolean) */ @Override public void setSupportsUpdate(final EObject eObject, final boolean supportsUpdate) { CoreArgCheck.isInstanceOf(Table.class, eObject); Table baseTable = (Table) eObject; baseTable.setSupportsUpdate(supportsUpdate); } }