/* * 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 : "" ) + '}'; } }