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

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage
 * @generated
 */
public interface DatamartDSLFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	DatamartDSLFactory eINSTANCE = org.eclipse.osbp.xtext.datamartdsl.impl.DatamartDSLFactoryImpl.init();

	/**
	 * Returns a new object of class '<em>Datamart Model</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Model</em>'.
	 * @generated
	 */
	DatamartModel createDatamartModel();

	/**
	 * Returns a new object of class '<em>Datamart Lazy Resolver</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Lazy Resolver</em>'.
	 * @generated
	 */
	DatamartLazyResolver createDatamartLazyResolver();

	/**
	 * Returns a new object of class '<em>Datamart Base</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Base</em>'.
	 * @generated
	 */
	DatamartBase createDatamartBase();

	/**
	 * Returns a new object of class '<em>Datamart Package</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Package</em>'.
	 * @generated
	 */
	DatamartPackage createDatamartPackage();

	/**
	 * Returns a new object of class '<em>Datamart Definition</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Definition</em>'.
	 * @generated
	 */
	DatamartDefinition createDatamartDefinition();

	/**
	 * Returns a new object of class '<em>Datamart Task</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Task</em>'.
	 * @generated
	 */
	DatamartTask createDatamartTask();

	/**
	 * Returns a new object of class '<em>Datamart Cube</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Cube</em>'.
	 * @generated
	 */
	DatamartCube createDatamartCube();

	/**
	 * Returns a new object of class '<em>Datamart Entity</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Entity</em>'.
	 * @generated
	 */
	DatamartEntity createDatamartEntity();

	/**
	 * Returns a new object of class '<em>Datamart Column</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Column</em>'.
	 * @generated
	 */
	DatamartColumn createDatamartColumn();

	/**
	 * Returns a new object of class '<em>Datamart Task Filter</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Task Filter</em>'.
	 * @generated
	 */
	DatamartTaskFilter createDatamartTaskFilter();

	/**
	 * Returns a new object of class '<em>Datamart Navigation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Navigation</em>'.
	 * @generated
	 */
	DatamartNavigation createDatamartNavigation();

	/**
	 * Returns a new object of class '<em>Datamart Owner</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Owner</em>'.
	 * @generated
	 */
	DatamartOwner createDatamartOwner();

	/**
	 * Returns a new object of class '<em>Datamart Member</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Member</em>'.
	 * @generated
	 */
	DatamartMember createDatamartMember();

	/**
	 * Returns a new object of class '<em>Datamart Axis</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Axis</em>'.
	 * @generated
	 */
	DatamartAxis createDatamartAxis();

	/**
	 * Returns a new object of class '<em>Datamart Attribute Base</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Attribute Base</em>'.
	 * @generated
	 */
	DatamartAttributeBase createDatamartAttributeBase();

	/**
	 * Returns a new object of class '<em>Datamart Reference Base</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Reference Base</em>'.
	 * @generated
	 */
	DatamartReferenceBase createDatamartReferenceBase();

	/**
	 * Returns a new object of class '<em>Datamart Attribute</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Attribute</em>'.
	 * @generated
	 */
	DatamartAttribute createDatamartAttribute();

	/**
	 * Returns a new object of class '<em>Expression</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Expression</em>'.
	 * @generated
	 */
	Expression createExpression();

	/**
	 * Returns a new object of class '<em>Datamart Condition</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Condition</em>'.
	 * @generated
	 */
	DatamartCondition createDatamartCondition();

	/**
	 * Returns a new object of class '<em>Datamart Order</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Order</em>'.
	 * @generated
	 */
	DatamartOrder createDatamartOrder();

	/**
	 * Returns a new object of class '<em>Datamart Define Derived Measure</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Define Derived Measure</em>'.
	 * @generated
	 */
	DatamartDefineDerivedMeasure createDatamartDefineDerivedMeasure();

	/**
	 * Returns a new object of class '<em>Datamart Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Function</em>'.
	 * @generated
	 */
	DatamartFunction createDatamartFunction();

	/**
	 * Returns a new object of class '<em>Datamart Parameter Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Parameter Function</em>'.
	 * @generated
	 */
	DatamartParameterFunction createDatamartParameterFunction();

	/**
	 * Returns a new object of class '<em>Datamart Function Int Parameter</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Function Int Parameter</em>'.
	 * @generated
	 */
	DatamartFunctionIntParameter createDatamartFunctionIntParameter();

	/**
	 * Returns a new object of class '<em>Datamart Set Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Set Function</em>'.
	 * @generated
	 */
	DatamartSetFunction createDatamartSetFunction();

	/**
	 * Returns a new object of class '<em>Datamart Set Parameter Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Set Parameter Function</em>'.
	 * @generated
	 */
	DatamartSetParameterFunction createDatamartSetParameterFunction();

	/**
	 * Returns a new object of class '<em>Datamart Set Aggregation Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Set Aggregation Function</em>'.
	 * @generated
	 */
	DatamartSetAggregationFunction createDatamartSetAggregationFunction();

	/**
	 * Returns a new object of class '<em>Datamart Aggregation Expression</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Aggregation Expression</em>'.
	 * @generated
	 */
	DatamartAggregationExpression createDatamartAggregationExpression();

	/**
	 * Returns a new object of class '<em>Datamart Set Tuple</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Set Tuple</em>'.
	 * @generated
	 */
	DatamartSetTuple createDatamartSetTuple();

	/**
	 * Returns a new object of class '<em>Datamart Set Aggregation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Set Aggregation</em>'.
	 * @generated
	 */
	DatamartSetAggregation createDatamartSetAggregation();

	/**
	 * Returns a new object of class '<em>Datamart Aggregation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Aggregation</em>'.
	 * @generated
	 */
	DatamartAggregation createDatamartAggregation();

	/**
	 * Returns a new object of class '<em>Datamart Member Tuple</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Member Tuple</em>'.
	 * @generated
	 */
	DatamartMemberTuple createDatamartMemberTuple();

	/**
	 * Returns a new object of class '<em>Datamart Aggregation Function</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Aggregation Function</em>'.
	 * @generated
	 */
	DatamartAggregationFunction createDatamartAggregationFunction();

	/**
	 * Returns a new object of class '<em>Datamart Slicer</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Slicer</em>'.
	 * @generated
	 */
	DatamartSlicer createDatamartSlicer();

	/**
	 * Returns a new object of class '<em>Datamart Cube Axis</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Cube Axis</em>'.
	 * @generated
	 */
	DatamartCubeAxis createDatamartCubeAxis();

	/**
	 * Returns a new object of class '<em>Datamart Derived Measure</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Derived Measure</em>'.
	 * @generated
	 */
	DatamartDerivedMeasure createDatamartDerivedMeasure();

	/**
	 * Returns a new object of class '<em>Datamart Measure</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Measure</em>'.
	 * @generated
	 */
	DatamartMeasure createDatamartMeasure();

	/**
	 * Returns a new object of class '<em>Datamart Hierarchy</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Hierarchy</em>'.
	 * @generated
	 */
	DatamartHierarchy createDatamartHierarchy();

	/**
	 * Returns a new object of class '<em>Calculation</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Calculation</em>'.
	 * @generated
	 */
	Calculation createCalculation();

	/**
	 * Returns a new object of class '<em>Datamart Reference</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Reference</em>'.
	 * @generated
	 */
	DatamartReference createDatamartReference();

	/**
	 * Returns a new object of class '<em>Addition</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Addition</em>'.
	 * @generated
	 */
	Addition createAddition();

	/**
	 * Returns a new object of class '<em>Division</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Division</em>'.
	 * @generated
	 */
	Division createDivision();

	/**
	 * Returns a new object of class '<em>Multiplication</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Multiplication</em>'.
	 * @generated
	 */
	Multiplication createMultiplication();

	/**
	 * Returns a new object of class '<em>Subtraction</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Subtraction</em>'.
	 * @generated
	 */
	Subtraction createSubtraction();

	/**
	 * Returns a new object of class '<em>Conjunction</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Conjunction</em>'.
	 * @generated
	 */
	Conjunction createConjunction();

	/**
	 * Returns a new object of class '<em>Disjunction</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Disjunction</em>'.
	 * @generated
	 */
	Disjunction createDisjunction();

	/**
	 * Returns a new object of class '<em>Conditional Expression</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Conditional Expression</em>'.
	 * @generated
	 */
	ConditionalExpression createConditionalExpression();

	/**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	DatamartDSLPackage getDatamartDSLPackage();

} //DatamartDSLFactory
