blob: 366546e3223f669df0e4adf39f278b1e27e9bf62 [file] [log] [blame]
margaretha38d530e2017-07-11 19:06:50 +02001package de.ids_mannheim.korap.dao;
2
margarethae353dfa2017-07-18 19:23:29 +02003import java.util.List;
4
5import javax.persistence.EntityManager;
6import javax.persistence.PersistenceContext;
7import javax.persistence.Query;
8import javax.persistence.criteria.CriteriaBuilder;
9import javax.persistence.criteria.CriteriaQuery;
10import javax.persistence.criteria.Predicate;
11import javax.persistence.criteria.Root;
12
margarethae353dfa2017-07-18 19:23:29 +020013import org.springframework.stereotype.Component;
14
margarethae353dfa2017-07-18 19:23:29 +020015import de.ids_mannheim.korap.entity.AnnotationPair;
margaretha38d530e2017-07-11 19:06:50 +020016
margaretha38d530e2017-07-11 19:06:50 +020017
18/**
margarethae353dfa2017-07-18 19:23:29 +020019 * AnnotationDao manages SQL queries regarding annotations including
20 * foundry and layer pairs.
margaretha38d530e2017-07-11 19:06:50 +020021 *
22 * @author margaretha
23 *
24 */
margarethae353dfa2017-07-18 19:23:29 +020025@Component
margaretha38d530e2017-07-11 19:06:50 +020026public class AnnotationDao {
27
margarethae353dfa2017-07-18 19:23:29 +020028 @PersistenceContext
29 private EntityManager entityManager;
margaretha38d530e2017-07-11 19:06:50 +020030
margarethae353dfa2017-07-18 19:23:29 +020031
32 /**
margarethaa14f1c22017-07-19 18:51:04 +020033 * Retrieves all foundry-layer pairs.
margarethae353dfa2017-07-18 19:23:29 +020034 *
margarethaa14f1c22017-07-19 18:51:04 +020035 * @return a list of foundry-layer pairs.
margarethae353dfa2017-07-18 19:23:29 +020036 */
37 public List<AnnotationPair> getAllFoundryLayerPairs () {
38 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
margarethaa14f1c22017-07-19 18:51:04 +020039 CriteriaQuery<AnnotationPair> query =
40 criteriaBuilder.createQuery(AnnotationPair.class);
margarethae353dfa2017-07-18 19:23:29 +020041 Root<AnnotationPair> annotationPair = query.from(AnnotationPair.class);
42 annotationPair.fetch("annotation1");
43 annotationPair.fetch("annotation2");
44 query.select(annotationPair);
45 Query q = entityManager.createQuery(query);
46 return q.getResultList();
margaretha38d530e2017-07-11 19:06:50 +020047 }
margarethae353dfa2017-07-18 19:23:29 +020048
49
50 /**
margarethaa14f1c22017-07-19 18:51:04 +020051 * Retrieves foundry-layer pairs and their values for the given
52 * foundry and layer. If layer is empty, retrieves data for all
53 * layer in the given foundry. If foundry is empty, retrieves data
54 * for all foundry and layer pairs.
margarethae353dfa2017-07-18 19:23:29 +020055 *
margaretha50179c82017-07-20 15:36:05 +020056 * @param foundry
57 * a foundry code
58 * @param layer
59 * a layer code
margarethaa14f1c22017-07-19 18:51:04 +020060 * @return a list of foundry-layer pairs.
margarethae353dfa2017-07-18 19:23:29 +020061 */
margarethaa14f1c22017-07-19 18:51:04 +020062 public List<AnnotationPair> getAnnotationDescriptions (String foundry,
63 String layer) {
margaretha50179c82017-07-20 15:36:05 +020064
margarethae353dfa2017-07-18 19:23:29 +020065 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
margarethae353dfa2017-07-18 19:23:29 +020066 CriteriaQuery<Object> query = criteriaBuilder.createQuery();
margarethae353dfa2017-07-18 19:23:29 +020067 Root<AnnotationPair> annotationPair = query.from(AnnotationPair.class);
margarethaa14f1c22017-07-19 18:51:04 +020068 annotationPair.fetch("annotation1");
69 annotationPair.fetch("annotation2");
70 annotationPair.fetch("values");
margaretha50179c82017-07-20 15:36:05 +020071
72 // EM: Hibernate bug in join n:m (see AnnotationPair.values).
73 // There should not be any redundant AnnotationPair.
74 // The redundancy can be alsp avoided with fetch=FetchType.EAGER
75 // because Hibernate does 2 selects.
76 query.distinct(true);
margarethaa14f1c22017-07-19 18:51:04 +020077 query = query.select(annotationPair);
margaretha50179c82017-07-20 15:36:05 +020078
margarethaa14f1c22017-07-19 18:51:04 +020079 if (!foundry.isEmpty()) {
80 Predicate foundryPredicate = criteriaBuilder.equal(
81 annotationPair.get("annotation1").get("code"), foundry);
82 if (layer.isEmpty() || layer.equals("*")) {
83 query.where(foundryPredicate);
84 }
85 else {
86 Predicate layerPredicate = criteriaBuilder.equal(
87 annotationPair.get("annotation2").get("code"), layer);
88 Predicate andPredicate =
89 criteriaBuilder.and(foundryPredicate, layerPredicate);
90 query.where(andPredicate);
91 }
92 }
93
margarethae353dfa2017-07-18 19:23:29 +020094 Query q = entityManager.createQuery(query);
95 return q.getResultList();
96 }
margaretha38d530e2017-07-11 19:06:50 +020097}