/*
 *                                                                            
 *  Copyright (c) 2011 - 2017 - 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                                 
 *                                                                            
 *  Initial contribution:                                                      
 *     Loetz GmbH & Co. KG                              
 * 
 */
package org.eclipse.osbp.runtime.common.filter;

import java.util.List;

import org.eclipse.osbp.runtime.common.filter.IService;

/**
 * The Interface IDatamartService.
 *
 * @param <T> the generic beantype of a datamart
 */
public interface IDatamartService<T> extends IService {
	List<T> getResults(String datamartFQN);

	int size(IQuery createQuery);

	boolean contains(T bean, IQuery createQuery);

	T getNext(T bean, IQuery createQuery);

	T getPrevious(T bean, IQuery createQuery);

	T getFirst(IQuery createQuery);

	T getLast(IQuery createQuery);

	boolean isFirst(T bean, IQuery createQuery);

	boolean isLast(T bean, IQuery createQuery);

	int indexOf(T bean, IQuery createQuery);

	T getByIndex(int index, IQuery createQuery);

	List<T> getByIndex(int startIndex, int numberOfItems, IQuery createQuery);

	T get(Object idValue);
}
