package org.fluxtream.connectors.sms_backup;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.fluxtream.core.TimeInterval;
import org.fluxtream.core.connectors.Connector;
import org.fluxtream.core.connectors.ObjectType;
import org.fluxtream.core.domain.AbstractFacet;
import org.fluxtream.core.domain.ApiKey;
import org.fluxtream.core.domain.PhotoFacetFinderStrategy;
import org.fluxtream.core.domain.TagFilter;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Component;
@Component
public class SmsBackupPhotoFacetFinderStrategy implements PhotoFacetFinderStrategy {
@PersistenceContext
private EntityManager em;
@Override
public List<AbstractFacet> findAll(final ApiKey apiKey, final ObjectType objectType, final TimeInterval timeInterval) {
return findAll(apiKey, objectType, timeInterval, null);
}
@Override
public List<AbstractFacet> findBefore(final ApiKey apiKey, final ObjectType objectType, final long timeInMillis, final int desiredCount) {
return findBefore(apiKey, objectType, timeInMillis, desiredCount, null);
}
@Override
public List<AbstractFacet> findAfter(final ApiKey apiKey, final ObjectType objectType, final long timeInMillis, final int desiredCount) {
return findAfter(apiKey, objectType, timeInMillis, desiredCount, null);
}
@Override
public List<AbstractFacet> findAll(final ApiKey apiKey, final ObjectType objectType, final TimeInterval timeInterval, @Nullable final TagFilter tagFilter) {
Query query = getQuery(apiKey,objectType,timeInterval.getStart(),timeInterval.getEnd(),null,null,tagFilter);
return query.getResultList();
}
@Override
public List<AbstractFacet> findBefore(final ApiKey apiKey, final ObjectType objectType, final long timeInMillis, final int desiredCount, @Nullable final TagFilter tagFilter) {
Query query = getQuery(apiKey,objectType,null,timeInMillis,desiredCount,"ORDER BY facet.start DESC",tagFilter);
return query.getResultList();
}
@Override
public List<AbstractFacet> findAfter(final ApiKey apiKey, final ObjectType objectType, final long timeInMillis, final int desiredCount, @Nullable final TagFilter tagFilter) {
Query query = getQuery(apiKey,objectType,timeInMillis,null,desiredCount,"ORDER BY facet.start ASC",tagFilter);
return query.getResultList();
}
@Override
public AbstractFacet findOldest(final ApiKey apiKey, final ObjectType objectType) {
Query query = getQuery(apiKey,objectType,null,null,1,"ORDER BY facet.start ASC",null);
List facets = query.getResultList();
if (facets.isEmpty())
return null;
return (AbstractFacet) facets.get(0);
}
@Override
public AbstractFacet findLatest(final ApiKey apiKey, final ObjectType objectType) {
Query query = getQuery(apiKey,objectType,null,null,1,"ORDER BY facet.start DESC",null);
List facets = query.getResultList();
if (facets.isEmpty())
return null;
return (AbstractFacet) facets.get(0);
}
private Query getQuery(final ApiKey apiKey, final ObjectType objectType, @Nullable final Long startTime, @Nullable final Long endTime, @Nullable Integer limit, @Nullable String sortStatement, @Nullable final TagFilter tagFilter){
final Class<? extends AbstractFacet> facetClass = getFacetClass(apiKey.getConnector(), objectType);
final Entity entity = facetClass.getAnnotation(Entity.class);
String queryString = "SELECT facet FROM " + entity.name() + " facet WHERE facet.apiKeyId=" + apiKey.getId() +
" AND facet.hasAttachments=true AND facet.attachmentMimeTypes LIKE '%image%'";
if (startTime != null){
queryString += " AND facet.start>=" + startTime;
}
if (endTime != null)
queryString += " AND facet.end<=" + endTime;
if (tagFilter != null){
queryString += " AND (" + tagFilter.getWhereClause() + ")";
}
if (sortStatement != null){
queryString += " " + sortStatement;
}
if (limit != null){
queryString += " LIMIT " + limit;
}
return em.createQuery(queryString);
}
private Class<? extends AbstractFacet> getFacetClass(final Connector connector, final ObjectType objectType) {
return objectType != null ? objectType.facetClass() : connector.facetClass();
}
}