package org.molgenis.data;
import java.util.List;
import java.util.stream.Stream;
/**
* Definition of a query
*/
public interface Query<E extends Entity> extends Iterable<E>
{
Repository<E> getRepository();
/**
* Count entities matching query
*
* @return count or Exception of not bound to repository
*/
Long count();
Stream<E> findAll();
E findOne();
/**
* Filtering rules, seperated by QueryRule.AND and QueryRule.OR clauses
*/
List<QueryRule> getRules();
/**
* Size of a page. Synonym: maxResults
*/
int getPageSize();
/**
* Start
*/
int getOffset();
/**
* Returns sort
*/
Sort getSort();
/**
* Search all fields
*/
Query<E> search(String searchTerms);
/**
* Search field
*/
Query<E> search(String field, String searchTerms);
/**
* Occur operator 'or'. Example usage: query.eq("field0", "val0").or().eq("field1", "val1")
*/
Query<E> or();
/**
* Occur operator 'and'. Example usage: query.eq("field0", "val0").and().eq("field1", "val1")
*/
Query<E> and();
/**
* Occur operator 'not'. Example usage: query.not().eq("field0", "val0")
*/
Query<E> not();
/**
* @param field
* @param value
* @return Query<E>
*/
Query<E> like(String field, String value);
/**
* @param field
* @param value categorical/xref: entity or entity id; mref: entity iterable or id iterable; else: value
* @return Query<E>
*/
Query<E> eq(String field, Object value);
/**
* @param field
* @param values ids
* @return Query<E>
*/
Query<E> in(String field, Iterable<?> values);
/**
* Greater than
*/
Query<E> gt(String field, Object value);
/**
* Greater than or equal to
*/
Query<E> ge(String field, Object value);
/**
* Less than
*/
Query<E> lt(String field, Object value);
/**
* Less than or equal to
*/
Query<E> le(String field, Object value);
/**
* Start nested query
*/
Query<E> nest();
/**
* End nested query
*/
Query<E> unnest();
Query<E> unnestAll();
/**
* Range (including from and to)
*/
Query<E> rng(String field, Object from, Object to);
Query<E> pageSize(int pageSize);
Query<E> offset(int offset);
Sort sort();
Query<E> sort(Sort sort);
/**
* Return the query {@link Fetch} that defines which entity attributes to retrieve.
*
* @return the query {@link Fetch} or null
*/
Fetch getFetch();
/**
* Sets the query {@link Fetch} that defines which entity attributes to retrieve.
*
* @param fetch the query {@link Fetch}
*/
void setFetch(Fetch fetch);
/**
* Create a new empty {@link Fetch} that defines which entity attributes to retrieve.
*
* @return new empty {@link Fetch}
*/
Fetch fetch();
/**
* Sets the query {@link Fetch} that defines which entity attributes to retrieve.
*
* @return this query
*/
Query<E> fetch(Fetch fetch);
}