/** * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org> * Copyright (C) 2012 Google, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onebusaway.transit_data_federation.impl.reporting; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Property; import org.onebusaway.collections.tuple.T2; import org.onebusaway.collections.tuple.Tuples; import org.onebusaway.gtfs.model.AgencyAndId; import org.onebusaway.transit_data.model.problems.EProblemReportStatus; import org.onebusaway.transit_data.model.problems.ETripProblemGroupBy; import org.onebusaway.transit_data.model.problems.TripProblemReportQueryBean; import org.onebusaway.transit_data_federation.services.AgencyAndIdLibrary; import org.onebusaway.transit_data_federation.services.reporting.UserReportingDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Component; @Component class UserReportingDaoImpl implements UserReportingDao { private HibernateTemplate _template; @Autowired public void setSessionFactory(SessionFactory sessionFactory) { _template = new HibernateTemplate(sessionFactory); } @Override public void saveOrUpdate(Object record) { _template.saveOrUpdate(record); } @Override public void delete(Object entity) { _template.delete(entity); } @SuppressWarnings("unchecked") @Override public List<T2<AgencyAndId, Integer>> getStopProblemReportSummaries( String agencyId, long timeFrom, long timeTo, EProblemReportStatus status) { List<Object[]> records = null; if (status == null) { String[] names = {"agencyId", "timeFrom", "timeTo"}; Object[] values = {agencyId, timeFrom, timeTo}; records = _template.findByNamedQueryAndNamedParam( "stopProblemReportSummaries", names, values); } else { String[] names = {"agencyId", "timeFrom", "timeTo", "status"}; Object[] values = {agencyId, timeFrom, timeTo, status}; records = _template.findByNamedQueryAndNamedParam( "stopProblemReportSummariesWithStatus", names, values); } List<T2<AgencyAndId, Integer>> results = new ArrayList<T2<AgencyAndId, Integer>>( records.size()); for (Object[] record : records) { AgencyAndId stopId = (AgencyAndId) record[0]; Long count = (Long) record[1]; results.add(Tuples.tuple(stopId, count.intValue())); } return results; } @SuppressWarnings("unchecked") @Override public List<T2<Object, Integer>> getTripProblemReportSummaries( final TripProblemReportQueryBean query, final ETripProblemGroupBy groupBy) { List<Object[]> rows = _template.executeFind(new HibernateCallback<List<Object[]>>() { @Override public List<Object[]> doInHibernate(Session session) throws HibernateException, SQLException { Criteria c = session.createCriteria(TripProblemReportRecord.class); ProjectionList projections = Projections.projectionList(); projections.add(Projections.rowCount()); switch (groupBy) { case TRIP: projections.add(Projections.groupProperty("tripId.agencyId")); projections.add(Projections.groupProperty("tripId.id")); break; case STATUS: projections.add(Projections.groupProperty("status")); break; case LABEL: projections.add(Projections.groupProperty("label")); break; } c.setProjection(projections); addQueryToCriteria(query, c); return c.list(); } }); List<T2<Object, Integer>> results = new ArrayList<T2<Object, Integer>>( rows.size()); for (Object[] row : rows) { Integer count = (Integer) row[0]; Object key = getKeyForTripProblemReportSummariesRow(row, groupBy); results.add(Tuples.tuple(key, count.intValue())); } return results; } @SuppressWarnings("unchecked") public List<StopProblemReportRecord> getStopProblemReports(String agencyId, long timeFrom, long timeTo, EProblemReportStatus status) { if (status == null) { String[] names = {"agencyId", "timeFrom", "timeTo"}; Object[] values = {agencyId, timeFrom, timeTo}; return _template.findByNamedQueryAndNamedParam("stopProblemReports", names, values); } else { String[] names = {"agencyId", "timeFrom", "timeTo", "status"}; Object[] values = {agencyId, timeFrom, timeTo, status}; return _template.findByNamedQueryAndNamedParam( "stopProblemReportsWithStatus", names, values); } } @SuppressWarnings("unchecked") public List<TripProblemReportRecord> getTripProblemReports( final TripProblemReportQueryBean query) { return _template.executeFind(new HibernateCallback<List<TripProblemReportRecord>>() { @Override public List<TripProblemReportRecord> doInHibernate(Session session) throws HibernateException, SQLException { Criteria c = session.createCriteria(TripProblemReportRecord.class); addQueryToCriteria(query, c); c.addOrder(Order.asc("time")); return c.list(); } }); } @SuppressWarnings("unchecked") @Override public List<StopProblemReportRecord> getAllStopProblemReportsForStopId( AgencyAndId stopId) { return _template.findByNamedQueryAndNamedParam( "allStopProblemReportsForStopId", "stopId", stopId); } @SuppressWarnings("unchecked") @Override public List<TripProblemReportRecord> getAllTripProblemReportsForTripId( AgencyAndId tripId) { return _template.findByNamedQueryAndNamedParam( "allTripProblemReportsForTripId", "tripId", tripId); } @Override public StopProblemReportRecord getStopProblemRecordForId(long id) { return _template.get(StopProblemReportRecord.class, id); } @Override public TripProblemReportRecord getTripProblemRecordForId(long id) { return _template.get(TripProblemReportRecord.class, id); } @SuppressWarnings("unchecked") @Override public List<String> getAllTripProblemReportLabels() { return _template.findByNamedQuery("allTripProblemReportLabels"); } private Object getKeyForTripProblemReportSummariesRow(Object[] row, ETripProblemGroupBy groupBy) { switch (groupBy) { case TRIP: return new AgencyAndId((String) row[1], (String) row[2]); case STATUS: return row[1]; case LABEL: return row[1]; } throw new IllegalStateException("unhandled grouping: " + groupBy); } private void addQueryToCriteria(TripProblemReportQueryBean query, Criteria c) { if (query.getAgencyId() != null) { c.add(Property.forName("tripId.agencyId").eq(query.getAgencyId())); } if (query.getTripId() != null) { c.add(Property.forName("tripId").eq( AgencyAndIdLibrary.convertFromString(query.getTripId()))); } if (query.getTimeFrom() != 0) { c.add(Property.forName("time").ge(query.getTimeFrom())); } if (query.getTimeTo() != 0) { c.add(Property.forName("time").le(query.getTimeTo())); } if (query.getStatus() != null) { c.add(Property.forName("status").eq(query.getStatus())); } if (query.getLabel() != null) { c.add(Property.forName("label").eq(query.getLabel())); } } }