| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 1 | package de.ids_mannheim.korap.dao; |
| 2 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 3 | import java.util.List; |
| 4 | |
| 5 | import javax.persistence.EntityManager; |
| 6 | import javax.persistence.PersistenceContext; |
| 7 | import javax.persistence.Query; |
| 8 | import javax.persistence.criteria.CriteriaBuilder; |
| 9 | import javax.persistence.criteria.CriteriaQuery; |
| 10 | import javax.persistence.criteria.Predicate; |
| 11 | import javax.persistence.criteria.Root; |
| 12 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 13 | import org.springframework.stereotype.Component; |
| 14 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 15 | import de.ids_mannheim.korap.entity.AnnotationPair; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 16 | |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 17 | |
| 18 | /** |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 19 | * AnnotationDao manages SQL queries regarding annotations including |
| 20 | * foundry and layer pairs. |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 21 | * |
| 22 | * @author margaretha |
| 23 | * |
| 24 | */ |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 25 | @Component |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 26 | public class AnnotationDao { |
| 27 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 28 | @PersistenceContext |
| 29 | private EntityManager entityManager; |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 30 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 31 | |
| 32 | /** |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 33 | * Retrieves all foundry-layer pairs. |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 34 | * |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 35 | * @return a list of foundry-layer pairs. |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 36 | */ |
| 37 | public List<AnnotationPair> getAllFoundryLayerPairs () { |
| 38 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 39 | CriteriaQuery<AnnotationPair> query = |
| 40 | criteriaBuilder.createQuery(AnnotationPair.class); |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 41 | 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(); |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 47 | } |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 48 | |
| 49 | |
| 50 | /** |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 51 | * 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. |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 55 | * |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame^] | 56 | * @param foundry |
| 57 | * a foundry code |
| 58 | * @param layer |
| 59 | * a layer code |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 60 | * @return a list of foundry-layer pairs. |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 61 | */ |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 62 | public List<AnnotationPair> getAnnotationDescriptions (String foundry, |
| 63 | String layer) { |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame^] | 64 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 65 | CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 66 | CriteriaQuery<Object> query = criteriaBuilder.createQuery(); |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 67 | Root<AnnotationPair> annotationPair = query.from(AnnotationPair.class); |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 68 | annotationPair.fetch("annotation1"); |
| 69 | annotationPair.fetch("annotation2"); |
| 70 | annotationPair.fetch("values"); |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame^] | 71 | |
| 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); |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 77 | query = query.select(annotationPair); |
| margaretha | 50179c8 | 2017-07-20 15:36:05 +0200 | [diff] [blame^] | 78 | |
| margaretha | a14f1c2 | 2017-07-19 18:51:04 +0200 | [diff] [blame] | 79 | 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 | |
| margaretha | e353dfa | 2017-07-18 19:23:29 +0200 | [diff] [blame] | 94 | Query q = entityManager.createQuery(query); |
| 95 | return q.getResultList(); |
| 96 | } |
| margaretha | 38d530e | 2017-07-11 19:06:50 +0200 | [diff] [blame] | 97 | } |