package topasin.processor; import java.io.BufferedReader; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import topasin.calculate.AsinDetailAnalysisFields; import topasin.filter.AsinDetailFilter; import topasin.util.AsinDetail; import topasin.util.TopAsinMapFactory; /** * build map from asin detail files * * @author mengzang * */ public class AsinDetailMapBuilder extends AbstractAsinDetailFileProcessor { private final Map<String, Map<String, AsinDetailAnalysisFields>> group2AsinMap; private final int source; public AsinDetailMapBuilder(BufferedReader reader, int source, AsinDetailFilter filter, Map<String, Map<String, AsinDetailAnalysisFields>> group2AsinMap, AtomicInteger totalCounter) { super(reader, filter, totalCounter); this.group2AsinMap = group2AsinMap; this.source = source; } @Override public void processAsinDetailLine(String asinDetailLine, AsinDetail asinDetail) { String groupKey = asinDetail.getGroupKey(); Map<String, AsinDetailAnalysisFields> asinMap = group2AsinMap.get(groupKey); if (asinMap == null) { asinMap = TopAsinMapFactory.getAsinMap(groupKey); group2AsinMap.put(groupKey, asinMap); } String asin = asinDetail.getAsin(); // TODO: need to process duplicate ASINs safe if support aggregation function. this is not safe for aggregation // function with more than 2 threads AsinDetailAnalysisFields newAsin = asinMap.get(asin); if (newAsin == null) { newAsin = AsinDetailAnalysisFields.getInstance(asinDetail); synchronized (asinMap) { AsinDetailAnalysisFields newAsinDoubleCheck = asinMap.get(asin); if (newAsinDoubleCheck == null) { AsinDetailAnalysisFields oldVal = asinMap.put(asin, newAsin); if (oldVal != null) { throw new RuntimeException("Duplicate added asin to asin map."); } } else { newAsin = newAsinDoubleCheck; } } } newAsin.getComparable().fillCompareFields(asinDetail, source); newAsin = asinMap.put(newAsin.getAsin(), newAsin); } }