public boolean genRecItemsFromIndexOptimizer()

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;
    }