package eu.eudat.query; import eu.eudat.data.dao.DatabaseAccessLayer; import eu.eudat.data.entities.Grant; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; import javax.persistence.criteria.Subquery; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.UUID; public class GrantQuery extends Query { private UUID id; private List ids; private String label; private List statuses; private Date created; private Date modified; private UserQuery userQuery; public GrantQuery(DatabaseAccessLayer databaseAccessLayer) { super(databaseAccessLayer); } public GrantQuery(DatabaseAccessLayer databaseAccessLayer, List selectionFields) { super(databaseAccessLayer, selectionFields); } public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } public List getIds() { return ids; } public void setIds(List ids) { this.ids = ids; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public List getStatuses() { return statuses; } public void setStatuses(List statuses) { statuses = statuses; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } public Date getModified() { return modified; } public void setModified(Date modified) { this.modified = modified; } public UserQuery getUserQuery() { return userQuery; } public void setUserQuery(UserQuery userQuery) { this.userQuery = userQuery; } @Override public QueryableList getQuery() { QueryableList query = this.databaseAccessLayer.asQueryable(); if (this.id != null) query.where((builder, root) -> builder.equal(root.get("id"), this.id)); if (this.ids != null && !this.ids.isEmpty()) query.where((builder, root) -> root.get("id").in(this.ids)); if (this.getStatuses() != null && !this.getStatuses().isEmpty()) query.where((builder, root) -> root.get("status").in(this.getStatuses())); if (this.userQuery != null) { Subquery userInfoSubQuery = this.userQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id"))); query.where((builder, root) -> root.get("creationUser").get("id").in(userInfoSubQuery)); } if (!this.getSelectionFields().isEmpty() && this.getSelectionFields() != null) { query.withFields(this.getSelectionFields()); } return query; } }