/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.dao;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.sql.JoinType;
import org.hoteia.qalingo.core.domain.Market;
import org.hoteia.qalingo.core.domain.MarketArea;
import org.hoteia.qalingo.core.domain.MarketPlace;
import org.hoteia.qalingo.core.fetchplan.FetchPlan;
import org.hoteia.qalingo.core.fetchplan.market.FetchPlanGraphMarket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
@Repository("marketDao")
public class MarketDao extends AbstractGenericDao {
private final Logger logger = LoggerFactory.getLogger(getClass());
// MARKET PLACE
public MarketPlace getDefaultMarketPlace(Object... params) {
Criteria criteria = createDefaultCriteria(MarketPlace.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarketPlace(criteria, params);
criteria.add(Restrictions.eq("isDefault", true));
MarketPlace marketPlace = (MarketPlace) criteria.uniqueResult();
if(marketPlace != null){
marketPlace.setFetchPlan(fetchPlan);
}
return marketPlace;
}
public MarketPlace getMarketPlaceById(final Long marketPlaceId, Object... params) {
Criteria criteria = createDefaultCriteria(MarketPlace.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarketPlace(criteria, params);
criteria.add(Restrictions.eq("id", marketPlaceId));
MarketPlace marketPlace = (MarketPlace) criteria.uniqueResult();
if(marketPlace != null){
marketPlace.setFetchPlan(fetchPlan);
}
return marketPlace;
}
public MarketPlace getMarketPlaceByCode(final String code, Object... params) {
Criteria criteria = createDefaultCriteria(MarketPlace.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarketPlace(criteria, params);
criteria.add(Restrictions.eq("code", handleCodeValue(code)));
MarketPlace marketPlace = (MarketPlace) criteria.uniqueResult();
if(marketPlace != null){
marketPlace.setFetchPlan(fetchPlan);
}
return marketPlace;
}
public List<MarketPlace> findMarketPlaces(Object... params) {
Criteria criteria = createDefaultCriteria(MarketPlace.class);
handleSpecificFetchModeMarketPlace(criteria, params);
criteria.addOrder(Order.asc("code"));
@SuppressWarnings("unchecked")
List<MarketPlace> marketPlaces = criteria.list();
return marketPlaces;
}
public MarketPlace saveOrUpdateMarketPlace(final MarketPlace marketPlace) {
if(marketPlace.getDateCreate() == null){
marketPlace.setDateCreate(new Date());
}
marketPlace.setDateUpdate(new Date());
if (marketPlace.getId() != null) {
if(em.contains(marketPlace)){
em.refresh(marketPlace);
}
MarketPlace mergedMarketPlace = em.merge(marketPlace);
em.flush();
return mergedMarketPlace;
} else {
em.persist(marketPlace);
return marketPlace;
}
}
public void deleteMarketPlace(final MarketPlace marketPlace) {
em.remove(em.contains(marketPlace) ? marketPlace : em.merge(marketPlace));
}
protected FetchPlan handleSpecificFetchModeMarketPlace(Criteria criteria, Object... params) {
if (params != null && params.length > 0) {
return super.handleSpecificFetchMode(criteria, params);
} else {
return super.handleSpecificFetchMode(criteria, FetchPlanGraphMarket.defaultMarketPlaceFetchPlan());
}
}
// MARKET
public Market getDefaultMarket(Object... params) {
Criteria criteria = createDefaultCriteria(Market.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarket(criteria, params);
criteria.add(Restrictions.eq("isDefault", true));
Market market = (Market) criteria.uniqueResult();
if(market != null){
market.setFetchPlan(fetchPlan);
}
return market;
}
public Market getMarketById(final Long marketId, Object... params) {
Criteria criteria = createDefaultCriteria(Market.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarket(criteria, params);
criteria.add(Restrictions.eq("id", marketId));
Market market = (Market) criteria.uniqueResult();
if(market != null){
market.setFetchPlan(fetchPlan);
}
return market;
}
public Market getMarketByCode(final String code, Object... params) {
Criteria criteria = createDefaultCriteria(Market.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarket(criteria, params);
criteria.add(Restrictions.eq("code", handleCodeValue(code)));
Market market = (Market) criteria.uniqueResult();
if(market != null){
market.setFetchPlan(fetchPlan);
}
return market;
}
public List<Market> findMarkets(Object... params) {
Criteria criteria = createDefaultCriteria(Market.class);
handleSpecificFetchModeMarket(criteria, params);
criteria.addOrder(Order.asc("code"));
@SuppressWarnings("unchecked")
List<Market> markets = criteria.list();
return markets;
}
public List<Market> getMarketsByMarketPlaceCode(final String marketPlaceCode, Object... params) {
Criteria criteria = createDefaultCriteria(Market.class);
handleSpecificFetchModeMarket(criteria, params);
criteria.createAlias("marketPlace", "mp", JoinType.LEFT_OUTER_JOIN);
criteria.add( Restrictions.eq("mp.code", handleCodeValue(marketPlaceCode)));
criteria.addOrder(Order.asc("code"));
@SuppressWarnings("unchecked")
List<Market> markets = criteria.list();
return markets;
}
public Market saveOrUpdateMarket(final Market market) {
if(market.getDateCreate() == null){
market.setDateCreate(new Date());
}
market.setDateUpdate(new Date());
if (market.getId() != null) {
if(em.contains(market)){
em.refresh(market);
}
Market mergedMarket = em.merge(market);
em.flush();
return mergedMarket;
} else {
em.persist(market);
return market;
}
}
public void deleteMarket(final Market market) {
em.remove(em.contains(market) ? market : em.merge(market));
}
protected FetchPlan handleSpecificFetchModeMarket(Criteria criteria, Object... params) {
if (params != null && params.length > 0) {
return super.handleSpecificFetchMode(criteria, params);
} else {
return super.handleSpecificFetchMode(criteria, FetchPlanGraphMarket.defaultMarketFetchPlan());
}
}
// MARKET AREA
public MarketArea getMarketAreaById(final Long marketAreaId, Object... params) {
Criteria criteria = createDefaultCriteria(MarketArea.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarketArea(criteria, params);
criteria.add(Restrictions.eq("id", marketAreaId));
MarketArea marketArea = (MarketArea) criteria.uniqueResult();
if(marketArea != null){
marketArea.setFetchPlan(fetchPlan);
}
return marketArea;
}
public MarketArea getMarketAreaByCode(final String code, Object... params) {
Criteria criteria = createDefaultCriteria(MarketArea.class);
FetchPlan fetchPlan = handleSpecificFetchModeMarketArea(criteria, params);
criteria.add(Restrictions.eq("code", handleCodeValue(code)));
MarketArea marketArea = (MarketArea) criteria.uniqueResult();
if(marketArea != null){
marketArea.setFetchPlan(fetchPlan);
}
return marketArea;
}
public List<Long> findAllMarketAreaIds(Object... params) {
Criteria criteria = createDefaultCriteria(MarketArea.class);
criteria.setProjection(Projections.property("id"));
@SuppressWarnings("unchecked")
List<Long> marketAreaIds = criteria.list();
return marketAreaIds;
}
public List<MarketArea> findMarketAreaByGeolocCountryCode(final String countryCode, Object... params) {
Criteria criteria = createDefaultCriteria(MarketArea.class);
handleSpecificFetchModeMarketArea(criteria, params);
criteria.add(Restrictions.eq("geolocCountryCode", countryCode));
@SuppressWarnings("unchecked")
List<MarketArea> marketAreas = criteria.list();
return marketAreas;
}
public List<MarketArea> findMarketAreaOpenedByGeolocCountryCode(final String countryCode, Object... params) {
Criteria criteria = createDefaultCriteria(MarketArea.class);
handleSpecificFetchModeMarketArea(criteria, params);
criteria.add(Restrictions.eq("opened", true));
criteria.add(Restrictions.eq("geolocCountryCode", countryCode));
@SuppressWarnings("unchecked")
List<MarketArea> marketAreas = criteria.list();
return marketAreas;
}
public MarketArea saveOrUpdateMarketArea(final MarketArea marketArea) {
if(marketArea.getDateCreate() == null){
marketArea.setDateCreate(new Date());
}
marketArea.setDateUpdate(new Date());
if (marketArea.getId() != null) {
if(em.contains(marketArea)){
em.refresh(marketArea);
}
MarketArea mergedMarketArea = em.merge(marketArea);
em.flush();
return mergedMarketArea;
} else {
em.persist(marketArea);
return marketArea;
}
}
public void deleteMarketArea(final MarketArea marketArea) {
em.remove(em.contains(marketArea) ? marketArea : em.merge(marketArea));
}
protected FetchPlan handleSpecificFetchModeMarketArea(Criteria criteria, Object... params) {
if (params != null && params.length > 0) {
return super.handleSpecificFetchMode(criteria, params);
} else {
return super.handleSpecificFetchMode(criteria, FetchPlanGraphMarket.defaultMarketAreaFetchPlan());
}
}
}