/**
  * Get count of available observation for this time series
  *
  * @param series Time series
  * @param request GetDataAvailability request
  * @param session Hibernate session
  * @return Count of available observations
  */
 private Long getCountFor(Series series, GetDataAvailabilityRequest request, Session session) {
   Criteria criteria =
       session
           .createCriteria(SeriesObservationInfo.class)
           .add(Restrictions.eq(AbstractObservation.DELETED, false));
   criteria.add(Restrictions.eq(SeriesObservationInfo.SERIES, series));
   if (request.isSetOfferings()) {
     criteria
         .createCriteria(SeriesObservationTime.OFFERINGS)
         .add(Restrictions.in(Offering.IDENTIFIER, request.getOfferings()));
   }
   criteria.setProjection(Projections.rowCount());
   return (Long) criteria.uniqueResult();
 }
 /**
  * Get time information from SeriesGetDataAvailability mapping
  *
  * @param seriesGetDataAvailabilityDAO Series GetDataAvailability DAO class
  * @param series Series to get information for
  * @param request
  * @param seriesMinMaxTransformer Hibernate result transformator for min/max time value
  * @param session Hibernate Session
  * @return Time period
  */
 private TimePeriod getTimePeriodFromSeriesGetDataAvailability(
     SeriesObservationTimeDAO seriesGetDataAvailabilityDAO,
     Series series,
     GetDataAvailabilityRequest request,
     SeriesMinMaxTransformer seriesMinMaxTransformer,
     Session session) {
   Criteria criteria =
       seriesGetDataAvailabilityDAO.getMinMaxTimeCriteriaForSeriesGetDataAvailabilityDAO(
           series, request.getOfferings(), session);
   criteria.setResultTransformer(seriesMinMaxTransformer);
   LOGGER.debug(
       "QUERY getTimePeriodFromSeriesObservation(series): {}",
       HibernateHelper.getSqlString(criteria));
   return (TimePeriod) criteria.uniqueResult();
 }
 /**
  * Get the result times for the timeseries
  *
  * @param seriesObservationDAO DAO
  * @param series time series
  * @param request GetDataAvailability request
  * @param session Hibernate session
  * @return List of result times
  * @throws OwsExceptionReport if the requested temporal filter is not supported
  */
 private List<TimeInstant> getResultTimesFromSeriesObservation(
     AbstractSeriesObservationDAO seriesObservationDAO,
     Series series,
     GetDataAvailabilityRequest request,
     Session session)
     throws OwsExceptionReport {
   Criterion filter = null;
   if (hasPhenomenonTimeFilter(request.getExtensions())) {
     filter = TemporalRestrictions.filter(getPhenomenonTimeFilter(request.getExtensions()));
   }
   List<Date> dateTimes =
       seriesObservationDAO.getResultTimesForSeriesObservation(
           series, request.getOfferings(), filter, session);
   List<TimeInstant> resultTimes = Lists.newArrayList();
   for (Date date : dateTimes) {
     resultTimes.add(new TimeInstant(date));
   }
   return resultTimes;
 }