/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community 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://opensource.org/licenses/ecl2.txt
*
* 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.opencastproject.assetmanager.impl.query;
import static com.entwinemedia.fn.Stream.$;
import com.entwinemedia.fn.Fn;
import com.entwinemedia.fn.Stream;
import com.entwinemedia.fn.data.Opt;
import com.mysema.query.types.EntityPath;
import com.mysema.query.types.Expression;
import com.mysema.query.types.OrderSpecifier;
import com.mysema.query.types.expr.BooleanExpression;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
/**
* Collect contributions to a JPA query.
* Each of the builder methods creates a new instance.
*/
@ParametersAreNonnullByDefault
public final class SelectQueryContribution {
// CHECKSTYLE:OFF
final Stream<Expression<?>> fetch;
final Stream<EntityPath<?>> from;
final Stream<Join> join;
final Opt<BooleanExpression> where;
final Opt<Integer> offset;
final Opt<Integer> limit;
final Stream<OrderSpecifier<?>> order;
// CHECKSTYLE:ON
public SelectQueryContribution(
Stream<Expression<?>> fetch,
Stream<EntityPath<?>> from,
Stream<Join> join,
Opt<BooleanExpression> where,
Opt<Integer> offset,
Opt<Integer> limit,
Stream<OrderSpecifier<?>> order) {
this.fetch = fetch;
this.from = from;
this.join = join;
this.where = where;
this.offset = offset;
this.limit = limit;
this.order = order;
}
/** Create a new, empty contribution. */
public static SelectQueryContribution mk() {
return new SelectQueryContribution(Stream.<Expression<?>>empty(), Stream.<EntityPath<?>>empty(), Stream.<Join>empty(), Opt.<BooleanExpression>none(), Opt.<Integer>none(), Opt.<Integer>none(), Stream.<OrderSpecifier<?>>empty());
}
/** Set the `fetch` contribution. */
SelectQueryContribution fetch(Stream<? extends Expression<?>> fetch) {
return new SelectQueryContribution((Stream<Expression<?>>) fetch, from, join, where, offset, limit, order);
}
/** Add to the `from` contribution. */
SelectQueryContribution addFetch(Stream<? extends Expression<?>> fetch) {
return new SelectQueryContribution(this.fetch.append(fetch), from, join, where, offset, limit, order);
}
/** Set the `from` contribution. */
SelectQueryContribution from(Stream<? extends EntityPath<?>> from) {
return new SelectQueryContribution(fetch, (Stream<EntityPath<?>>) from, join, where, offset, limit, order);
}
/** Add to the `from` contribution. */
SelectQueryContribution addFrom(Stream<? extends EntityPath<?>> from) {
return new SelectQueryContribution(fetch, this.from.append(from), join, where, offset, limit, order);
}
/** Set the `join` contribution. */
SelectQueryContribution join(Stream<Join> join) {
return new SelectQueryContribution(fetch, from, join, where, offset, limit, order);
}
/** Set the `join` contribution. */
SelectQueryContribution join(Join join) {
return join($(join));
}
/** Add to the `join` contribution. */
SelectQueryContribution addJoin(Stream<Join> join) {
return new SelectQueryContribution(fetch, from, this.join.append(join), where, offset, limit, order);
}
/** Add to the `join` contribution. */
SelectQueryContribution addJoin(Join join) {
return addJoin($(join));
}
/* ------------------------------------------------------------------------------------------------------------------ */
/** Set the `where` contribution. */
SelectQueryContribution where(Opt<BooleanExpression> where) {
return new SelectQueryContribution(fetch, from, join, where, offset, limit, order);
}
/** Set the `where` contribution. */
SelectQueryContribution where(@Nullable BooleanExpression where) {
return where(Opt.nul(where));
}
/** Add to the `where` contribution using boolean "and". */
SelectQueryContribution andWhere(Opt<BooleanExpression> where) {
return where(JpaFns.allOf(this.where, where));
}
/** Add to the `where` contribution using boolean "and". */
SelectQueryContribution andWhere(@Nullable BooleanExpression where) {
return andWhere(Opt.nul(where));
}
/* ------------------------------------------------------------------------------------------------------------------ */
/** Set the `offset` contribution. */
SelectQueryContribution offset(Opt<Integer> offset) {
return new SelectQueryContribution(fetch, from, join, where, offset, limit, order);
}
/** Set the `offset` contribution. */
SelectQueryContribution offset(Integer offset) {
return offset(Opt.some(offset));
}
/** Set the `limit` contribution. */
SelectQueryContribution limit(Opt<Integer> limit) {
return new SelectQueryContribution(fetch, from, join, where, offset, limit, order);
}
/** Set the `limit` contribution. */
SelectQueryContribution limit(Integer limit) {
return limit(Opt.some(limit));
}
/** Set the `order` contribution. */
SelectQueryContribution order(Stream<? extends OrderSpecifier<?>> order) {
return new SelectQueryContribution(fetch, from, join, where, offset, limit, (Stream<OrderSpecifier<?>>) order);
}
/** Add to the `order` contribution. */
SelectQueryContribution addOrder(Stream<? extends OrderSpecifier<?>> order) {
return new SelectQueryContribution(fetch, from, join, where, offset, limit, this.order.append(order));
}
static final Fn<SelectQueryContribution, Stream<Expression<?>>> getFetch = new Fn<SelectQueryContribution, Stream<Expression<?>>>() {
@Override public Stream<Expression<?>> apply(SelectQueryContribution c) {
return c.fetch;
}
};
static final Fn<SelectQueryContribution, Stream<EntityPath<?>>> getFrom = new Fn<SelectQueryContribution, Stream<EntityPath<?>>>() {
@Override public Stream<EntityPath<?>> apply(SelectQueryContribution c) {
return c.from;
}
};
static final Fn<SelectQueryContribution, Stream<Join>> getJoin = new Fn<SelectQueryContribution, Stream<Join>>() {
@Override public Stream<Join> apply(SelectQueryContribution c) {
return c.join;
}
};
static final Fn<SelectQueryContribution, Opt<BooleanExpression>> getWhere = new Fn<SelectQueryContribution, Opt<BooleanExpression>>() {
@Override public Opt<BooleanExpression> apply(SelectQueryContribution c) {
return c.where;
}
};
static final Fn<SelectQueryContribution, Stream<OrderSpecifier<?>>> getOrder = new Fn<SelectQueryContribution, Stream<OrderSpecifier<?>>>() {
@Override public Stream<OrderSpecifier<?>> apply(SelectQueryContribution c) {
return c.order;
}
};
}