/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.query;
import java.util.List;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import com.mysema.query.QueryMetadata;
import com.mysema.query.types.EntityPath;
import com.mysema.query.types.OrderSpecifier;
import com.mysema.query.types.Path;
import com.mysema.query.types.Predicate;
import com.mysema.rdfbean.object.BeanQuery;
import com.mysema.rdfbean.object.Session;
import com.mysema.rdfbean.object.SessionCallback;
import com.mysema.rdfbean.object.SessionFactory;
/**
* @author tiwe
*/
@Immutable
public class BeanListSource<T> {
@Nullable
private final Predicate condition;
private final OrderSpecifier<?>[] order;
private final Path<T> projection;
private final SessionFactory sessionFactory;
private final long size;
private final EntityPath<?>[] sources;
public BeanListSource(SessionFactory sessionFactory,
EntityPath<?>[] sourceArray,
QueryMetadata metadata,
Path<T> projection) {
this.sessionFactory = sessionFactory;
this.sources = sourceArray.clone();
this.condition = metadata.getWhere();
this.projection = projection;
this.order = metadata.getOrderBy().toArray(new OrderSpecifier[metadata.getOrderBy().size()]);
this.size = sessionFactory.execute(new SessionCallback<Long>() {
@Override
public Long doInSession(Session session) {
BeanQuery countQry = session.from(sources);
if (condition != null) {
countQry.where(condition);
}
return countQry.count();
}
});
}
public T getResult(int index) {
return getResults(index, index + 1).get(0);
}
public List<T> getResults(final int from, final int to) {
return sessionFactory.execute(new SessionCallback<List<T>>() {
public List<T> doInSession(Session session) {
BeanQuery qry = session.from(sources).offset(from).limit(to - from).orderBy(order);
if (condition != null) {
qry.where(condition);
}
return qry.list(projection);
}
});
}
public final boolean isEmpty() {
return size == 0l;
}
public final long size() {
return size;
}
}