/**
 * 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 2.0  
 *  which accompanies this distribution, and is available at 
 *  https://www.eclipse.org/legal/epl-2.0/ 
 *  
 *  SPDX-License-Identifier: EPL-2.0 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Joerg Riegel - 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_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_AXIS: return createDatamartAxis();
			case DatamartDSLPackage.DATAMART_ATTRIBUTE_BASE: return createDatamartAttributeBase();
			case DatamartDSLPackage.DATAMART_REFERENCE_BASE: return createDatamartReferenceBase();
			case DatamartDSLPackage.DATAMART_ATTRIBUTE: return createDatamartAttribute();
			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_CUBE_AXIS: return createDatamartCubeAxis();
			case DatamartDSLPackage.DATAMART_DERIVED_MEASURE: return createDatamartDerivedMeasure();
			case DatamartDSLPackage.DATAMART_MEASURE: return createDatamartMeasure();
			case DatamartDSLPackage.DATAMART_HIERARCHY: return createDatamartHierarchy();
			case DatamartDSLPackage.DATAMART_HIERARCHY_LEVEL_SINGLE: return createDatamartHierarchyLevelSingle();
			case DatamartDSLPackage.DATAMART_HIERARCHY_LEVEL_MULTIPLE: return createDatamartHierarchyLevelMultiple();
			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();
			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 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 DatamartAxis createDatamartAxis() {
		DatamartAxisImpl datamartAxis = new DatamartAxisImpl();
		return datamartAxis;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAttributeBase createDatamartAttributeBase() {
		DatamartAttributeBaseImpl datamartAttributeBase = new DatamartAttributeBaseImpl();
		return datamartAttributeBase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartReferenceBase createDatamartReferenceBase() {
		DatamartReferenceBaseImpl datamartReferenceBase = new DatamartReferenceBaseImpl();
		return datamartReferenceBase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAttribute createDatamartAttribute() {
		DatamartAttributeImpl datamartAttribute = new DatamartAttributeImpl();
		return datamartAttribute;
	}

	/**
	 * <!-- 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 DatamartCubeAxis createDatamartCubeAxis() {
		DatamartCubeAxisImpl datamartCubeAxis = new DatamartCubeAxisImpl();
		return datamartCubeAxis;
	}

	/**
	 * <!-- 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 DatamartHierarchyLevelSingle createDatamartHierarchyLevelSingle() {
		DatamartHierarchyLevelSingleImpl datamartHierarchyLevelSingle = new DatamartHierarchyLevelSingleImpl();
		return datamartHierarchyLevelSingle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartHierarchyLevelMultiple createDatamartHierarchyLevelMultiple() {
		DatamartHierarchyLevelMultipleImpl datamartHierarchyLevelMultiple = new DatamartHierarchyLevelMultipleImpl();
		return datamartHierarchyLevelMultiple;
	}

	/**
	 * <!-- 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 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
