/**
 *                                                                            
 * 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                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
 package org.eclipse.osbp.infogrid.model.gridsource;

import org.eclipse.emf.ecore.EObject;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>EQ Filter</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceEQFilter#getInputTypePropertyPath <em>Input Type Property Path</em>}</li>
 *   <li>{@link org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceEQFilter#getRootTypePropertyPath <em>Root Type Property Path</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage#getCxGridSourceEQFilter()
 * @model
 * @generated
 */
public interface CxGridSourceEQFilter extends EObject {
	/**
	 * Returns the value of the '<em><b>Input Type Property Path</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Input Type Property Path</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Input Type Property Path</em>' containment reference.
	 * @see #setInputTypePropertyPath(CxGridNestedField)
	 * @see org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage#getCxGridSourceEQFilter_InputTypePropertyPath()
	 * @model containment="true"
	 * @generated
	 */
	CxGridNestedField getInputTypePropertyPath();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceEQFilter#getInputTypePropertyPath <em>Input Type Property Path</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Input Type Property Path</em>' containment reference.
	 * @see #getInputTypePropertyPath()
	 * @generated
	 */
	void setInputTypePropertyPath(CxGridNestedField value);

	/**
	 * Returns the value of the '<em><b>Root Type Property Path</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Root Type Property Path</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Root Type Property Path</em>' containment reference.
	 * @see #setRootTypePropertyPath(CxGridNestedField)
	 * @see org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage#getCxGridSourceEQFilter_RootTypePropertyPath()
	 * @model containment="true"
	 * @generated
	 */
	CxGridNestedField getRootTypePropertyPath();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceEQFilter#getRootTypePropertyPath <em>Root Type Property Path</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Root Type Property Path</em>' containment reference.
	 * @see #getRootTypePropertyPath()
	 * @generated
	 */
	void setRootTypePropertyPath(CxGridNestedField value);

} // CxGridSourceEQFilter
