in src/core-metadata/src/main/java/org/apache/kylin/metadata/recommendation/ref/OptRecManagerV2.java [91:171]
public boolean genRecItemsFromIndexOptimizer(String project, String modelId,
Map<Long, GarbageLayoutType> garbageLayouts) {
if (garbageLayouts.isEmpty()) {
return false;
}
log.info("Generating raw recommendations from index optimizer for model({}/{})", project, modelId);
KylinConfig config = KylinConfig.getInstanceFromEnv();
NDataModelManager modelManager = NDataModelManager.getInstance(config, project);
NDataModel model = modelManager.getDataModelDesc(modelId);
NIndexPlanManager indexPlanManager = NIndexPlanManager.getInstance(config, project);
IndexPlan indexPlan = indexPlanManager.getIndexPlan(modelId);
Map<Long, LayoutEntity> allLayoutsMap = indexPlan.getAllLayoutsMap();
NDataflowManager dataflowManager = NDataflowManager.getInstance(config, project);
NDataflow dataflow = dataflowManager.getDataflow(modelId);
Map<Long, FrequencyMap> hitFrequencyMap = dataflow.getLayoutHitCount();
RawRecManager recManager = RawRecManager.getInstance(project);
Map<String, RawRecItem> layoutRecommendations = recManager.queryNonAppliedLayoutRawRecItems(modelId, false);
Map<String, List<String>> md5ToUuid = RawRecUtil.uniqueFlagsToMd5Map(layoutRecommendations.keySet());
AtomicInteger newRecCount = new AtomicInteger(0);
RawRecManager rawRecManager = RawRecManager.getInstance(project);
garbageLayouts.forEach((layoutId, type) -> {
LayoutEntity layout = allLayoutsMap.get(layoutId);
String content = RawRecUtil.getContent(project, modelId, layout.genUniqueContent(),
RawRecItem.RawRecType.REMOVAL_LAYOUT);
String md5 = RawRecUtil.computeMD5(content);
AtomicBoolean retry = new AtomicBoolean(false);
JdbcUtil.withTxAndRetry(rawRecManager.getTransactionManager(), () -> {
Pair<String, RawRecItem> recItemPair = null;
if (retry.get()) {
recItemPair = recManager.queryRecItemByMd5(md5, content);
} else {
retry.set(true);
recItemPair = RawRecUtil.getRawRecItemFromMap(md5, content, md5ToUuid, layoutRecommendations);
}
FrequencyMap frequencyMap = hitFrequencyMap.getOrDefault(layoutId, new FrequencyMap());
RawRecItem recItem;
if (recItemPair.getSecond() != null) {
recItem = recItemPair.getSecond();
recItem.setUpdateTime(System.currentTimeMillis());
recItem.setRecSource(type.name());
if (recItem.getState() == RawRecItem.RawRecState.DISCARD) {
recItem.setState(RawRecItem.RawRecState.INITIAL);
LayoutMetric layoutMetric = recItem.getLayoutMetric();
if (layoutMetric == null) {
recItem.setLayoutMetric(new LayoutMetric(frequencyMap, new LayoutMetric.LatencyMap()));
} else {
layoutMetric.setFrequencyMap(frequencyMap);
}
}
} else {
LayoutRecItemV2 item = new LayoutRecItemV2();
item.setLayout(layout);
item.setCreateTime(System.currentTimeMillis());
item.setAgg(layout.getId() < IndexEntity.TABLE_INDEX_START_ID);
item.setUuid(RandomUtil.randomUUIDStr());
recItem = new RawRecItem(project, modelId, model.getSemanticVersion(),
RawRecItem.RawRecType.REMOVAL_LAYOUT);
recItem.setRecEntity(item);
recItem.setCreateTime(item.getCreateTime());
recItem.setUpdateTime(item.getCreateTime());
recItem.setState(RawRecItem.RawRecState.INITIAL);
recItem.setUniqueFlag(recItemPair.getFirst());
recItem.setDependIDs(item.genDependIds());
recItem.setLayoutMetric(new LayoutMetric(frequencyMap, new LayoutMetric.LatencyMap()));
recItem.setRecSource(type.name());
newRecCount.getAndIncrement();
}
if (recItem.getLayoutMetric() != null) {
RawRecManager.getInstance(project).saveOrUpdate(recItem);
}
return null;
});
});
log.info("Raw recommendations from index optimizer for model({}/{}) successfully generated.", project, modelId);
return newRecCount.get() > 0;
}