package topasin.calculate; import static topasin.util.TopAsinUtil.log; import java.io.BufferedReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; import topasin.filter.AsinDetailFilterFactory; import topasin.processor.AsinDetailMapBuilder; import topasin.processor.TopAsinFinder; import topasin.util.TopAsinContext; import topasin.util.TopAsinMapFactory; import topasin.util.TopAsinUtil; /** * Top asin calculator * * @author mengzang * */ public class TopAsinExtractorFlow { private TopAsinContext topAsinContext; public TopAsinExtractorFlow(TopAsinContext tipasinContext) { this.topAsinContext = tipasinContext; } public void doAnalysis() throws IOException, InterruptedException { final Map<String, Map<String, AsinDetailAnalysisFields>> group2AsinMap = TopAsinMapFactory.getGroupMap(); log("================Building asin map using new asin details file...================"); int buildTreeThreadNumberOrig = (Integer) topAsinContext.getRTOptions().get( TopAsinContext.BUILD_TREE_THREAD_NUMBER); buildGroup2AsinMap(group2AsinMap, topAsinContext.getNewFileReader(), TopAsinContext.NEW_SOURCE, buildTreeThreadNumberOrig, "New AsinDetailsFile Tree Builder"); TopAsinMapFactory.storeHistoryGroupSize(group2AsinMap); log("================Building asin map using orig asin details file...================"); int buildTreeThreadNumberNew = (Integer) topAsinContext.getRTOptions().get( TopAsinContext.ANALYSIS_FILE_THREAD_NUMBER); buildGroup2AsinMap(group2AsinMap, topAsinContext.getOriginalFileReader(), TopAsinContext.ORIG_SOURCE, buildTreeThreadNumberNew, "Orig AsinDetailsFile Tree Builder"); log("======================Calculating Top Asin from asin map ...======================"); Map<String, TopAsinsCalculator> topAsinResult = calculateTopAsinUsingAsinMap(group2AsinMap, "Top Asin Calculator"); // release memory. output would use lots of memory to hold top asin description data. group2AsinMap.clear(); log("===========================Outputing top asin results...==========================="); outputTopAsinResult(topAsinResult); log("Top asin output finished."); } private Map<String, Map<String, AsinDetailAnalysisFields>> buildGroup2AsinMap( Map<String, Map<String, AsinDetailAnalysisFields>> group2AsinMap, BufferedReader reader, int source, int threadCount, String builderName) throws IOException, InterruptedException { // so far integer is enough... final AtomicInteger totalCounter = new AtomicInteger(); Runnable[] builders = new Runnable[threadCount]; for (int i = 0; i < threadCount; i++) { builders[i] = new AsinDetailMapBuilder(reader, source, AsinDetailFilterFactory.getFilter(), group2AsinMap, totalCounter); } int logInterval = (Integer) topAsinContext.getRTOptions().get(TopAsinContext.LOG_INTERVAL); TopAsinUtil.executeMulthThreadAndWait4Termination(builderName, builders, logInterval, totalCounter); return group2AsinMap; } private Map<String, TopAsinsCalculator> calculateTopAsinUsingAsinMap( final Map<String, Map<String, AsinDetailAnalysisFields>> group2AsinMap, String analystName) throws InterruptedException { final Map<String, TopAsinsCalculator> group2TopAsin = TopAsinMapFactory.getGroupMap(); List<Runnable> analysts = new ArrayList<Runnable>(group2AsinMap.size()); for (Entry<String, Map<String, AsinDetailAnalysisFields>> groupData : group2AsinMap.entrySet()) { String groupKey = groupData.getKey(); Map<String, AsinDetailAnalysisFields> asins4Group = groupData.getValue(); Runnable analyst = new TopAsinFinder(groupKey, asins4Group, group2TopAsin); analysts.add(analyst); } int logInterval = (Integer) topAsinContext.getRTOptions().get(TopAsinContext.LOG_INTERVAL); TopAsinUtil.executeMulthThreadAndWait4Termination(analystName, analysts.toArray(new Runnable[0]), logInterval, null); return group2TopAsin; } private void outputTopAsinResult(Map<String, TopAsinsCalculator> topAsinResult) { TopAsinDescriptionOutputer topAsinDump = new TopAsinDescriptionOutputer(topAsinContext); topAsinDump.outputTopAsinAnlysisResult(topAsinResult); } }