package com.justeat.mickeydb; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import com.justeat.mickeydb.mickeyLang.AlterTableAddColumnStatement; import com.justeat.mickeydb.mickeyLang.ColumnDef; import com.justeat.mickeydb.mickeyLang.ColumnSourceRef; import com.justeat.mickeydb.mickeyLang.CreateTableStatement; import com.justeat.mickeydb.mickeyLang.CreateTriggerStatement; import com.justeat.mickeydb.mickeyLang.CreateViewStatement; import com.justeat.mickeydb.mickeyLang.MickeyBlock; import com.justeat.mickeydb.mickeyLang.MickeyFunction; import com.justeat.mickeydb.mickeyLang.MickeyLangPackage; import com.justeat.mickeydb.mickeyLang.MigrationBlock; import com.justeat.mickeydb.mickeyLang.MickeyFile; import com.justeat.mickeydb.mickeyLang.ResultColumn; import com.justeat.mickeydb.mickeyLang.TableDefinition; public class MickeyNameProvider extends DefaultDeclarativeQualifiedNameProvider { protected QualifiedName qualifiedName(MickeyFile ele){ return QualifiedName.create( ele.getDatabaseName()); } // protected QualifiedName qualifiedName(MickeyBlock ele){ // Model model = getModel(ele); // return QualifiedName.create( // model.getDatabaseName()); // } protected QualifiedName qualifiedName(MigrationBlock ele){ MickeyFile model = getModel(ele); return QualifiedName.create( model.getDatabaseName(), ele.getName()); } protected QualifiedName qualifiedName(ColumnDef def) { MickeyFile model = getModel(def); if(def.eContainer() instanceof AlterTableAddColumnStatement) { List<INode> nodes = NodeModelUtils.findNodesForFeature(def.eContainer(), MickeyLangPackage.Literals.ALTER_TABLE_ADD_COLUMN_STATEMENT__TABLE); String tableName = NodeModelUtils.getTokenText(nodes.get(0)); return QualifiedName.create( model.getDatabaseName(), tableName, def.getName()); } else { CreateTableStatement s = (CreateTableStatement) def.eContainer(); return QualifiedName.create( model.getDatabaseName(), s.getName(), def.getName()); } } protected QualifiedName qualifiedName(TableDefinition ele){ MickeyFile model = getModel(ele); return QualifiedName.create( model.getDatabaseName(), ele.getName()); } protected QualifiedName qualifiedName(MickeyFunction ele){ MickeyFile model = getModel(ele); return QualifiedName.create( model.getDatabaseName(), ele.getName()); } protected QualifiedName qualifiedName(AlterTableAddColumnStatement ele){ MickeyFile model = getModel(ele); return QualifiedName.create( model.getDatabaseName()); } protected QualifiedName qualifiedName(CreateTriggerStatement ele){ MickeyFile model = getModel(ele); return QualifiedName.create( model.getDatabaseName(), ele.getName()); } protected QualifiedName qualifiedName(ResultColumn e) { MickeyFile model = getContainerOfType(e, MickeyFile.class); CreateViewStatement s = getContainerOfType(e, CreateViewStatement.class); if(s != null) { return QualifiedName.create( model.getDatabaseName(), s.getName(), e.getName()); } return null; } private MickeyFile getModel(EObject ele) { do { ele = ele.eContainer(); } while (!(ele instanceof MickeyFile)); return (MickeyFile) ele; } private <T> T getContainerOfType(EObject ele, Class<T> type) { do { ele = ele.eContainer(); if(ele == null) { break; } } while (!type.isAssignableFrom(ele.getClass())); return (T) ele; } }