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<T> implements QuestionExtractor<T>{
|
|
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<T> 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<QuestionExtractOptions.ExtractOptionItem> 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<T> acquireGlobalList(QuestionExtractOptions option) throws ExtractFailedException;
|
|
/**
|
* 根据明细规则,抽取数据集合。
|
* @param option 全局配置
|
* @param item 明细规则
|
* @return
|
* @date 2023-03-07
|
*/
|
protected abstract List<T> 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<QuestionType, List<QuestionExtractOptions.ExtractOptionItem>> typeOptionItemMap = new HashMap<>(8);
|
long extractTotalConfig = 0;
|
|
List<QuestionExtractOptions.ExtractOptionItem> 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<QuestionType, List<QuestionExtractOptions.ExtractOptionItem>> 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;
|
}
|