/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  All rights reserved. This program and the accompanying materials 
 *  are made available under the terms of the Eclipse Public License v1.0 
 *  which accompanies this distribution, and is available at 
 *  http://www.eclipse.org/legal/epl-v10.html 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.datamartdsl.impl;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.EFactoryImpl;

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.osbp.xtext.datamartdsl.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class DatamartDSLFactoryImpl extends EFactoryImpl implements DatamartDSLFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static DatamartDSLFactory init() {
		try {
			DatamartDSLFactory theDatamartDSLFactory = (DatamartDSLFactory)EPackage.Registry.INSTANCE.getEFactory(DatamartDSLPackage.eNS_URI);
			if (theDatamartDSLFactory != null) {
				return theDatamartDSLFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new DatamartDSLFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartDSLFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case DatamartDSLPackage.DATAMART_MODEL: return createDatamartModel();
			case DatamartDSLPackage.DATAMART_LAZY_RESOLVER: return createDatamartLazyResolver();
			case DatamartDSLPackage.DATAMART_BASE: return createDatamartBase();
			case DatamartDSLPackage.DATAMART_PACKAGE: return createDatamartPackage();
			case DatamartDSLPackage.DATAMART_DEFINITION: return createDatamartDefinition();
			case DatamartDSLPackage.DATAMART_ROLE: return createDatamartRole();
			case DatamartDSLPackage.DATAMART_TASK: return createDatamartTask();
			case DatamartDSLPackage.DATAMART_CUBE: return createDatamartCube();
			case DatamartDSLPackage.DATAMART_ENTITY: return createDatamartEntity();
			case DatamartDSLPackage.DATAMART_COLUMN: return createDatamartColumn();
			case DatamartDSLPackage.DATAMART_TASK_FILTER: return createDatamartTaskFilter();
			case DatamartDSLPackage.DATAMART_NAVIGATION: return createDatamartNavigation();
			case DatamartDSLPackage.DATAMART_OWNER: return createDatamartOwner();
			case DatamartDSLPackage.DATAMART_MEMBER: return createDatamartMember();
			case DatamartDSLPackage.DATAMART_PROPERTY: return createDatamartProperty();
			case DatamartDSLPackage.EXPRESSION: return createExpression();
			case DatamartDSLPackage.DATAMART_CONDITION: return createDatamartCondition();
			case DatamartDSLPackage.DATAMART_ORDER: return createDatamartOrder();
			case DatamartDSLPackage.DATAMART_DEFINE_DERIVED_MEASURE: return createDatamartDefineDerivedMeasure();
			case DatamartDSLPackage.DATAMART_FUNCTION: return createDatamartFunction();
			case DatamartDSLPackage.DATAMART_PARAMETER_FUNCTION: return createDatamartParameterFunction();
			case DatamartDSLPackage.DATAMART_FUNCTION_INT_PARAMETER: return createDatamartFunctionIntParameter();
			case DatamartDSLPackage.DATAMART_SET_FUNCTION: return createDatamartSetFunction();
			case DatamartDSLPackage.DATAMART_SET_PARAMETER_FUNCTION: return createDatamartSetParameterFunction();
			case DatamartDSLPackage.DATAMART_SET_AGGREGATION_FUNCTION: return createDatamartSetAggregationFunction();
			case DatamartDSLPackage.DATAMART_AGGREGATION_EXPRESSION: return createDatamartAggregationExpression();
			case DatamartDSLPackage.DATAMART_SET_TUPLE: return createDatamartSetTuple();
			case DatamartDSLPackage.DATAMART_SET_AGGREGATION: return createDatamartSetAggregation();
			case DatamartDSLPackage.DATAMART_AGGREGATION: return createDatamartAggregation();
			case DatamartDSLPackage.DATAMART_MEMBER_TUPLE: return createDatamartMemberTuple();
			case DatamartDSLPackage.DATAMART_AGGREGATION_FUNCTION: return createDatamartAggregationFunction();
			case DatamartDSLPackage.DATAMART_SLICER: return createDatamartSlicer();
			case DatamartDSLPackage.DATAMART_AXIS: return createDatamartAxis();
			case DatamartDSLPackage.DATAMART_DERIVED_MEASURE: return createDatamartDerivedMeasure();
			case DatamartDSLPackage.DATAMART_MEASURE: return createDatamartMeasure();
			case DatamartDSLPackage.DATAMART_HIERARCHY: return createDatamartHierarchy();
			case DatamartDSLPackage.CALCULATION: return createCalculation();
			case DatamartDSLPackage.DATAMART_REFERENCE: return createDatamartReference();
			case DatamartDSLPackage.ADDITION: return createAddition();
			case DatamartDSLPackage.DIVISION: return createDivision();
			case DatamartDSLPackage.MULTIPLICATION: return createMultiplication();
			case DatamartDSLPackage.SUBTRACTION: return createSubtraction();
			case DatamartDSLPackage.CONJUNCTION: return createConjunction();
			case DatamartDSLPackage.DISJUNCTION: return createDisjunction();
			case DatamartDSLPackage.CONDITIONAL_EXPRESSION: return createConditionalExpression();
			case DatamartDSLPackage.EVENT_BROKER_DATA_MART: return createEventBrokerDataMart();
			case DatamartDSLPackage.PROPERTY_FILLER_DATA: return createPropertyFillerData();
			case DatamartDSLPackage.PROPERTY_FILLER_TYPE: return createPropertyFillerType();
			case DatamartDSLPackage.PROPERTY_FILLER_DATE_TYPE: return createPropertyFillerDateType();
			case DatamartDSLPackage.PROPERTY_FILLER_DOUBLE_TYPE: return createPropertyFillerDoubleType();
			case DatamartDSLPackage.PROPERTY_FILLER_INTEGER_TYPE: return createPropertyFillerIntegerType();
			case DatamartDSLPackage.PROPERTY_FILLER_TEXT_TYPE: return createPropertyFillerTextType();
			case DatamartDSLPackage.PROPERTY_FILLER_DATE_FUTURE: return createPropertyFillerDateFuture();
			case DatamartDSLPackage.PROPERTY_FILLER_DATE_PAST: return createPropertyFillerDatePast();
			case DatamartDSLPackage.PROPERTY_FILLER_DATE_RANGE: return createPropertyFillerDateRange();
			case DatamartDSLPackage.PROPERTY_FILLER_SIGNED_DOUBLE_RANGE: return createPropertyFillerSignedDoubleRange();
			case DatamartDSLPackage.PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM: return createPropertyFillerSignedDoubleRandom();
			case DatamartDSLPackage.PROPERTY_FILLER_SIGNED_INTEGER_RANGE: return createPropertyFillerSignedIntegerRange();
			case DatamartDSLPackage.PROPERTY_FILLER_SIGNED_INTEGER_RANDOM: return createPropertyFillerSignedIntegerRandom();
			case DatamartDSLPackage.PROPERTY_FILLER_TEXT_RANDOM: return createPropertyFillerTextRandom();
			case DatamartDSLPackage.PROPERTY_FILLER_TEXT_PARAGRAPHS: return createPropertyFillerTextParagraphs();
			case DatamartDSLPackage.PROPERTY_FILLER_TEXT_SENTENCES: return createPropertyFillerTextSentences();
			case DatamartDSLPackage.PROPERTY_FILLER_TEXT_WORDS: return createPropertyFillerTextWords();
			case DatamartDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE: return createPropertyFillerUnsignedDoubleRange();
			case DatamartDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM: return createPropertyFillerUnsignedDoubleRandom();
			case DatamartDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE: return createPropertyFillerUnsignedIntegerRange();
			case DatamartDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM: return createPropertyFillerUnsignedIntegerRandom();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case DatamartDSLPackage.AXIS_ENUM:
				return createAxisEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.FUNCTION_ENUM:
				return createFunctionEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.PARAMETER_FUNCTION_ENUM:
				return createParameterFunctionEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.SET_FUNCTION_ENUM:
				return createSetFunctionEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.SET_PARAMETER_FUNCTION_ENUM:
				return createSetParameterFunctionEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.SET_AGGREGATION_ENUM:
				return createSetAggregationEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.AGGREGATION_ENUM:
				return createAggregationEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.OPERATOR_ENUM:
				return createOperatorEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.SQL_AGGREGATION_ENUM:
				return createSqlAggregationEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.VALUE_SCALE_ENUM:
				return createValueScaleEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.TASK_QUERY_TOPIC_ENUM:
				return createTaskQueryTopicEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.TASK_QUERY_COLUMN_ENUM:
				return createTaskQueryColumnEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.TASK_FILTER_ENUM:
				return createTaskFilterEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.ORDER_ENUM:
				return createOrderEnumFromString(eDataType, initialValue);
			case DatamartDSLPackage.INTERNAL_EOBJECT:
				return createInternalEObjectFromString(eDataType, initialValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case DatamartDSLPackage.AXIS_ENUM:
				return convertAxisEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.FUNCTION_ENUM:
				return convertFunctionEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.PARAMETER_FUNCTION_ENUM:
				return convertParameterFunctionEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.SET_FUNCTION_ENUM:
				return convertSetFunctionEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.SET_PARAMETER_FUNCTION_ENUM:
				return convertSetParameterFunctionEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.SET_AGGREGATION_ENUM:
				return convertSetAggregationEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.AGGREGATION_ENUM:
				return convertAggregationEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.OPERATOR_ENUM:
				return convertOperatorEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.SQL_AGGREGATION_ENUM:
				return convertSqlAggregationEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.VALUE_SCALE_ENUM:
				return convertValueScaleEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.TASK_QUERY_TOPIC_ENUM:
				return convertTaskQueryTopicEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.TASK_QUERY_COLUMN_ENUM:
				return convertTaskQueryColumnEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.TASK_FILTER_ENUM:
				return convertTaskFilterEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.ORDER_ENUM:
				return convertOrderEnumToString(eDataType, instanceValue);
			case DatamartDSLPackage.INTERNAL_EOBJECT:
				return convertInternalEObjectToString(eDataType, instanceValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartModel createDatamartModel() {
		DatamartModelImpl datamartModel = new DatamartModelImpl();
		return datamartModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartLazyResolver createDatamartLazyResolver() {
		DatamartLazyResolverImpl datamartLazyResolver = new DatamartLazyResolverImpl();
		return datamartLazyResolver;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartBase createDatamartBase() {
		DatamartBaseImpl datamartBase = new DatamartBaseImpl();
		return datamartBase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartPackage createDatamartPackage() {
		DatamartPackageImpl datamartPackage = new DatamartPackageImpl();
		return datamartPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartDefinition createDatamartDefinition() {
		DatamartDefinitionImpl datamartDefinition = new DatamartDefinitionImpl();
		return datamartDefinition;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartRole createDatamartRole() {
		DatamartRoleImpl datamartRole = new DatamartRoleImpl();
		return datamartRole;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTask createDatamartTask() {
		DatamartTaskImpl datamartTask = new DatamartTaskImpl();
		return datamartTask;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartCube createDatamartCube() {
		DatamartCubeImpl datamartCube = new DatamartCubeImpl();
		return datamartCube;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartEntity createDatamartEntity() {
		DatamartEntityImpl datamartEntity = new DatamartEntityImpl();
		return datamartEntity;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartColumn createDatamartColumn() {
		DatamartColumnImpl datamartColumn = new DatamartColumnImpl();
		return datamartColumn;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTaskFilter createDatamartTaskFilter() {
		DatamartTaskFilterImpl datamartTaskFilter = new DatamartTaskFilterImpl();
		return datamartTaskFilter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartNavigation createDatamartNavigation() {
		DatamartNavigationImpl datamartNavigation = new DatamartNavigationImpl();
		return datamartNavigation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartOwner createDatamartOwner() {
		DatamartOwnerImpl datamartOwner = new DatamartOwnerImpl();
		return datamartOwner;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartMember createDatamartMember() {
		DatamartMemberImpl datamartMember = new DatamartMemberImpl();
		return datamartMember;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartProperty createDatamartProperty() {
		DatamartPropertyImpl datamartProperty = new DatamartPropertyImpl();
		return datamartProperty;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Expression createExpression() {
		ExpressionImpl expression = new ExpressionImpl();
		return expression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartCondition createDatamartCondition() {
		DatamartConditionImpl datamartCondition = new DatamartConditionImpl();
		return datamartCondition;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartOrder createDatamartOrder() {
		DatamartOrderImpl datamartOrder = new DatamartOrderImpl();
		return datamartOrder;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartDefineDerivedMeasure createDatamartDefineDerivedMeasure() {
		DatamartDefineDerivedMeasureImpl datamartDefineDerivedMeasure = new DatamartDefineDerivedMeasureImpl();
		return datamartDefineDerivedMeasure;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartFunction createDatamartFunction() {
		DatamartFunctionImpl datamartFunction = new DatamartFunctionImpl();
		return datamartFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartParameterFunction createDatamartParameterFunction() {
		DatamartParameterFunctionImpl datamartParameterFunction = new DatamartParameterFunctionImpl();
		return datamartParameterFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartFunctionIntParameter createDatamartFunctionIntParameter() {
		DatamartFunctionIntParameterImpl datamartFunctionIntParameter = new DatamartFunctionIntParameterImpl();
		return datamartFunctionIntParameter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartSetFunction createDatamartSetFunction() {
		DatamartSetFunctionImpl datamartSetFunction = new DatamartSetFunctionImpl();
		return datamartSetFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartSetParameterFunction createDatamartSetParameterFunction() {
		DatamartSetParameterFunctionImpl datamartSetParameterFunction = new DatamartSetParameterFunctionImpl();
		return datamartSetParameterFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartSetAggregationFunction createDatamartSetAggregationFunction() {
		DatamartSetAggregationFunctionImpl datamartSetAggregationFunction = new DatamartSetAggregationFunctionImpl();
		return datamartSetAggregationFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAggregationExpression createDatamartAggregationExpression() {
		DatamartAggregationExpressionImpl datamartAggregationExpression = new DatamartAggregationExpressionImpl();
		return datamartAggregationExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartSetTuple createDatamartSetTuple() {
		DatamartSetTupleImpl datamartSetTuple = new DatamartSetTupleImpl();
		return datamartSetTuple;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartSetAggregation createDatamartSetAggregation() {
		DatamartSetAggregationImpl datamartSetAggregation = new DatamartSetAggregationImpl();
		return datamartSetAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAggregation createDatamartAggregation() {
		DatamartAggregationImpl datamartAggregation = new DatamartAggregationImpl();
		return datamartAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartMemberTuple createDatamartMemberTuple() {
		DatamartMemberTupleImpl datamartMemberTuple = new DatamartMemberTupleImpl();
		return datamartMemberTuple;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAggregationFunction createDatamartAggregationFunction() {
		DatamartAggregationFunctionImpl datamartAggregationFunction = new DatamartAggregationFunctionImpl();
		return datamartAggregationFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartSlicer createDatamartSlicer() {
		DatamartSlicerImpl datamartSlicer = new DatamartSlicerImpl();
		return datamartSlicer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAxis createDatamartAxis() {
		DatamartAxisImpl datamartAxis = new DatamartAxisImpl();
		return datamartAxis;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartDerivedMeasure createDatamartDerivedMeasure() {
		DatamartDerivedMeasureImpl datamartDerivedMeasure = new DatamartDerivedMeasureImpl();
		return datamartDerivedMeasure;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartMeasure createDatamartMeasure() {
		DatamartMeasureImpl datamartMeasure = new DatamartMeasureImpl();
		return datamartMeasure;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartHierarchy createDatamartHierarchy() {
		DatamartHierarchyImpl datamartHierarchy = new DatamartHierarchyImpl();
		return datamartHierarchy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Calculation createCalculation() {
		CalculationImpl calculation = new CalculationImpl();
		return calculation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartReference createDatamartReference() {
		DatamartReferenceImpl datamartReference = new DatamartReferenceImpl();
		return datamartReference;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Addition createAddition() {
		AdditionImpl addition = new AdditionImpl();
		return addition;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Division createDivision() {
		DivisionImpl division = new DivisionImpl();
		return division;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Multiplication createMultiplication() {
		MultiplicationImpl multiplication = new MultiplicationImpl();
		return multiplication;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Subtraction createSubtraction() {
		SubtractionImpl subtraction = new SubtractionImpl();
		return subtraction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Conjunction createConjunction() {
		ConjunctionImpl conjunction = new ConjunctionImpl();
		return conjunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Disjunction createDisjunction() {
		DisjunctionImpl disjunction = new DisjunctionImpl();
		return disjunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ConditionalExpression createConditionalExpression() {
		ConditionalExpressionImpl conditionalExpression = new ConditionalExpressionImpl();
		return conditionalExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EventBrokerDataMart createEventBrokerDataMart() {
		EventBrokerDataMartImpl eventBrokerDataMart = new EventBrokerDataMartImpl();
		return eventBrokerDataMart;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerData createPropertyFillerData() {
		PropertyFillerDataImpl propertyFillerData = new PropertyFillerDataImpl();
		return propertyFillerData;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerType createPropertyFillerType() {
		PropertyFillerTypeImpl propertyFillerType = new PropertyFillerTypeImpl();
		return propertyFillerType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDateType createPropertyFillerDateType() {
		PropertyFillerDateTypeImpl propertyFillerDateType = new PropertyFillerDateTypeImpl();
		return propertyFillerDateType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDoubleType createPropertyFillerDoubleType() {
		PropertyFillerDoubleTypeImpl propertyFillerDoubleType = new PropertyFillerDoubleTypeImpl();
		return propertyFillerDoubleType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerIntegerType createPropertyFillerIntegerType() {
		PropertyFillerIntegerTypeImpl propertyFillerIntegerType = new PropertyFillerIntegerTypeImpl();
		return propertyFillerIntegerType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextType createPropertyFillerTextType() {
		PropertyFillerTextTypeImpl propertyFillerTextType = new PropertyFillerTextTypeImpl();
		return propertyFillerTextType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDateFuture createPropertyFillerDateFuture() {
		PropertyFillerDateFutureImpl propertyFillerDateFuture = new PropertyFillerDateFutureImpl();
		return propertyFillerDateFuture;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDatePast createPropertyFillerDatePast() {
		PropertyFillerDatePastImpl propertyFillerDatePast = new PropertyFillerDatePastImpl();
		return propertyFillerDatePast;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDateRange createPropertyFillerDateRange() {
		PropertyFillerDateRangeImpl propertyFillerDateRange = new PropertyFillerDateRangeImpl();
		return propertyFillerDateRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedDoubleRange createPropertyFillerSignedDoubleRange() {
		PropertyFillerSignedDoubleRangeImpl propertyFillerSignedDoubleRange = new PropertyFillerSignedDoubleRangeImpl();
		return propertyFillerSignedDoubleRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedDoubleRandom createPropertyFillerSignedDoubleRandom() {
		PropertyFillerSignedDoubleRandomImpl propertyFillerSignedDoubleRandom = new PropertyFillerSignedDoubleRandomImpl();
		return propertyFillerSignedDoubleRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedIntegerRange createPropertyFillerSignedIntegerRange() {
		PropertyFillerSignedIntegerRangeImpl propertyFillerSignedIntegerRange = new PropertyFillerSignedIntegerRangeImpl();
		return propertyFillerSignedIntegerRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedIntegerRandom createPropertyFillerSignedIntegerRandom() {
		PropertyFillerSignedIntegerRandomImpl propertyFillerSignedIntegerRandom = new PropertyFillerSignedIntegerRandomImpl();
		return propertyFillerSignedIntegerRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextRandom createPropertyFillerTextRandom() {
		PropertyFillerTextRandomImpl propertyFillerTextRandom = new PropertyFillerTextRandomImpl();
		return propertyFillerTextRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextParagraphs createPropertyFillerTextParagraphs() {
		PropertyFillerTextParagraphsImpl propertyFillerTextParagraphs = new PropertyFillerTextParagraphsImpl();
		return propertyFillerTextParagraphs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextSentences createPropertyFillerTextSentences() {
		PropertyFillerTextSentencesImpl propertyFillerTextSentences = new PropertyFillerTextSentencesImpl();
		return propertyFillerTextSentences;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextWords createPropertyFillerTextWords() {
		PropertyFillerTextWordsImpl propertyFillerTextWords = new PropertyFillerTextWordsImpl();
		return propertyFillerTextWords;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedDoubleRange createPropertyFillerUnsignedDoubleRange() {
		PropertyFillerUnsignedDoubleRangeImpl propertyFillerUnsignedDoubleRange = new PropertyFillerUnsignedDoubleRangeImpl();
		return propertyFillerUnsignedDoubleRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedDoubleRandom createPropertyFillerUnsignedDoubleRandom() {
		PropertyFillerUnsignedDoubleRandomImpl propertyFillerUnsignedDoubleRandom = new PropertyFillerUnsignedDoubleRandomImpl();
		return propertyFillerUnsignedDoubleRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedIntegerRange createPropertyFillerUnsignedIntegerRange() {
		PropertyFillerUnsignedIntegerRangeImpl propertyFillerUnsignedIntegerRange = new PropertyFillerUnsignedIntegerRangeImpl();
		return propertyFillerUnsignedIntegerRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedIntegerRandom createPropertyFillerUnsignedIntegerRandom() {
		PropertyFillerUnsignedIntegerRandomImpl propertyFillerUnsignedIntegerRandom = new PropertyFillerUnsignedIntegerRandomImpl();
		return propertyFillerUnsignedIntegerRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AxisEnum createAxisEnumFromString(EDataType eDataType, String initialValue) {
		AxisEnum result = AxisEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertAxisEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionEnum createFunctionEnumFromString(EDataType eDataType, String initialValue) {
		FunctionEnum result = FunctionEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertFunctionEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ParameterFunctionEnum createParameterFunctionEnumFromString(EDataType eDataType, String initialValue) {
		ParameterFunctionEnum result = ParameterFunctionEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertParameterFunctionEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SetFunctionEnum createSetFunctionEnumFromString(EDataType eDataType, String initialValue) {
		SetFunctionEnum result = SetFunctionEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSetFunctionEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SetParameterFunctionEnum createSetParameterFunctionEnumFromString(EDataType eDataType, String initialValue) {
		SetParameterFunctionEnum result = SetParameterFunctionEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSetParameterFunctionEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SetAggregationEnum createSetAggregationEnumFromString(EDataType eDataType, String initialValue) {
		SetAggregationEnum result = SetAggregationEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSetAggregationEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AggregationEnum createAggregationEnumFromString(EDataType eDataType, String initialValue) {
		AggregationEnum result = AggregationEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertAggregationEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OperatorEnum createOperatorEnumFromString(EDataType eDataType, String initialValue) {
		OperatorEnum result = OperatorEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertOperatorEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SqlAggregationEnum createSqlAggregationEnumFromString(EDataType eDataType, String initialValue) {
		SqlAggregationEnum result = SqlAggregationEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertSqlAggregationEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ValueScaleEnum createValueScaleEnumFromString(EDataType eDataType, String initialValue) {
		ValueScaleEnum result = ValueScaleEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertValueScaleEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TaskQueryTopicEnum createTaskQueryTopicEnumFromString(EDataType eDataType, String initialValue) {
		TaskQueryTopicEnum result = TaskQueryTopicEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTaskQueryTopicEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TaskQueryColumnEnum createTaskQueryColumnEnumFromString(EDataType eDataType, String initialValue) {
		TaskQueryColumnEnum result = TaskQueryColumnEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTaskQueryColumnEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TaskFilterEnum createTaskFilterEnumFromString(EDataType eDataType, String initialValue) {
		TaskFilterEnum result = TaskFilterEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTaskFilterEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrderEnum createOrderEnumFromString(EDataType eDataType, String initialValue) {
		OrderEnum result = OrderEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertOrderEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InternalEObject createInternalEObjectFromString(EDataType eDataType, String initialValue) {
		return (InternalEObject)super.createFromString(eDataType, initialValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertInternalEObjectToString(EDataType eDataType, Object instanceValue) {
		return super.convertToString(eDataType, instanceValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartDSLPackage getDatamartDSLPackage() {
		return (DatamartDSLPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static DatamartDSLPackage getPackage() {
		return DatamartDSLPackage.eINSTANCE;
	}

} //DatamartDSLFactoryImpl
