package com.walker.etaa; import com.walker.etaa.util.QuestionExtractUtils; import com.walker.infrastructure.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class AbstractQuestionExtractor implements QuestionExtractor{ protected final transient Logger logger = LoggerFactory.getLogger(getClass()); @Override public int getId() { return this.id; } @Override public String getName() { return this.name; } @Override public List extract(QuestionExtractOptions option) throws ExtractFailedException { this.checkQuestionExtractOptions(option); if(StringUtils.isEmptyList(option.getOptionItemList())){ logger.debug("不存在抽取明细,仅有全局配置: " + option); try{ return this.acquireGlobalList(option); } catch (Exception ex){ throw new ExtractFailedException("全局配置抽取试题异常:" + ex.getMessage(), ex); } } logger.debug("存在抽取规则明细"); List resultList = new ArrayList(256); List itemList = option.getOptionItemList(); try{ List tempList = null; for(QuestionExtractOptions.ExtractOptionItem item : itemList){ tempList = this.acquireOptionItemList(option, item); if(StringUtils.isEmptyList(tempList)){ logger.warn("从抽取规则'{}'中未查找到试题集合!", item.toString()); continue; } resultList.addAll(tempList); if(tempList.size() < item.getCount()){ logger.warn("从抽取规则'{}'中抽取数量少于定义数量,可能题库数量不足,请确认后尝试调整参数。extract:{}, config:{}", item, resultList.size(), item.getCount()); } } } catch (Exception ex){ throw new ExtractFailedException("规则明细抽取试题异常:" + ex.getMessage(), ex); } return resultList; } /** * 根据全局配置抽取数据。 * @param option * @return * @date 2023-03-07 */ protected abstract List acquireGlobalList(QuestionExtractOptions option) throws ExtractFailedException; /** * 根据明细规则,抽取数据集合。 * @param option 全局配置 * @param item 明细规则 * @return * @date 2023-03-07 */ protected abstract List acquireOptionItemList(QuestionExtractOptions option , QuestionExtractOptions.ExtractOptionItem item) throws ExtractFailedException; private void checkQuestionExtractOptions(QuestionExtractOptions option) throws ExtractFailedException{ if(StringUtils.isEmpty(option.getOwnerId())){ throw new ExtractFailedException("归属必须提供:ownerId", null); } if(StringUtils.isEmptyList(option.getOptionItemList())){ return; } Map> typeOptionItemMap = new HashMap<>(8); long extractTotalConfig = 0; List itemList = null; for(QuestionExtractOptions.ExtractOptionItem item : option.getOptionItemList()){ itemList = typeOptionItemMap.get(item.getQuestionType()); if(itemList == null){ itemList = new ArrayList<>(8); typeOptionItemMap.put(item.getQuestionType(), itemList); } itemList.add(item); extractTotalConfig += item.getCount(); } if(extractTotalConfig != option.getExtractTotal()){ throw new ExtractFailedException("配置的抽取规则中,抽取数量与全局配置数量不一致!", null); } // for(Map.Entry> entry : typeOptionItemMap.entrySet()){ // if(!QuestionExtractUtils.isMajorAndMinorCatalogOk(entry.getValue())){ // throw new ExtractFailedException("'" + entry.getKey().getName() + "'不能大类、小类同时设置抽取条件,请只设置'minorCatalog'", null); // } // } } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } private int id = 0; private String name; }