diff --git a/common/src/main/java/com/cyanspring/common/staticdata/RefDataFactory.java b/common/src/main/java/com/cyanspring/common/staticdata/RefDataFactory.java index daceeee23..6737694b6 100644 --- a/common/src/main/java/com/cyanspring/common/staticdata/RefDataFactory.java +++ b/common/src/main/java/com/cyanspring/common/staticdata/RefDataFactory.java @@ -28,7 +28,7 @@ public class RefDataFactory extends RefDataService { private String strategyPack = "com.cyanspring.common.staticdata.strategy"; private String refDataTemplatePath; private List refDataTemplateList; - private Map> refDataTemplateMap = new HashMap>(); + private Map>> templateMap = new HashMap<>(); // exchange/category/refdatas private Map qMap; @SuppressWarnings("unchecked") @@ -54,15 +54,34 @@ public void init() throws Exception { private void buildTemplateMap(List refDataTemplateList) { for (RefData ref : refDataTemplateList) { - String spotName = ref.getCategory(); - List list = refDataTemplateMap.get(spotName); - if (list == null) { - list = new ArrayList<>(); - refDataTemplateMap.put(spotName, list); + String symbol = ref.getSymbol(); + String exchange = ref.getExchange(); + if (exchange == null) { + log.warn("Template exchange is null, skip it, symbol:{}", symbol); + continue; + } + String category = ref.getCategory(); + if (category == null) { + log.warn("Template category is null, skip it, symbol:{}", symbol); + continue; + } + + Map> exchangeMap = templateMap.get(exchange); + if (exchangeMap == null) { + exchangeMap = new HashMap<>(); + templateMap.put(exchange, exchangeMap); + } + List categoryList = exchangeMap.get(category); + if (categoryList == null) { + categoryList = new ArrayList<>(); + exchangeMap.put(category, categoryList); + } + + if (!categoryList.contains(ref)) { + log.info("build template, excahnge: " + exchange + ", category: " + + category + ", symbol: " + symbol + ", strategy: " + ref.getStrategy()); + categoryList.add(ref); } - - log.info("build template category:{},strategy:{}", spotName, ref.getStrategy()); - list.add(ref); } } @@ -72,12 +91,14 @@ public List updateAll(String tradeDate) throws Exception { List addList = new ArrayList<>(); Calendar cal = Calendar.getInstance(); cal.setTime(getSettlementDateFormat().parse(tradeDate)); - for (Entry> entry : refDataTemplateMap.entrySet()) { - List tmpList = entry.getValue(); - for (RefData refData : tmpList) { - List list = updateRefData(cal, refData); - if (list.size() > 0) { - addList.addAll(list); + + for (Entry>> eMap : templateMap.entrySet()) { + for (Entry> cateMap : eMap.getValue().entrySet()) { + for (RefData refData : cateMap.getValue()) { + List list = updateRefData(cal, refData); + if (list.size() > 0) { + addList.addAll(list); + } } } } @@ -185,7 +206,7 @@ public List update(String index, String tradeDate) throws Exception { List ret = new ArrayList<>(); Calendar cal = Calendar.getInstance(); cal.setTime(getSettlementDateFormat().parse(tradeDate)); - List list = refDataTemplateMap.get(index); + List list = searchTemplate(index); if (list != null) { for (RefData tmp : list) { ret.addAll(updateRefData(cal, tmp)); @@ -204,13 +225,42 @@ public List update(String index, String tradeDate) throws Exception { return ret; } - - public Map> getRefDataTemplateMap() { - return refDataTemplateMap; + + private List searchTemplate(String index) { + List list = new ArrayList<>(); + Map> exchangeMap = templateMap.get(index); + if (exchangeMap != null) { + for (Entry> cateMap : exchangeMap.entrySet()) { + list.addAll(cateMap.getValue()); + } + return list; + } + + for (Entry>> eMap : templateMap.entrySet()) { + List tempList = eMap.getValue().get(index); + if (tempList != null) { + list.addAll(tempList); + return list; + } + } + + for (Entry>> eMap : templateMap.entrySet()) { + for (Entry> cateMap : eMap.getValue().entrySet()) { + for (RefData refData : cateMap.getValue()) { + if(refData.getSymbol().equals(index)) { + list.add(refData); + return list; + } + } + } + } + + log.warn("No refData template found, index: " + index); + return list; } - public void setRefDataTemplateMap(Map> refDataTemplateMap) { - this.refDataTemplateMap = refDataTemplateMap; + public Map>> getTemplateMap() { + return templateMap; } @Override diff --git a/common/src/test/java/com/cyanspring/common/staticdata/TestRefDataFactory.java b/common/src/test/java/com/cyanspring/common/staticdata/TestRefDataFactory.java index 805f614ac..66ee1b15c 100644 --- a/common/src/test/java/com/cyanspring/common/staticdata/TestRefDataFactory.java +++ b/common/src/test/java/com/cyanspring/common/staticdata/TestRefDataFactory.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; @@ -29,12 +30,16 @@ public class TestRefDataFactory { public void validateRefDataTemplateMap() throws Exception { // Only allow category INDEX to have multiple records in single template factory.init(); - Map> lstRefDataTemplateMap = factory.getRefDataTemplateMap(); - Set keys = lstRefDataTemplateMap.keySet(); - for (String key : keys) { - List lstRefData = lstRefDataTemplateMap.get(key); - if (!key.equals("INDEX") && lstRefData.size() > 1) { - fail("Categoy " + key + " is not allowed to have multiple entries in template_FC"); + Map>> refDataTemplateMap = factory.getTemplateMap(); + + for (Entry>> eMap : refDataTemplateMap.entrySet()) { + Map> lstRefDataTemplateMap = eMap.getValue(); + Set keys = lstRefDataTemplateMap.keySet(); + for (String key : keys) { + List lstRefData = lstRefDataTemplateMap.get(key); + if (!key.equals("INDEX") && lstRefData.size() > 1) { + fail("Categoy " + key + " is not allowed to have multiple entries in template_FC"); + } } } }