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

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 Role</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Role</em>'.
	 * @generated
	 */
	DatamartRole createDatamartRole();

	/**
	 * 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 Property</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Datamart Property</em>'.
	 * @generated
	 */
	DatamartProperty createDatamartProperty();

	/**
	 * 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 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 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 a new object of class '<em>Event Broker Data Mart</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Event Broker Data Mart</em>'.
	 * @generated
	 */
	EventBrokerDataMart createEventBrokerDataMart();

	/**
	 * Returns a new object of class '<em>Property Filler Data</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Data</em>'.
	 * @generated
	 */
	PropertyFillerData createPropertyFillerData();

	/**
	 * Returns a new object of class '<em>Property Filler Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Type</em>'.
	 * @generated
	 */
	PropertyFillerType createPropertyFillerType();

	/**
	 * Returns a new object of class '<em>Property Filler Date Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Type</em>'.
	 * @generated
	 */
	PropertyFillerDateType createPropertyFillerDateType();

	/**
	 * Returns a new object of class '<em>Property Filler Double Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Double Type</em>'.
	 * @generated
	 */
	PropertyFillerDoubleType createPropertyFillerDoubleType();

	/**
	 * Returns a new object of class '<em>Property Filler Integer Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Integer Type</em>'.
	 * @generated
	 */
	PropertyFillerIntegerType createPropertyFillerIntegerType();

	/**
	 * Returns a new object of class '<em>Property Filler Text Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Type</em>'.
	 * @generated
	 */
	PropertyFillerTextType createPropertyFillerTextType();

	/**
	 * Returns a new object of class '<em>Property Filler Date Future</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Future</em>'.
	 * @generated
	 */
	PropertyFillerDateFuture createPropertyFillerDateFuture();

	/**
	 * Returns a new object of class '<em>Property Filler Date Past</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Past</em>'.
	 * @generated
	 */
	PropertyFillerDatePast createPropertyFillerDatePast();

	/**
	 * Returns a new object of class '<em>Property Filler Date Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Date Range</em>'.
	 * @generated
	 */
	PropertyFillerDateRange createPropertyFillerDateRange();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Double Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Double Range</em>'.
	 * @generated
	 */
	PropertyFillerSignedDoubleRange createPropertyFillerSignedDoubleRange();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Double Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Double Random</em>'.
	 * @generated
	 */
	PropertyFillerSignedDoubleRandom createPropertyFillerSignedDoubleRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Integer Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Integer Range</em>'.
	 * @generated
	 */
	PropertyFillerSignedIntegerRange createPropertyFillerSignedIntegerRange();

	/**
	 * Returns a new object of class '<em>Property Filler Signed Integer Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Signed Integer Random</em>'.
	 * @generated
	 */
	PropertyFillerSignedIntegerRandom createPropertyFillerSignedIntegerRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Text Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Random</em>'.
	 * @generated
	 */
	PropertyFillerTextRandom createPropertyFillerTextRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Text Paragraphs</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Paragraphs</em>'.
	 * @generated
	 */
	PropertyFillerTextParagraphs createPropertyFillerTextParagraphs();

	/**
	 * Returns a new object of class '<em>Property Filler Text Sentences</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Sentences</em>'.
	 * @generated
	 */
	PropertyFillerTextSentences createPropertyFillerTextSentences();

	/**
	 * Returns a new object of class '<em>Property Filler Text Words</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Text Words</em>'.
	 * @generated
	 */
	PropertyFillerTextWords createPropertyFillerTextWords();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Double Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Double Range</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedDoubleRange createPropertyFillerUnsignedDoubleRange();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Double Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Double Random</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedDoubleRandom createPropertyFillerUnsignedDoubleRandom();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Integer Range</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Integer Range</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedIntegerRange createPropertyFillerUnsignedIntegerRange();

	/**
	 * Returns a new object of class '<em>Property Filler Unsigned Integer Random</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Filler Unsigned Integer Random</em>'.
	 * @generated
	 */
	PropertyFillerUnsignedIntegerRandom createPropertyFillerUnsignedIntegerRandom();

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

} //DatamartDSLFactory
