blob: 7048990ea71f0031a70b4f866f95810b79313d3f [file] [log] [blame]
/*
* Copyright 2007 Niclas Hedhman.
* Copyright 2008 Alin Dreghiciu.
*
* 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.qi4j.runtime.query;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.qi4j.api.composite.Composite;
import org.qi4j.api.property.Property;
import org.qi4j.api.query.Query;
import org.qi4j.api.query.QueryExecutionException;
import org.qi4j.api.query.QueryExpressions;
import org.qi4j.api.query.grammar.OrderBy;
import org.qi4j.functional.Iterables;
import org.qi4j.functional.Specification;
import org.qi4j.spi.query.QuerySource;
/**
* Default implementation of {@link org.qi4j.api.query.Query}.
*/
/* package */ class QueryImpl<T>
implements Query<T>
{
private static final long serialVersionUID = 1L;
/**
* Type of queried entities.
*/
private final Class<T> resultType;
/**
* Where clause.
*/
private final Specification<Composite> whereClause;
private QuerySource querySource;
/**
* Order by clause segments.
*/
private Iterable<OrderBy> orderBySegments;
/**
* First result to be returned.
*/
private Integer firstResult;
/**
* Maximum number of results to be returned.
*/
private Integer maxResults;
/**
* Mapping between variable name and variable values.
*/
private Map<String, Object> variables;
/**
* Constructor.
*
* @param resultType type of queried entities; cannot be null
* @param whereClause where clause
*/
/* package */ QueryImpl( final Class<T> resultType,
final Specification<Composite> whereClause,
final QuerySource querySource
)
{
this.resultType = resultType;
this.whereClause = whereClause;
this.querySource = querySource;
}
/**
* @see org.qi4j.api.query.Query#orderBy(org.qi4j.api.query.grammar.OrderBy[])
*/
@Override
public Query<T> orderBy( final OrderBy... segments )
{
orderBySegments = Iterables.iterable( segments );
return this;
}
/**
* @see org.qi4j.api.query.Query#orderBy(org.qi4j.api.property.Property, org.qi4j.api.query.grammar.OrderBy.Order)
*/
@Override
public Query<T> orderBy( Property<?> property, OrderBy.Order order )
{
if( orderBySegments == null )
{
orderBySegments = Iterables.iterable( new OrderBy( QueryExpressions.property( property ), order ) );
}
else
{
orderBySegments = Iterables.append( new OrderBy( QueryExpressions.property( property ), order ), orderBySegments );
}
return this;
}
/**
* @see org.qi4j.api.query.Query#orderBy(org.qi4j.api.property.Property)
*/
@Override
public Query<T> orderBy( Property<?> property )
{
orderBy( property, OrderBy.Order.ASCENDING );
return this;
}
/**
* @see org.qi4j.api.query.Query#firstResult(int)
*/
@Override
public Query<T> firstResult( int firstResult )
{
this.firstResult = firstResult;
return this;
}
/**
* @see org.qi4j.api.query.Query#maxResults(int)
*/
@Override
public Query<T> maxResults( int maxResults )
{
this.maxResults = maxResults;
return this;
}
/**
* @see org.qi4j.api.query.Query#setVariable(String, Object)
*/
@SuppressWarnings( "unchecked" )
@Override
public Query<T> setVariable( final String name, final Object value )
{
if( variables == null )
{
variables = new HashMap<String, Object>();
}
variables.put( name, value );
return this;
}
/**
* @see org.qi4j.api.query.Query#getVariable(String)
*/
@SuppressWarnings( "unchecked" )
@Override
public <V> V getVariable( final String name )
{
if( variables == null )
{
return null;
}
else
{
return (V) variables.get( name );
}
}
@Override
public Class<T> resultType()
{
return resultType;
}
@Override
public T find()
throws QueryExecutionException
{
return querySource.find( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
}
@Override
public long count()
throws QueryExecutionException
{
return querySource.count( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
}
@Override
public Iterator<T> iterator()
{
return querySource.iterator( resultType, whereClause, orderBySegments, firstResult, maxResults, variables );
}
@Override
public String toString()
{
return "Query{" +
" FROM " + querySource +
" WHERE " + whereClause +
( orderBySegments != null ? " ORDER BY " + orderBySegments : "" ) +
( firstResult != null ? " FIRST " + firstResult : "" ) +
( maxResults != null ? " MAX " + maxResults : "" ) +
" EXPECT " + resultType +
( variables != null ? " WITH VARIABLES " + variables : "" ) +
'}';
}
}