/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package edu.harvard.iq.dataverse; import java.util.List; import javax.ejb.Stateless; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TypedQuery; /** * * @author xyang */ @Stateless @Named public class DatasetFieldServiceBean implements java.io.Serializable { @PersistenceContext(unitName = "VDCNet-ejbPU") private EntityManager em; private static final String NAME_QUERY = "SELECT dsfType from DatasetFieldType dsfType where dsfType.name= :fieldName"; public List<DatasetFieldType> findAllAdvancedSearchFieldTypes() { return em.createQuery("select object(o) from DatasetFieldType as o where o.advancedSearchFieldType = true and o.title != '' order by o.id").getResultList(); } public List<DatasetFieldType> findAllFacetableFieldTypes() { return em.createNamedQuery("DatasetFieldType.findAllFacetable", DatasetFieldType.class) .getResultList(); } public List<DatasetFieldType> findFacetableFieldTypesByMetadataBlock(Long metadataBlockId) { return em.createNamedQuery("DatasetFieldType.findFacetableByMetadaBlock", DatasetFieldType.class) .setParameter("metadataBlockId", metadataBlockId) .getResultList(); } public List<DatasetFieldType> findAllRequiredFields() { return em.createQuery("select object(o) from DatasetFieldType as o where o.required = true order by o.id").getResultList(); } public List<DatasetFieldType> findAllOrderedById() { return em.createQuery("select object(o) from DatasetFieldType as o order by o.id").getResultList(); } public List<DatasetFieldType> findAllOrderedByName() { return em.createQuery("select object(o) from DatasetFieldType as o order by o.name").getResultList(); } public DatasetFieldType find(Object pk) { return (DatasetFieldType) em.find(DatasetFieldType.class, pk); } public DatasetFieldType findByName(String name) { try { return (DatasetFieldType) em.createQuery(NAME_QUERY).setParameter("fieldName", name).getSingleResult(); } catch (NoResultException e) { return null; } } /** * Gets the dataset field type, or returns {@code null}. Does not throw * exceptions. * * @param name the name do the field type * @return the field type, or {@code null} * @see #findByName(java.lang.String) */ public DatasetFieldType findByNameOpt(String name) { try { return em.createNamedQuery("DatasetFieldType.findByName", DatasetFieldType.class) .setParameter("name", name) .getSingleResult(); } catch (NoResultException nre) { return null; } } /* * Similar method for looking up foreign metadata field mappings, for metadata * imports. for these the uniquness of names isn't guaranteed (i.e., there * can be a field "author" in many different formats that we want to support), * so these have to be looked up by both the field name and the name of the * foreign format. */ public ForeignMetadataFieldMapping findFieldMapping(String formatName, String pathName) { try { return em.createNamedQuery("ForeignMetadataFieldMapping.findByPath", ForeignMetadataFieldMapping.class) .setParameter("formatName", formatName) .setParameter("xPath", pathName) .getSingleResult(); } catch (NoResultException nre) { return null; } // TODO: cache looked up results. } public ControlledVocabularyValue findControlledVocabularyValue(Object pk) { return (ControlledVocabularyValue) em.find(ControlledVocabularyValue.class, pk); } /** * @param dsft The DatasetFieldType in which to look up a * ControlledVocabularyValue. * @param strValue String value that may exist in a controlled vocabulary of * the provided DatasetFieldType. * @param lenient should we accept alternate spellings for value from mapping table * * @return The ControlledVocabularyValue found or null. */ public ControlledVocabularyValue findControlledVocabularyValueByDatasetFieldTypeAndStrValue(DatasetFieldType dsft, String strValue, boolean lenient) { TypedQuery<ControlledVocabularyValue> typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.strValue = :strvalue AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class); typedQuery.setParameter("strvalue", strValue); typedQuery.setParameter("dsft", dsft); try { ControlledVocabularyValue cvv = typedQuery.getSingleResult(); return cvv; } catch (NoResultException | NonUniqueResultException ex) { if (lenient) { // if the value isn't found, check in the list of alternate values for this datasetFieldType TypedQuery<ControlledVocabAlternate> alternateQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabAlternate as o WHERE o.strValue = :strvalue AND o.datasetFieldType = :dsft", ControlledVocabAlternate.class); alternateQuery.setParameter("strvalue", strValue); alternateQuery.setParameter("dsft", dsft); try { ControlledVocabAlternate alternateValue = alternateQuery.getSingleResult(); return alternateValue.getControlledVocabularyValue(); } catch (NoResultException | NonUniqueResultException ex2) { return null; } } else { return null; } } } public ControlledVocabAlternate findControlledVocabAlternateByControlledVocabularyValueAndStrValue(ControlledVocabularyValue cvv, String strValue){ TypedQuery<ControlledVocabAlternate> typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabAlternate AS o WHERE o.strValue = :strvalue AND o.controlledVocabularyValue = :cvv", ControlledVocabAlternate.class); typedQuery.setParameter("strvalue", strValue); typedQuery.setParameter("cvv", cvv); try { ControlledVocabAlternate alt = typedQuery.getSingleResult(); return alt; } catch (NoResultException e) { return null; } catch (NonUniqueResultException ex){ List results = typedQuery.getResultList(); return (ControlledVocabAlternate) results.get(0); } } /** * @param dsft The DatasetFieldType in which to look up a * ControlledVocabularyValue. * @param strIdentiifer String Identifier that may exist in a controlled vocabulary of * the provided DatasetFieldType. * * @return The ControlledVocabularyValue found or null. */ public ControlledVocabularyValue findControlledVocabularyValueByDatasetFieldTypeAndIdentifier (DatasetFieldType dsft, String identifier) { TypedQuery<ControlledVocabularyValue> typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.identifier = :identifier AND o.datasetFieldType = :dsft", ControlledVocabularyValue.class); typedQuery.setParameter("identifier", identifier); typedQuery.setParameter("dsft", dsft); try { ControlledVocabularyValue cvv = typedQuery.getSingleResult(); return cvv; } catch (NoResultException | NonUniqueResultException ex) { return null; } } // return singleton NA Controled Vocabulary Value public ControlledVocabularyValue findNAControlledVocabularyValue() { TypedQuery<ControlledVocabularyValue> typedQuery = em.createQuery("SELECT OBJECT(o) FROM ControlledVocabularyValue AS o WHERE o.datasetFieldType is null AND o.strValue = :strvalue", ControlledVocabularyValue.class); typedQuery.setParameter("strvalue", DatasetField.NA_VALUE); return typedQuery.getSingleResult(); } public DatasetFieldType save(DatasetFieldType dsfType) { return em.merge(dsfType); } public MetadataBlock save(MetadataBlock mdb) { return em.merge(mdb); } public ControlledVocabularyValue save(ControlledVocabularyValue cvv) { return em.merge(cvv); } public ControlledVocabAlternate save(ControlledVocabAlternate alt) { return em.merge(alt); } }