/*
* 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 org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.index.IndexConstants;
import org.teiid.designer.core.metamodel.aspect.AspectManager;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.MetamodelEntity;
import org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect;
import org.teiid.designer.core.resource.EmfResource;
import org.teiid.designer.core.types.DatatypeManager;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.relational.Column;
import org.teiid.designer.metamodels.relational.ColumnSet;
import org.teiid.designer.metamodels.relational.NullableType;
import org.teiid.designer.metamodels.relational.RelationalPackage;
import org.teiid.designer.metamodels.relational.SearchabilityType;
/**
* ColumnAspect
*
* @since 8.0
*/
public class ColumnAspect extends RelationalEntityAspect implements SqlColumnAspect {
public ColumnAspect(MetamodelEntity entity) {
super(entity);
}
//==================================================================================
// I N T E R F A C E M E T H O D S
//==================================================================================
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isSelectable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isSelectable(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isSelectable();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isUpdatable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isUpdatable(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isUpdateable();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isNullable(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getNullType(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
NullableType nullType = column.getNullable();
return convertNullableTypeToMetadataConstant(nullType);
//return nullType.getValue();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isAutoIncrementable(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isAutoIncrementable(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isAutoIncremented();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isCaseSensitive(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isCaseSensitive(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isCaseSensitive();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isSigned(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isSigned(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isSigned();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isCurrency(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isCurrency(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isCurrency();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isFixedLength(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isFixedLength(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.isFixedLength();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isTranformationInputParameter(org.eclipse.emf.ecore.EObject)
* @since 4.2
*/
@Override
public boolean isTranformationInputParameter(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
// First, only process virtual models ...
Resource eResource = column.eResource();
if (eResource instanceof EmfResource) {
EmfResource emfResource = (EmfResource)eResource;
ModelAnnotation modelAnnot = emfResource.getModelAnnotation();
if (modelAnnot != null && modelAnnot.getModelType() == ModelType.VIRTUAL_LITERAL) {
ColumnAspect columnAspect = (ColumnAspect)AspectManager.getSqlAspect(eObject);
if (!columnAspect.isSelectable(eObject) && !isAutoIncrementable(eObject)) {
return true;
}
}
}
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getSearchTye(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getSearchType(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
SearchabilityType searchType = column.getSearchability();
return convertSearchabilityTypeToMetadataConstant(searchType);
//return searchType.getValue();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDefaultValue(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDefaultValue(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getDefaultValue();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getMinValue(org.eclipse.emf.ecore.EObject)
*/
@Override
public Object getMinValue(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getMinimumValue();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getMaxValue(org.eclipse.emf.ecore.EObject)
*/
@Override
public Object getMaxValue(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getMaximumValue();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getFormat(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getFormat(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getFormat();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getLength(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getLength(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getLength();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getScale(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getScale(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getScale();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDistinctValues(org.eclipse.emf.ecore.EObject)
* @since 4.3
*/
@Override
public int getDistinctValues(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getDistinctValueCount();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getNullValues(org.eclipse.emf.ecore.EObject)
* @since 4.3
*/
@Override
public int getNullValues(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getNullValueCount();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetDatatype()
* @since 4.2
*/
@Override
public boolean canSetDatatype() {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#setDatatype(org.eclipse.emf.ecore.EObject, org.teiid.designer.metamodels.core.Datatype)
*/
@Override
public void setDatatype(EObject eObject, EObject datatype) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
column.setType(datatype);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatype(org.eclipse.emf.ecore.EObject)
*/
@Override
public EObject getDatatype(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
return column.getType();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getNativeType(org.eclipse.emf.ecore.EObject)
* @since 4.2
*/
@Override
public String getNativeType(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
return column.getNativeType();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatypeName(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDatatypeName(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
final EObject datatype = column.getType();
if (datatype == null) {
return CoreStringUtil.Constants.EMPTY_STRING;
}
final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(column,true);
final String dtName = dtMgr.getName(datatype);
return dtName == null ? CoreStringUtil.Constants.EMPTY_STRING : dtName;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getRuntimeType(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getRuntimeType(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
final EObject datatype = column.getType();
return datatype == null ?
CoreStringUtil.Constants.EMPTY_STRING :
ModelerCore.getDatatypeManager(eObject,true).getRuntimeTypeName(datatype);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getDatatypeObjectID(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDatatypeObjectID(EObject eObject) {
final EObject datatype = getDatatype(eObject);
final DatatypeManager dtMgr = ModelerCore.getDatatypeManager(eObject,true);
return dtMgr.getUuidString(datatype);
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getPrecision(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getPrecision(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getPrecision();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getPosition(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getPosition(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
ColumnSet columnSet = (ColumnSet) column.eContainer();
// correct from '0' to '1' based position
return columnSet.getColumns().indexOf(column)+1;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getCharOctetLength(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getCharOctetLength(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getLength();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#isRecordType(char)
*/
@Override
public boolean isRecordType(char recordType) {
return (recordType == IndexConstants.RECORD_TYPE.COLUMN);
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#getRadix(org.eclipse.emf.ecore.EObject)
*/
@Override
public int getRadix(EObject eObject) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
Column column = (Column) eObject;
return column.getRadix();
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetLength()
* @since 4.2
*/
@Override
public boolean canSetLength() {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#setLength(org.eclipse.emf.ecore.EObject, int)
*/
@Override
public void setLength(EObject eObject, int length) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
column.setLength(length);
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#canSetNullType()
* @since 4.2
*/
@Override
public boolean canSetNullType() {
return true;
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#setNullType(org.eclipse.emf.ecore.EObject, int)
*/
@Override
public void setNullType(EObject eObject, int nullType) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final Column column = (Column) eObject;
column.setNullable(convertMetadataConstantToNullableType(nullType));
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlAspect#updateObject(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)
*/
@Override
public void updateObject(EObject targetObject, EObject sourceObject) {
CoreArgCheck.isInstanceOf(Column.class, targetObject);
CoreArgCheck.isNotNull(sourceObject);
// look up the sqlAspect for the source
MetamodelAspect aspect = AspectManager.getSqlAspect(sourceObject);
CoreArgCheck.isInstanceOf(SqlColumnAspect.class, aspect);
final Column tgtColumn = (Column) targetObject;
final SqlColumnAspect srcColumnAspect = (SqlColumnAspect) aspect;
// set all the properties by looking up the sql aspect
tgtColumn.setAutoIncremented(srcColumnAspect.isAutoIncrementable(sourceObject));
tgtColumn.setCaseSensitive(srcColumnAspect.isCaseSensitive(sourceObject));
tgtColumn.setCurrency(srcColumnAspect.isCurrency(sourceObject));
tgtColumn.setFixedLength(srcColumnAspect.isFixedLength(sourceObject));
tgtColumn.setFormat(srcColumnAspect.getFormat(sourceObject));
tgtColumn.setLength(srcColumnAspect.getLength(sourceObject));
tgtColumn.setPrecision(srcColumnAspect.getPrecision(sourceObject));
tgtColumn.setUpdateable(srcColumnAspect.isUpdatable(sourceObject));
tgtColumn.setSigned(srcColumnAspect.isSigned(sourceObject));
tgtColumn.setSelectable(srcColumnAspect.isSelectable(sourceObject));
tgtColumn.setRadix(srcColumnAspect.getRadix(sourceObject));
tgtColumn.setPrecision(srcColumnAspect.getPrecision(sourceObject));
tgtColumn.setScale(srcColumnAspect.getScale(sourceObject));
tgtColumn.setType(srcColumnAspect.getDatatype(sourceObject));
tgtColumn.setMaximumValue(getString(srcColumnAspect.getMaxValue(sourceObject)));
tgtColumn.setMinimumValue(getString(srcColumnAspect.getMinValue(sourceObject)));
tgtColumn.setDefaultValue(getString(srcColumnAspect.getDefaultValue(sourceObject)));
// set the searchtype for the target
int searchType = srcColumnAspect.getSearchType(sourceObject);
tgtColumn.setSearchability(convertMetadataConstantToSearchabilityType(searchType));
// set the nulltype for the target
int nullType = srcColumnAspect.getNullType(sourceObject);
tgtColumn.setNullable(convertMetadataConstantToNullableType(nullType));
}
/**
* @see org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect#isDatatypeFeature(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
*/
@Override
public boolean isDatatypeFeature(final EObject eObject, final EStructuralFeature eFeature) {
CoreArgCheck.isInstanceOf(Column.class, eObject);
final EObjectImpl eObjectImpl = super.getEObjectImpl(eObject);
if (eObjectImpl != null) {
switch (eObjectImpl.eDerivedStructuralFeatureID(eFeature)) {
case RelationalPackage.COLUMN__TYPE:
return true;
}
}
return false;
}
// ==================================================================================
// P R I V A T E M E T H O D S
// ==================================================================================
private String getString(Object obj) {
if(obj != null) {
return obj.toString();
}
return null;
}
}