package com.activequant.dao.mybatis; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.log4j.Logger; import com.activequant.dao.mybatis.mapper.GenericRowMapper; import com.activequant.domainmodel.Instrument; import com.activequant.domainmodel.MarketDataInstrument; import com.activequant.interfaces.dao.IMarketDataInstrumentDao; public class MarketDataInstrumentDao extends GenericMapperDao<MarketDataInstrument> implements IMarketDataInstrumentDao { private Logger log = Logger.getLogger(MarketDataInstrumentDao.class); private static final String tableName = "MarketDataInstrument"; public MarketDataInstrumentDao(GenericRowMapper mapper, SqlSessionFactory s) { super(s, mapper, MarketDataInstrument.class, tableName); } public MarketDataInstrument[] findFor(Instrument instrument) { // dirty. would have to use a field mapper table to ensure that // INSTRUMENTID is always the same as in MarketDataInstrument. // trade-off. List<String> ids = mapper.findByString(tableName, "INSTRUMENTID", instrument.getId()); List<MarketDataInstrument> mdis = new ArrayList<MarketDataInstrument>(); for (String id : ids) { mdis.add(this.load(id)); } return mdis.toArray(new MarketDataInstrument[] {}); } public List<String> findIdsFor(String instrumentId){ List<String> ids = mapper.findByString(tableName, "INSTRUMENTID", instrumentId); return ids; } public MarketDataInstrument[] findForProvider(String providerId) { List<String> ids = mapper.findByString(tableName, "mdProvider".toUpperCase(), providerId); List<MarketDataInstrument> mdis = new ArrayList<MarketDataInstrument>(); for (String id : ids) { mdis.add(this.load(id)); } return mdis.toArray(new MarketDataInstrument[] {}); } public MarketDataInstrument findByProvId(String providerId, String provSpecInstId) { List<String> insts = mapper.findBy2StringVals(tableName, "MdProvider".toUpperCase(), providerId, "ProviderSpecificId".toUpperCase(), provSpecInstId); if (insts.size() > 1) { throw new RuntimeException("Ambigous! " + providerId + "/"+provSpecInstId); } if (insts.size() == 0) return null; String id = insts.get(0); MarketDataInstrument mdi = load(id); return mdi; } public int countForProvider(String providerId) { return countForAttributeValue("MDPROVIDER", providerId); } public MarketDataInstrument[] findForProvider(String providerId, int startIndex, int maxAmount) { List<String> ids = mapper.findByString(tableName, "mdProvider".toUpperCase(), providerId); List<MarketDataInstrument> mdis = new ArrayList<MarketDataInstrument>(); for (int i = startIndex; i < startIndex + maxAmount; i++) { if (ids.size() > i) mdis.add(this.load(ids.get(i))); } return mdis.toArray(new MarketDataInstrument[] {}); } public MarketDataInstrument[] findLike(String providerId, String provSpecInstId) { List<String> ids = mapper.findByString(tableName, "mdProvider".toUpperCase(), providerId); List<MarketDataInstrument> mdis = new ArrayList<MarketDataInstrument>(); for (int i = 0; i < ids.size(); i++) { MarketDataInstrument mdi = this.load(ids.get(i)); if (mdi.getProviderSpecificId().startsWith(provSpecInstId)) mdis.add(mdi); } return mdis.toArray(new MarketDataInstrument[] {}); } @Override public MarketDataInstrument findFor(String providerId, Instrument instrument) { if(instrument==null) { log.warn("Instrument is null. "); return null; } if(providerId==null) { log.warn("Provider ID is null. "); return null; } List<String> insts = mapper.findBy2StringVals(tableName, "MdProvider".toUpperCase(), providerId, "instrumentId".toUpperCase(), instrument.getId()); if (insts.size() > 1) { throw new RuntimeException("Ambigous!" + providerId + "/"+instrument.getId()); } if (insts.size() == 0){ log.warn("Did not find instrument " + instrument.getId() + " for provider " + providerId); return null; } String id = insts.get(0); MarketDataInstrument mdi = load(id); return mdi; } @Override public String[] getProviders() { return super.selectDistinctStringVal("MDPROVIDER"); } }