Updates Queryablelist to support Queries and Criteria

This commit is contained in:
ikalyvas 2019-05-23 18:03:44 +03:00
parent 579749a5dc
commit 93f69979ba
18 changed files with 488 additions and 56 deletions

View File

@ -323,9 +323,9 @@ public class DMP implements DataEntity<DMP, UUID> {
public DMP buildFromTuple(List<Tuple> tuple, List<String> fields, String base) {
String currentBase = base.isEmpty() ? "" : base + ".";
if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id");
this.dataset = tuple.stream().map(x -> new Dataset().buildFromTuple(tuple, fields, currentBase + "dataset")).collect(Collectors.toSet());
this.creator = tuple.stream().map(x -> new UserInfo().buildFromTuple(tuple, fields, currentBase + "creator")).collect(Collectors.toList()).get(0);
this.project = tuple.stream().map(x -> new Project().buildFromTuple(tuple, fields, currentBase + "project")).collect(Collectors.toList()).get(0);
this.dataset = tuple.stream().map(x -> new Dataset().buildFromTuple(Arrays.asList(x), fields, currentBase + "dataset")).collect(Collectors.toSet());
this.creator = tuple.stream().map(x -> new UserInfo().buildFromTuple(Arrays.asList(x), fields, currentBase + "creator")).collect(Collectors.toList()).get(0);
this.project = tuple.stream().map(x -> new Project().buildFromTuple(Arrays.asList(x), fields, currentBase + "project")).collect(Collectors.toList()).get(0);
return this;
}
}

View File

@ -8,10 +8,7 @@ import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
@ -312,9 +309,9 @@ public class Project implements DataEntity<Project, UUID> {
String currentBase = base.isEmpty() ? "" : base + ".";
if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id");
if (fields.contains(currentBase + "dmps"))
this.dmps = tuple.stream().map(x -> new DMP().buildFromTuple(tuple, fields, currentBase + "dmps")).collect(Collectors.toSet());
this.dmps = tuple.stream().map(x -> new DMP().buildFromTuple(Arrays.asList(x), fields, currentBase + "dmps")).collect(Collectors.toSet());
if (fields.contains(currentBase + "creationUser"))
this.creationUser = tuple.stream().map(x -> new UserInfo().buildFromTuple(tuple, fields, currentBase + "creationUser")).collect(Collectors.toList()).get(0);
this.creationUser = tuple.stream().map(x -> new UserInfo().buildFromTuple(Arrays.asList(x), fields, currentBase + "creationUser")).collect(Collectors.toList()).get(0);
return this;
}
}

View File

@ -2,12 +2,13 @@ package eu.eudat.query;
import eu.eudat.data.dao.DatabaseAccessLayer;
import eu.eudat.data.entities.DMP;
import eu.eudat.data.entities.Dataset;
import eu.eudat.data.entities.Project;
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.TypedQuery;
import javax.persistence.criteria.Subquery;
import java.util.Arrays;
import java.util.Date;
@ -20,6 +21,8 @@ public class DMPQuery extends Query<DMP, UUID> {
private String label;
private int version;
private ProjectQuery projectQuery;
private UserQuery userQuery;
private DatasetQuery datasetQuery;
private List<Integer> statuses;
private Date created;
private Date modified;
@ -28,6 +31,10 @@ public class DMPQuery extends Query<DMP, UUID> {
super(databaseAccessLayer);
}
public DMPQuery(DatabaseAccessLayer<DMP, UUID> databaseAccessLayer, List<String> selectionFields) {
super(databaseAccessLayer, selectionFields);
}
public UUID getId() {
return id;
}
@ -92,18 +99,45 @@ public class DMPQuery extends Query<DMP, UUID> {
this.modified = modified;
}
public UserQuery getUserQuery() {
return userQuery;
}
public void setUserQuery(UserQuery userQuery) {
this.userQuery = userQuery;
}
public DatasetQuery getDatasetQuery() {
return datasetQuery;
}
public void setDatasetQuery(DatasetQuery datasetQuery) {
this.datasetQuery = datasetQuery;
}
public QueryableList<DMP> getQuery() {
QueryableList<DMP> query = this.databaseAccessLayer.asQueryable();
if (this.id != null) {
query.where((builder, root) -> builder.equal(root.get("id"), this.id));
}
if(this.projectQuery != null){
if (this.projectQuery != null) {
Subquery<Project> projectQuery = this.projectQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id")));
query.where((builder, root) -> root.get("project").get("id").in(projectQuery));
}
if(this.getStatuses() != null && !this.getStatuses().isEmpty()){
if (this.getStatuses() != null && !this.getStatuses().isEmpty()) {
query.where((builder, root) -> root.get("status").in(this.getStatuses()));
}
if (this.userQuery != null) {
Subquery<UserInfo> userInfoSubQuery = this.userQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id")));
query.where((builder, root) -> root.get("creator").get("id").in(userInfoSubQuery));
}
if(this.datasetQuery != null){
Subquery<Dataset> datasetSubQuery = this.datasetQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:id")));
query.where((builder, root) -> root.get("id").in(datasetSubQuery ));
}
if (!this.getSelectionFields().isEmpty() && this.getSelectionFields() != null) {
query.withFields(this.getSelectionFields());
}
return query;
}
}

View File

@ -1,20 +1,65 @@
package eu.eudat.query;
import eu.eudat.data.dao.DatabaseAccessLayer;
import eu.eudat.data.entities.DMP;
import eu.eudat.data.entities.Dataset;
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.List;
import java.util.UUID;
public class DatasetQuery extends Query<Dataset, UUID> {
private UUID id;
private String label;
private DMPQuery dmpQuery;
public DatasetQuery(DatabaseAccessLayer<Dataset, UUID> databaseAccessLayer) {
super(databaseAccessLayer);
}
public DatasetQuery(DatabaseAccessLayer<Dataset, UUID> databaseAccessLayer, List<String> selectionFields) {
super(databaseAccessLayer, selectionFields);
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public DMPQuery getDmpQuery() {
return dmpQuery;
}
public void setDmpQuery(DMPQuery dmpQuery) {
this.dmpQuery = dmpQuery;
}
@Override
public QueryableList<Dataset> getQuery() {
return null;
QueryableList<Dataset> query = this.databaseAccessLayer.asQueryable();
if (this.id != null) {
query.where((builder, root) -> builder.equal(root.get("id"), this.id));
}
if (this.dmpQuery != null) {
Subquery<DMP> dmpSubQuery = this.dmpQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id")));
query.where((builder, root) -> root.get("dmp").get("id").in(dmpSubQuery));
}
return query;
}
}

View File

@ -27,6 +27,10 @@ public class ProjectQuery extends Query<Project, UUID> {
super(databaseAccessLayer);
}
public ProjectQuery(DatabaseAccessLayer<Project, UUID> databaseAccessLayer, List<String> selectionFields) {
super(databaseAccessLayer, selectionFields);
}
public UUID getId() {
return id;
}
@ -96,6 +100,9 @@ public class ProjectQuery extends Query<Project, UUID> {
Subquery<UserInfo> 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;
}
}

View File

@ -4,12 +4,26 @@ import eu.eudat.data.dao.DatabaseAccessLayer;
import eu.eudat.queryable.QueryableList;
import eu.eudat.queryable.queryableentity.DataEntity;
import java.util.LinkedList;
import java.util.List;
public abstract class Query<T extends DataEntity, K> {
protected DatabaseAccessLayer<T,K> databaseAccessLayer;
protected DatabaseAccessLayer<T, K> databaseAccessLayer;
private List<String> selectionFields = new LinkedList<>();
public Query(DatabaseAccessLayer<T, K> databaseAccessLayer, List<String> selectionFields) {
this.databaseAccessLayer = databaseAccessLayer;
this.selectionFields = selectionFields;
}
public Query(DatabaseAccessLayer<T, K> databaseAccessLayer) {
this.databaseAccessLayer = databaseAccessLayer;
}
public abstract QueryableList<T> getQuery();
protected List<String> getSelectionFields() {
return selectionFields;
}
}

View File

@ -4,6 +4,7 @@ import eu.eudat.data.dao.DatabaseAccessLayer;
import eu.eudat.data.entities.UserInfo;
import eu.eudat.queryable.QueryableList;
import java.util.List;
import java.util.UUID;
public class UserQuery extends Query<UserInfo, UUID> {
@ -22,6 +23,10 @@ public class UserQuery extends Query<UserInfo, UUID> {
super(databaseAccessLayer);
}
public UserQuery(DatabaseAccessLayer<UserInfo, UUID> databaseAccessLayer, List<String> selectionFields) {
super(databaseAccessLayer, selectionFields);
}
@Override
public QueryableList<UserInfo> getQuery() {
QueryableList<UserInfo> query = this.databaseAccessLayer.asQueryable();

View File

@ -35,7 +35,7 @@
<org.apache.tomcat.tomcat-jdbc.version>7.0.35</org.apache.tomcat.tomcat-jdbc.version>
<com.fasterxml.jackson>2.8.4</com.fasterxml.jackson>
<hibernate.version>5.2.11.Final</hibernate.version>
<hibernate.version>5.4.2.Final</hibernate.version>
<commons-codec.version>1.9</commons-codec.version>
<org.junit.version>4.11</org.junit.version>

View File

@ -8,6 +8,7 @@ import javax.persistence.TypedQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Subquery;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
public interface QueryableList<T extends DataEntity> {
@ -23,6 +24,8 @@ public interface QueryableList<T extends DataEntity> {
QueryableList<T> withFields(List<String> fields);
List<Map> toListWithFields();
CompletableFuture<List<T>> toListAsync();
T getSingle();

View File

@ -0,0 +1,29 @@
package eu.eudat.queryable.collector;
import javax.persistence.Tuple;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Collector {
public List<Map> buildFromTuple(List<Tuple> results, Map<Object, List<Tuple>> groupedResults, List<String> fields, String key) {
return groupedResults.keySet().stream()
.map(x -> buildOne(groupedResults.get(x), fields, key))
.collect(Collectors.toList());
}
private Map buildOne(List<Tuple> tuples, List<String> fields, String key) {
Map tupleValues = new LinkedHashMap();
List<ProjectionField> projectionFields = fields.stream()
.map(x -> x.split("\\."))
.collect(Collectors.groupingBy(x -> x[0]))
.values()
.stream()
.map(field -> new ProjectionField(field.stream().map(x -> String.join(".", x)).collect(Collectors.toList()), null))
.collect(Collectors.toList());
projectionFields.forEach(x -> x.collect(tupleValues, tuples));
return tupleValues;
}
}

View File

@ -0,0 +1,107 @@
package eu.eudat.queryable.collector;
import com.google.common.collect.Lists;
import javax.persistence.Tuple;
import java.util.*;
import java.util.stream.Collectors;
public class ProjectionField {
private String key;
private List<ProjectionField> fields;
private ProjectionField parent;
public ProjectionField(List<String> field, ProjectionField parent) {
this.parse(field);
this.parent = parent;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public List<ProjectionField> getFields() {
return fields;
}
public void setFields(List<ProjectionField> fields) {
this.fields = fields;
}
private void parse(List<String> fields) {
String[] fieldsArr = fields.get(0).split("\\.");
this.key = fieldsArr[0];
this.fields = fields.stream()
.map(x -> x.replace(x.contains(".") ? this.key + "." : this.key, ""))
.filter(x -> !x.isEmpty())
.map(x -> x.split("\\."))
.collect(Collectors.groupingBy(x -> x[0]))
.values()
.stream()
.map(field -> new ProjectionField(field.stream().map(x -> String.join(".", x)).collect(Collectors.toList()), this))
.collect(Collectors.toList());
}
public Map collect(Map map, List<Tuple> tuples) {
if (fields != null && !fields.isEmpty()) {
this.collect(map, this.fields, tuples);
} else {
map.put(key, this.createObject(tuples, this.generatePath()));
}
return map;
}
public Map collect(Map map, List<ProjectionField> projectionGroup, List<Tuple> tuples) {
map.put(key, this.createObject(tuples, projectionGroup));
return map;
}
private String generatePath() {
List<String> list = new LinkedList<>();
ProjectionField current = this;
list.add(current.key);
while (current.parent != null) {
list.add(current.parent.key);
current = current.parent;
}
return String.join(".", Lists.reverse(list));
}
private Object createObject(List<Tuple> tuples, String field) {
List values = tuples.stream()
.map(x -> x.get(field))
.distinct()
.collect(Collectors.toList());
if (values.size() > 1) {
return values.stream().map(x -> {
Map map = new LinkedHashMap();
map.put(field, x);
return map;
}).collect(Collectors.toList());
} else if (values.size() == 1) {
return values.get(0);
} else return null;
}
private Object createObject(List<Tuple> tuples, List<ProjectionField> group) {
Collection<Map> values = tuples.stream()
.map(x -> getValuesFrom(tuples, x, group))
.collect(Collectors.toMap(x -> x.get("id"), x -> x, (x, y) -> x)).values();
return values;
}
private Map getValuesFrom(List<Tuple> tuples, Tuple tuple, List<ProjectionField> group) {
Map map = new LinkedHashMap();
group.forEach(x -> {
if (x.fields != null && !x.fields.isEmpty())
map.put(x.key, this.createObject(tuples, x.fields));
else map.put(x.key, tuple.get(x.generatePath()));
});
return map;
}
}

View File

@ -1,6 +1,7 @@
package eu.eudat.queryable.jpa.hibernatequeryablelist;
import eu.eudat.queryable.QueryableList;
import eu.eudat.queryable.collector.Collector;
import eu.eudat.queryable.exceptions.NotSingleResultException;
import eu.eudat.queryable.jpa.predicates.*;
import eu.eudat.queryable.queryableentity.DataEntity;
@ -18,6 +19,7 @@ import java.util.stream.Collectors;
public class QueryableHibernateList<T extends DataEntity> implements QueryableList<T> {
private Collector collector = new Collector();
private EntityManager manager;
private CriteriaQuery query;
private Class<T> tClass;
@ -33,6 +35,7 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
private Integer offset;
private Set<String> hints;
private String hint;
private Map<String, Join> joinsMap = new HashMap<>();
public QueryableHibernateList(EntityManager manager, Class<T> tClass) {
this.manager = manager;
@ -56,7 +59,7 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
}
private QueryableList<T> selectFields() {
List<Selection> rootFields = fields.stream().map(field -> this.convertFieldToPath(field)).collect(Collectors.toList());
List<Selection> rootFields = fields.stream().map(field -> this.convertFieldToPath(field)).filter(x -> x != null).collect(Collectors.toList());
this.query.select(this.manager.getCriteriaBuilder().tuple(rootFields.toArray(new Selection[rootFields.size()])));
return this;
}
@ -72,7 +75,7 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
Join join = null;
path.alias(fields[0]);
for (int i = 1; i < fields.length; i++) {
join = join != null ? join.join(fields[i - 1], JoinType.LEFT) : this.root.join(fields[i - 1], JoinType.LEFT);
join = join != null ? join.join(fields[i - 1], JoinType.LEFT) : this.getJoin(fields[i - 1], JoinType.LEFT);
path = join.get(fields[i]);
path.alias(String.join(".", Arrays.asList(fields).subList(0, i + 1)));
}
@ -80,6 +83,20 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
}
}
private Join getJoin(String field, String path, Join joined, JoinType type) {
if (this.joinsMap.containsKey(path)) return this.joinsMap.get(path);
Join join = joined.join(path, type);
this.joinsMap.put(path, join);
return join;
}
private Join getJoin(String field, JoinType type) {
if (this.joinsMap.containsKey(field)) return this.joinsMap.get(field);
Join join = this.root.join(field, type);
this.joinsMap.put(field, join);
return join;
}
public QueryableHibernateList<T> setEntity(Class<T> type) {
return this;
@ -194,22 +211,23 @@ public class QueryableHibernateList<T extends DataEntity> implements QueryableLi
if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root));
if (!this.fields.isEmpty()) this.selectFields();
if (distinct) this.query.distinct(true);
if (!this.fields.isEmpty()) return this.toListWithFields();
else return this.toListWithOutFields();
//if (!this.fields.isEmpty()) return this.toListWithFields();
return this.toListWithOutFields();
}
private List<T> toListWithFields() {
public List<Map> toListWithFields() {
CriteriaBuilder builder = this.manager.getCriteriaBuilder();
if (!this.fields.isEmpty()) this.query = builder.createTupleQuery();
else this.query = builder.createQuery(this.tClass);
this.root = this.query.from(this.tClass);
this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot));
if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root));
if (!this.fields.isEmpty()) this.selectFields();
if (distinct) this.query.distinct(true);
List<Tuple> results = this.manager.createQuery(query).getResultList();
Map<Object, List<Tuple>> groupedResults = results.stream()
.collect(Collectors.groupingBy(x -> x.get("id")));
return results.stream().map(x -> {
try {
return (T) this.tClass.newInstance().buildFromTuple(groupedResults.get(x.get("id")), this.fields, "");
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
return this.collector.buildFromTuple(results, groupedResults, this.fields, "id");
}
private List<T> toListWithOutFields() {

View File

@ -0,0 +1,16 @@
package eu.eudat.configurations;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfiguration {
@Bean
public ObjectMapper buildObjectMapper() {
return new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL)
.setSerializationInclusion(JsonInclude.Include.NON_ABSENT)
.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
}
}

View File

@ -48,6 +48,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@ -201,18 +202,16 @@ public class DMPs extends BaseController {
@RequestMapping(method = RequestMethod.POST, value = {"/test"}, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<DataTableData<DataManagementPlanListingModel>>> test(@RequestBody DMPCriteria criteria, @ClaimedAuthorities(claims = {Authorities.ANONYMOUS}) Principal principal) throws Exception {
ResponseEntity<ResponseItem<DataTableData<Map>>> test(@RequestBody DMPCriteria criteria, @ClaimedAuthorities(claims = {Authorities.ANONYMOUS}) Principal principal) throws Exception {
DatabaseRepository dbRepo = this.getApiContext().getOperationsContext().getDatabaseRepository();
DMPQuery query = criteria.getQuery(dbRepo.getDmpDao());
ProjectQuery projectQuery = criteria.getProject().getQuery(dbRepo.getProjectDao());
UserQuery userQuery = criteria.getProject().getCreator().getQuery(dbRepo.getUserInfoDao());
projectQuery.setUserQuery(userQuery);
query.setProjectQuery(projectQuery);
List<DataManagementPlanListingModel> models = query.getQuery().withFields(Arrays.asList("id", "project.id", "dataset.id", "project.creationUser.id")).select(x -> new DataManagementPlanListingModel().fromDataModel(x));
DataTableData<DataManagementPlanListingModel> dmp = new DataTableData<>();
DMPQuery query = criteria.buildQuery(dbRepo);
List<Map> models = query.getQuery().toListWithFields();
DataTableData<Map> dmp = new DataTableData<>();
dmp.setData(models);
dmp.setTotalCount(query.getQuery().count());
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataTableData<DataManagementPlanListingModel>>().status(ApiMessageCode.NO_MESSAGE).payload(dmp));
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataTableData<Map>>().status(ApiMessageCode.NO_MESSAGE).payload(dmp));
}
}

View File

@ -2,10 +2,10 @@ package eu.eudat.criteria;
import eu.eudat.criteria.entities.Criteria;
import eu.eudat.criteria.entities.DateCriteria;
import eu.eudat.data.dao.entities.DMPDao;
import eu.eudat.logic.services.operations.DatabaseRepository;
import eu.eudat.query.DMPQuery;
import java.util.UUID;
import java.util.*;
public class DMPCriteria {
private Criteria<UUID> id;
@ -15,6 +15,8 @@ public class DMPCriteria {
private ProjectCriteria project;
private DateCriteria created;
private DateCriteria modified;
private UserCriteria creator;
private DatasetCriteria dataset;
public Criteria<UUID> getId() {
return id;
@ -108,9 +110,41 @@ public class DMPCriteria {
this.modified = criteria;
}
public DMPQuery getQuery(DMPDao dao) {
DMPQuery dmpQuery = new DMPQuery(dao);
dmpQuery.setId(this.id.getValue());
public UserCriteria getCreator() {
return creator;
}
public void setCreator(UserCriteria creator) {
this.creator = creator;
}
public DatasetCriteria getDataset() {
return dataset;
}
public void setDataset(DatasetCriteria dataset) {
this.dataset = dataset;
}
protected List<String> buildFields(String path) {
Set<String> fields = new HashSet<>();
path = path != null && !path.isEmpty() ? path + "." : "";
if (this.id != null) fields.add(path + this.id.getAs());
if (this.project != null) fields.addAll(this.project.buildFields(path + "project"));
if (this.creator != null) fields.addAll(this.creator.buildFields(path + "creator"));
if (this.dataset != null) fields.addAll(this.dataset.buildFields(path + "dataset"));
if (this.label != null) fields.add(path + this.label.getAs());
if (!fields.contains(path + "id")) fields.add(path + "id");
return new LinkedList<>(fields);
}
public DMPQuery buildQuery(DatabaseRepository dao) {
List<String> fields = this.buildFields("");
DMPQuery dmpQuery = new DMPQuery(dao.getDmpDao(), fields);
if (this.id != null) dmpQuery.setId(this.id.getValue());
if (this.project != null) dmpQuery.setProjectQuery(this.project.buildQuery(dao));
if (this.creator != null) dmpQuery.setUserQuery(this.creator.buildQuery(dao));
if (this.dataset != null) dmpQuery.setDatasetQuery(this.dataset.buildQuery(dao));
return dmpQuery;
}
}

View File

@ -0,0 +1,77 @@
package eu.eudat.criteria;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import eu.eudat.criteria.entities.Criteria;
import eu.eudat.logic.services.operations.DatabaseRepository;
import eu.eudat.query.DatasetQuery;
import java.io.IOException;
import java.util.*;
public class DatasetCriteria {
private Criteria<UUID> id;
private Criteria<String> label;
private DMPCriteria dmp;
public Criteria<UUID> getId() {
return id;
}
public void setId(JsonNode jsonNode) throws IOException {
if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) {
Criteria<UUID> criteria = new Criteria<>();
criteria.setAs(jsonNode.asText());
this.id = criteria;
} else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<UUID>>() {
});
this.id = reader.readValue(jsonNode);
}
}
public Criteria<String> getLabel() {
return label;
}
public void setLabel(JsonNode jsonNode) throws IOException {
if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) {
Criteria<String> criteria = new Criteria<>();
criteria.setAs(jsonNode.asText());
this.label = criteria;
} else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<String>>() {
});
this.label = reader.readValue(jsonNode);
}
}
public DMPCriteria getDmp() {
return dmp;
}
public void setDmp(DMPCriteria dmp) {
this.dmp = dmp;
}
protected List<String> buildFields(String path) {
Set<String> fields = new HashSet<>();
path = path != null && !path.isEmpty() ? path + "." : "";
if (this.id != null) fields.add(path + this.id.getAs());
if (this.label != null) fields.add(path + this.label.getAs());
if (this.dmp != null) fields.addAll(this.dmp.buildFields(path + "dmp"));
if (!fields.contains(path + "id")) fields.add(path + "id");
return new LinkedList<>(fields);
}
public DatasetQuery buildQuery(DatabaseRepository dao) {
List<String> fields = this.buildFields("");
DatasetQuery datasetQuery = new DatasetQuery(dao.getDatasetDao(), fields);
if (this.id != null) datasetQuery.setId(this.id.getValue());
if (this.dmp != null) datasetQuery.setDmpQuery(this.dmp.buildQuery(dao));
return datasetQuery;
}
}

View File

@ -7,12 +7,11 @@ import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import eu.eudat.criteria.entities.Criteria;
import eu.eudat.criteria.entities.DateCriteria;
import eu.eudat.data.dao.entities.ProjectDao;
import eu.eudat.logic.services.operations.DatabaseRepository;
import eu.eudat.query.ProjectQuery;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import java.util.*;
public class ProjectCriteria {
private Criteria<UUID> id;
@ -33,7 +32,8 @@ public class ProjectCriteria {
criteria.setAs(jsonNode.asText());
this.id = criteria;
} else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<UUID>>() {});
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<UUID>>() {
});
this.id = reader.readValue(jsonNode);
}
}
@ -50,8 +50,15 @@ public class ProjectCriteria {
return label;
}
public void setLabel(Criteria<String> label) {
this.label = label;
public void setLabel(JsonNode jsonNode) throws IOException {
if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) {
Criteria<String> criteria = new Criteria<>();
criteria.setAs(jsonNode.asText());
this.label = criteria;
} else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<String>>() {});
this.label = reader.readValue(jsonNode);
}
}
public void setLabel(String label) {
@ -104,9 +111,21 @@ public class ProjectCriteria {
this.creator = creator;
}
public ProjectQuery getQuery(ProjectDao dao) {
ProjectQuery query = new ProjectQuery(dao);
protected List<String> buildFields(String path) {
Set<String> fields = new HashSet<>();
path = path != null && !path.isEmpty() ? path + "." : "";
if (this.creator != null) fields.addAll(this.creator.buildFields(path + "creationUser"));
if (this.id != null) fields.add(path + this.id.getAs());
if (this.label != null) fields.add(path + this.label.getAs());
if (!fields.contains(path + "id")) fields.add(path + "id");
return new LinkedList<>(fields);
}
public ProjectQuery buildQuery(DatabaseRepository dao) {
List<String> fields = this.buildFields("");
ProjectQuery query = new ProjectQuery(dao.getProjectDao(), fields);
query.setId(this.id.getValue());
if (this.creator != null) query.setUserQuery(this.creator.buildQuery(dao));
return query;
}
}

View File

@ -6,14 +6,15 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import eu.eudat.criteria.entities.Criteria;
import eu.eudat.data.dao.entities.UserInfoDao;
import eu.eudat.logic.services.operations.DatabaseRepository;
import eu.eudat.query.UserQuery;
import java.io.IOException;
import java.util.UUID;
import java.util.*;
public class UserCriteria {
private Criteria<UUID> id;
private Criteria<String> email;
public Criteria<UUID> getId() {
return id;
@ -25,14 +26,41 @@ public class UserCriteria {
criteria.setAs(jsonNode.asText());
this.id = criteria;
} else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<UUID>>() {});
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<UUID>>() {
});
this.id = reader.readValue(jsonNode);
}
}
public UserQuery getQuery(UserInfoDao dao) {
UserQuery query = new UserQuery(dao);
query.setId(this.id.getValue());
public Criteria<String> getEmail() {
return email;
}
public void setEmail(JsonNode jsonNode) throws IOException {
if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) {
Criteria<String> criteria = new Criteria<>();
criteria.setAs(jsonNode.asText());
this.email = criteria;
} else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) {
ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Criteria<String>>() {
});
this.email = reader.readValue(jsonNode);
}
}
protected List<String> buildFields(String path) {
Set<String> fields = new HashSet<>();
path = path != null && !path.isEmpty() ? path + "." : "";
if (this.id != null) fields.add(path + this.id.getAs());
if (this.email != null) fields.add(path + this.email.getAs());
if (!fields.contains(path + "id")) fields.add(path + "id");
return new LinkedList<>(fields);
}
public UserQuery buildQuery(DatabaseRepository dao) {
List<String> fields = this.buildFields("");
UserQuery query = new UserQuery(dao.getUserInfoDao(), fields);
if (this.id != null) query.setId(this.id.getValue());
return query;
}
}