/* * Copyright 2007 Rickard Öberg. * 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.api.query; import org.qi4j.api.composite.Composite; import org.qi4j.functional.Specification; /** * QueryBuilders are used to create {@link Query} instances. * Iteratively add where() clauses to the query, and then use * {@link org.qi4j.api.unitofwork.UnitOfWork#newQuery(QueryBuilder)} to instantiate the Query. * QueryBuilders are immutable, so when adding new where-clauses you get new instances. This * * DDD tip: Query objects are not executed immediately, so they * should be constructed in the domain model and handed over to * the UI, which can then further constrain it before actual * execution. */ public interface QueryBuilder<T> { /** * Add a where-clause to the Query. Use {@link QueryExpressions} * to create the expression. * * @param specification the where clause * * @return a new builder with the added where-clause */ QueryBuilder<T> where( Specification<Composite> specification ); /** * Create a new query with the declared where-clauses that will be evaluated against the iterable entries. * * @param iterable collection of objects (composites?) * * @return a new Query instance */ Query<T> newQuery( Iterable<T> iterable ); }