/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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.
*/
package org.eurekastreams.commons.search;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.FlushModeType;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Sort;
import org.hibernate.Criteria;
import org.hibernate.search.FullTextFilter;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.transform.ResultTransformer;
/**
* Wrapper around org.eurekastreams.commons.search.FullTextQueryImpl that calls transformList on the result transformer
* after transforming the tuples in list(), regardless of whether the loader is a ProjectionLoader.
*/
public class ProjectionFullTextQuery implements FullTextQuery
{
/**
* Logger.
*/
private Log log = LogFactory.getLog(ProjectionFullTextQuery.class);
/**
* The result transformer.
*/
private ResultTransformer resultTransformer;
/**
* The wrapped FullTextQuery.
*/
private FullTextQuery wrappedFullTextQuery;
/**
* Constructor.
*
* @param inWrappedFullTextQuery
* the FullTextQuery being wrapped
*/
public ProjectionFullTextQuery(final FullTextQuery inWrappedFullTextQuery)
{
wrappedFullTextQuery = inWrappedFullTextQuery;
}
/**
* Set the result transformer to use to transform the results.
*
* @param inTransformer
* the transformer to use
* @return this
*/
@Override
public FullTextQuery setResultTransformer(final ResultTransformer inTransformer)
{
// todo: make this TRACE
log.info("Receiving the ResultTransformer.");
wrappedFullTextQuery.setResultTransformer(inTransformer);
this.resultTransformer = inTransformer;
return this;
}
/**
* Get the result list, calling transformTuple on the individual rows, and transformList when all done.
*
* @return the result list
*/
@Override
@SuppressWarnings("unchecked")
public List getResultList()
{
log.info("Getting the result list from Lucene");
long start = System.currentTimeMillis();
List resultList = wrappedFullTextQuery.getResultList();
long duration = System.currentTimeMillis() - start;
if (log.isInfoEnabled())
{
log.info("Found " + resultList.size() + " results from Lucene in " + duration + " ms.");
}
log.info("Transforming the list with resultTransformer.transformList.");
List transformedList = resultTransformer.transformList(resultList);
return transformedList;
}
/**
* Wrapped disableFullTextFilter.
*
* @param name
* the name
*/
@Override
public void disableFullTextFilter(final String name)
{
wrappedFullTextQuery.disableFullTextFilter(name);
}
/**
* Wrapped enableFullTextFilter.
*
* @param name
* the name
* @return the return value of enableFullTextFilter
*/
@Override
public FullTextFilter enableFullTextFilter(final String name)
{
return wrappedFullTextQuery.enableFullTextFilter(name);
}
/**
* Wrapped explain.
*
* @param documentId
* the document id
* @return the value returned by explain
*/
@Override
public Explanation explain(final int documentId)
{
return wrappedFullTextQuery.explain(documentId);
}
/**
* Wrapped getResultSize.
*
* @return the value returned by getResultSize
*/
@Override
public int getResultSize()
{
return wrappedFullTextQuery.getResultSize();
}
/**
* Wrapped setCriteriaQuery.
*
* @param criteria
* the criteria
* @return the value returned by setCriteria
*/
@Override
public FullTextQuery setCriteriaQuery(final Criteria criteria)
{
return wrappedFullTextQuery.setCriteriaQuery(criteria);
}
/**
* Wrapped setFilter.
*
* @param filter
* the filter
* @return value returned by setFilter
*/
@Override
public FullTextQuery setFilter(final Filter filter)
{
return wrappedFullTextQuery.setFilter(filter);
}
/**
* Wrapped setProjection.
*
* @param fields
* the fields
* @return the value returned by setProjection
*/
@Override
public FullTextQuery setProjection(final String... fields)
{
return wrappedFullTextQuery.setProjection(fields);
}
/**
* Wrapped setSort.
*
* @param sort
* the sort
* @return value returned by setSort
*/
@Override
public FullTextQuery setSort(final Sort sort)
{
return wrappedFullTextQuery.setSort(sort);
}
/**
* Wrapped executeUpdate.
*
* @return value returned by executeUpdate
*/
@Override
public int executeUpdate()
{
return wrappedFullTextQuery.executeUpdate();
}
/**
* Wrapped getSingleResult.
*
* @return the value returned by getSingleResult
*/
@Override
@SuppressWarnings("unchecked")
public Object getSingleResult()
{
log.info("Getting the single result, wrapping it with resultTransformer.transformList.");
List list = new ArrayList();
list.add(wrappedFullTextQuery.getSingleResult());
list = resultTransformer.transformList(list);
return list.get(0);
}
/**
* Wrapped setFirstResult.
*
* @param arg0
* the arg
* @return the value returned by setFirstResult.
*/
@Override
public Query setFirstResult(final int arg0)
{
return wrappedFullTextQuery.setFirstResult(arg0);
}
/**
* Wrapped setFlushMode.
*
* @param arg0
* the arg
* @return value returned by setFlushMode
*/
@Override
public Query setFlushMode(final FlushModeType arg0)
{
return wrappedFullTextQuery.setFlushMode(arg0);
}
/**
* Wrapped setHint.
*
* @param arg0
* first arg
* @param arg1
* second arg
* @return the value returned by setHint
*/
@Override
public Query setHint(final String arg0, final Object arg1)
{
return wrappedFullTextQuery.setHint(arg0, arg1);
}
/**
* Wrapped setMaxResults.
*
* @param arg0
* the arg
* @return value returned by setMaxResults
*/
@Override
public Query setMaxResults(final int arg0)
{
return wrappedFullTextQuery.setMaxResults(arg0);
}
/**
* Wrapped setParameter.
*
* @param arg0
* the first arg
* @param arg1
* the second arg
* @return value returned by setParameter
*/
@Override
public Query setParameter(final String arg0, final Object arg1)
{
return wrappedFullTextQuery.setParameter(arg0, arg1);
}
/**
* Wrapped setParameter.
*
* @param arg0
* the first arg
* @param arg1
* the second arg
* @return value returned by setParameter
*/
@Override
public Query setParameter(final int arg0, final Object arg1)
{
return wrappedFullTextQuery.setParameter(arg0, arg1);
}
/**
* Wrapped setParameter.
*
* @param arg0
* the first arg
* @param arg1
* the second arg
* @param arg2
* the third arg
* @return value returned by setParameter
*/
@Override
public Query setParameter(final String arg0, final Date arg1, final TemporalType arg2)
{
return wrappedFullTextQuery.setParameter(arg0, arg1, arg2);
}
/**
* Wrapped setParameter.
*
* @param arg0
* the first arg
* @param arg1
* the second arg
* @param arg2
* the third arg
* @return value returned by setParameter
*/
@Override
public Query setParameter(final String arg0, final Calendar arg1, final TemporalType arg2)
{
return wrappedFullTextQuery.setParameter(arg0, arg1, arg2);
}
/**
* Wrapped setParameter.
*
* @param arg0
* the first arg
* @param arg1
* the second arg
* @param arg2
* the third arg
* @return value returned by setParameter
*/
@Override
public Query setParameter(final int arg0, final Date arg1, final TemporalType arg2)
{
return wrappedFullTextQuery.setParameter(arg0, arg1, arg2);
}
/**
* Wrapped setParameter.
*
* @param arg0
* the first arg
* @param arg1
* the second arg
* @param arg2
* the third arg
* @return value returned by setParameter
*/
@Override
public Query setParameter(final int arg0, final Calendar arg1, final TemporalType arg2)
{
return wrappedFullTextQuery.setParameter(arg0, arg1, arg2);
}
}