/**Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH * * This file is part of easyrec. * * easyrec is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * easyrec is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with easyrec. If not, see <http://www.gnu.org/licenses/>. */ package org.easyrec.store.dao.domain.impl; import org.easyrec.model.core.RecommendationVO; import org.easyrec.model.core.transfer.TimeConstraintVO; import org.easyrec.service.domain.TypeMappingService; import org.easyrec.store.dao.core.RecommendationDAO; import org.easyrec.store.dao.core.RecommendedItemDAO; import org.easyrec.store.dao.domain.TypedRecommendationDAO; import org.easyrec.store.dao.impl.AbstractBaseRecommendationDAOMysqlImpl; import org.easyrec.utils.spring.store.ResultSetIteratorMysql; import org.easyrec.utils.spring.store.dao.DaoUtils; import org.easyrec.utils.spring.store.dao.annotation.DAO; import org.easyrec.utils.spring.store.service.sqlscript.SqlScriptService; import org.springframework.jdbc.core.RowMapper; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.Iterator; /** * This class provides a typed implementation of the {@link org.easyrec.store.dao.domain.TypedRecommendationDAO} interface. * <p/> * <p><b>Company: </b> * SAT, Research Studios Austria</p> * <p/> * <p><b>Copyright: </b> * (c) 2007</p> * <p/> * <p><b>last modified:</b><br/> * $Author: dmann $<br/> * $Date: 2011-12-20 15:22:22 +0100 (Di, 20 Dez 2011) $<br/> * $Revision: 18685 $</p> * * @author Roman Cerny */ @DAO public class TypedRecommendationDAOMysqlImpl extends AbstractBaseRecommendationDAOMysqlImpl<RecommendationVO<Integer, String>> implements TypedRecommendationDAO { // members private TypedRecommendationVORowMapper recommendationVORowMapper = new TypedRecommendationVORowMapper(); private RecommendationDAO recommendationDAO; private RecommendedItemDAO recommendedItemDAO; private TypeMappingService typeMappingService; // constructor public TypedRecommendationDAOMysqlImpl(DataSource dataSource, RecommendationDAO recommendationDAO, RecommendedItemDAO recommendedItemDAO, TypeMappingService typeMappingService, SqlScriptService sqlScriptService) { super(sqlScriptService); setDataSource(dataSource); this.recommendationDAO = recommendationDAO; this.recommendedItemDAO = recommendedItemDAO; this.typeMappingService = typeMappingService; // output connection information if (logger.isInfoEnabled()) { try { logger.info(DaoUtils.getDatabaseURLAndUserName(dataSource)); } catch (Exception e) { logger.error(e); } } } // abstract (generic) method implementation of 'AbstractBaseRecommendationDAOMysqlImpl<TypedRecommendationVO>' @Override public int insertRecommendation( RecommendationVO<Integer, String> typedRecommendation) { Integer tenantId = typedRecommendation.getTenant(); if (tenantId == null) { throw new IllegalArgumentException("tenant not specified, can not retrieve type mapping without tenant"); } return recommendationDAO .insertRecommendation(typeMappingService.convertTypedRecommendationVO(tenantId, typedRecommendation)); } @Override public RecommendationVO<Integer, String> loadRecommendation( Integer recommendationId) { RecommendationVO<Integer, Integer> loadedRecommendation = recommendationDAO .loadRecommendation(recommendationId); Integer tenantId = loadedRecommendation.getTenant(); if (tenantId == null) { throw new IllegalArgumentException("tenant not specified, can not retrieve type mapping without tenant"); } return typeMappingService.convertRecommendationVO(tenantId, loadedRecommendation); } @Override public Iterator<RecommendationVO<Integer, String>> getRecommendationIterator( int bulkSize) { return new ResultSetIteratorMysql<RecommendationVO<Integer, String>>( getDataSource(), bulkSize, getRecommendationIteratorQueryString(), recommendationVORowMapper); } @Override public Iterator<RecommendationVO<Integer, String>> getRecommendationIterator( int bulkSize, TimeConstraintVO timeConstraints) { if (timeConstraints == null || timeConstraints.getDateFrom() == null && timeConstraints.getDateTo() == null) { return getRecommendationIterator(bulkSize); } Object[] args = new Object[1]; int[] argTypes = {Types.TIMESTAMP}; DaoUtils.ArgsAndTypesHolder holder = new DaoUtils.ArgsAndTypesHolder(args, argTypes); String s = getRecommendationIteratorQueryString(timeConstraints, holder); return new ResultSetIteratorMysql<RecommendationVO<Integer, String>>( getDataSource(), bulkSize, s, holder.getArgs(), holder.getArgTypes(), recommendationVORowMapper); } ////////////////////////////////////////////////////////////////////////////// // private inner classes private class TypedRecommendationVORowMapper implements RowMapper<RecommendationVO<Integer, String>> { public RecommendationVO<Integer, String> mapRow(ResultSet rs, int rowNum) throws SQLException { Integer tenantId = DaoUtils.getInteger(rs, DEFAULT_TENANT_COLUMN_NAME); if (tenantId == null) { throw new IllegalArgumentException( "tenant not specified, can not retrieve type mapping without tenant"); } return new RecommendationVO<Integer, String>( DaoUtils.getInteger(rs, DEFAULT_ID_COLUMN_NAME), tenantId, DaoUtils.getInteger(rs, DEFAULT_USER_COLUMN_NAME), DaoUtils.getInteger(rs, DEFAULT_QUERIED_ITEM_COLUMN_NAME), typeMappingService .getItemTypeById(tenantId, DaoUtils.getInteger(rs, DEFAULT_QUERIED_ITEM_TYPE_COLUMN_NAME)), typeMappingService.getAssocTypeById(tenantId, DaoUtils.getInteger(rs, DEFAULT_QUERIED_ASSOC_TYPE_COLUMN_NAME)), typeMappingService .getActionTypeById(tenantId, DaoUtils.getInteger(rs, DEFAULT_RELATED_ACTION_TYPE_COLUMN_NAME)), DaoUtils.getStringIfPresent(rs, DEFAULT_RECOMMENDATION_STRATEGY_COLUMN_NAME), DaoUtils.getStringIfPresent(rs, DEFAULT_EXPLANATION_COLUMN_NAME), DaoUtils.getDate(rs, DEFAULT_RECOMMENDATION_TIME_COLUMN_NAME), typeMappingService .convertListOfRecommendedItemVOs(tenantId, recommendedItemDAO .getRecommendedItemsOfRecommendation(DaoUtils.getInteger(rs, DEFAULT_ID_COLUMN_NAME)))); } } }