blob: 2d849b68732ae111053401ed1d3169987611c945 [file] [log] [blame]
package de.ids_mannheim.korap.dao;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.constant.VirtualCorpusType;
import de.ids_mannheim.korap.utils.ParameterChecker;
import de.ids_mannheim.korap.entity.QueryReference;
import de.ids_mannheim.korap.entity.QueryReference_;
/**
* QueryReferenceDao manages database queries and transactions
* regarding query fragments, e.g. retrieving and storing queries
* for embedding in more complex queries.
*
* Based on VirtualCorpusDao.
*
* @author diewald
*
*/
@Transactional
@Repository
public class QueryReferenceDao {
@PersistenceContext
private EntityManager entityManager;
/**
* Create query reference and return ID.
* Does not support any access management yet
*/
public int createQuery(
String qName,
VirtualCorpusType type,
// CorpusAccess requiredAccess,
String koralQuery,
String definition,
String description,
String status,
String createdBy
) throws KustvaktException {
QueryReference q = new QueryReference();
q.setName(qName);
q.setType(type);
q.setKoralQuery(koralQuery);
q.setDefinition(definition);
q.setDescription(description);
q.setStatus(status);
q.setCreatedBy(createdBy);
// Maybe unused
q.setRequiredAccess("");
entityManager.persist(q);
return q.getId();
};
/**
* Retrieve a single query reference based on its name.
*/
public QueryReference retrieveQueryByName (String qName, String createdBy)
throws KustvaktException {
ParameterChecker.checkStringValue(createdBy, "createdBy");
ParameterChecker.checkStringValue(qName, "q");
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<QueryReference> query =
builder.createQuery(QueryReference.class);
Root<QueryReference> qref = query.from(QueryReference.class);
Predicate condition = builder.and(
builder.equal(qref.get(QueryReference_.createdBy),
createdBy),
builder.equal(qref.get(QueryReference_.name), qName));
query.select(qref);
query.where(condition);
Query q = entityManager.createQuery(query);
QueryReference qr = null;
try {
qr = (QueryReference) q.getSingleResult();
}
catch (NoResultException e) {
return null;
}
catch (NonUniqueResultException e) {
String refCode = createdBy + "/" + qName;
throw new KustvaktException(StatusCodes.NON_UNIQUE_RESULT_FOUND,
"Non unique result found for query: retrieve virtual corpus by name "
+ refCode,
String.valueOf(refCode), e);
}
return qr;
};
/**
* Remove a query reference from the database.
*/
public void deleteQueryReference (QueryReference q)
throws KustvaktException {
if (!entityManager.contains(q)) {
q = entityManager.merge(q);
}
entityManager.remove(q);
}
};