/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.framework.hibernate.helper;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.ScrollableResults;
import org.mifos.framework.exceptions.HibernateSearchException;
/**
* This is the class that is returned on a search operation. Search would
* typically result in a set of search result objects , these search result
* objects would be obtained through hibernate scroll for pagination in the
* front end , the associate hibernate session would be held in this object , a
* call to close from the front end on this interface would result in the
* hibernate session object getting closed.
*/
public class QueryResultDTOImpl implements QueryResult {
private ScrollableResults scrollResult = null;
public QueryInputs queryInputs = null;
protected DTOBuilder dtoBuilder = null;
protected boolean buildDTO = false;
protected int size = 0;
/**
* Set the query which will be used for query execution
*
*/
@Override
public void executeQuery(Query query) throws HibernateSearchException {
if (query == null) {
throw new HibernateSearchException(HibernateConstants.SEARCH_INPUTNULL);
}
try {
scrollResult = query.scroll();
} catch (HibernateException h) {
throw new HibernateSearchException(HibernateConstants.SEARCH_FAILED, h);
}
}
/**
* Set the query inputs which will be used for query execution
*
*/
@Override
public void setQueryInputs(QueryInputs queryInputs) throws HibernateSearchException {
if (queryInputs == null) {
throw new HibernateSearchException(HibernateConstants.SEARCH_INPUTNULL);
}
if (queryInputs.getBuildDTO()) {
this.queryInputs = queryInputs;
dtoBuilder = new DTOBuilder();
dtoBuilder.setInputs(queryInputs);
this.buildDTO = queryInputs.getBuildDTO();
}
}
/**
* Returns the requested set of search result objects based on the
* pagination at the front end.
*
*/
@Override
public List<Object> get(int position, int noOfObjects) throws HibernateSearchException {
List<Object> returnList = new ArrayList<Object>();
try {
scrollResult.setRowNumber(position);
returnList = new ArrayList<Object>();
if (position < size) {
if (buildDTO) {
returnList.add(buildDTO(scrollResult.get()));
} else {
Object[] obj = scrollResult.get();
returnList.add(obj[0]);
}
}
for (int i = 0; i < noOfObjects - 1; i++) {
if (scrollResult.next()) {
if (buildDTO) {
returnList.add(buildDTO(scrollResult.get()));
} else {
Object[] obj = scrollResult.get();
returnList.add(obj[0]);
}
}
}
} catch (Exception e) {
throw new HibernateSearchException(HibernateConstants.SEARCH_FAILED, e);
}
return returnList;
}
/**
* Returns the records valid for the query
*
*/
@Override
public int getSize() throws HibernateSearchException {
int lastRowNumber = 0;
try {
scrollResult.last();
lastRowNumber = scrollResult.getRowNumber();
scrollResult.first();
} catch (Exception e) {
throw new HibernateSearchException(HibernateConstants.SEARCH_FAILED, e);
}
size = lastRowNumber + 1;
return size;
}
protected Object buildDTO(Object[] dtoData) throws HibernateSearchException {
return dtoBuilder.buildDTO(dtoData);
}
}