package com.smtaiserver.smtaiserver.javaai.duckdb; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.smtaiserver.smtaiserver.core.SMTAIServerRequest; import com.smtaiserver.smtaiserver.javaai.duckdb.DuckCubeRecs.DuckCubeRecsType; import com.smtservlet.util.SMTJsonWriter; public class DuckMergeResult { // main merge function private List mergeASTResult(DuckResult astResult) throws Exception { List listDetailMerge = new ArrayList<>(); // 输出summary查询结果 mergeSummaryASTResult(astResult, listDetailMerge); // 输出曲线查询结果 mergeTimeChart(astResult, listDetailMerge); // 输出无维度的明细查询结果 mergeTimeOrBaseRec(astResult, listDetailMerge); return listDetailMerge; } private void mergeTimeOrBaseRec(DuckResult astResult, List listDetailMerge) throws Exception { for(DuckCubeRecs astCubeRecs : astResult._listRecordset) { if(astCubeRecs._recsType != DuckCubeRecsType.RECORD) continue; DuckMergeGroupRecord mergeGroup = new DuckMergeGroupRecord(); mergeGroup._posXColName = astCubeRecs._posXName; mergeGroup._posYColName = astCubeRecs._posYName; mergeGroup._devKeyColName = astCubeRecs._devKeyName; mergeGroup._title = astCubeRecs._title; mergeGroup._astCubeRecs = astCubeRecs; mergeGroup._listDimFilter = astCubeRecs._listDimFilter; listDetailMerge.add(mergeGroup); } } public void outputResultToJson(String jsonPath, DuckResult astResult, SMTAIServerRequest tranReq) throws Exception { // 将生成的cube进行组合 List listMergeGroup = mergeASTResult(astResult); // 输出组合后的cube for(DuckMergeGroup mergeGroup : listMergeGroup) { mergeGroup.outputGroupToJson(jsonPath, tranReq); } } private void mergeSummaryASTResult(DuckResult astResult, List listDetailMerge) throws Exception { DuckMergeGroupSummary mergeGroup = null; for(DuckCubeRecs astCubeRecs : astResult._listRecordset) { if(astCubeRecs._recsType != DuckCubeRecsType.SUMMARY) continue; if(mergeGroup == null) { mergeGroup = new DuckMergeGroupSummary(); listDetailMerge.add(mergeGroup); mergeGroup._title = astCubeRecs._title; } mergeGroup._listCubeRecs.add(astCubeRecs); } } private void mergeTimeChart(DuckResult astResult, List listDetailMerge) throws Exception { DuckMergeGroupChart mergeGroup = null; Date mergeTime = null; for(DuckCubeRecs astCubeRecs : astResult._listRecordset) { if(astCubeRecs._recsType != DuckCubeRecsType.VALUE) continue; if(astCubeRecs._dimNames.size() == 0) { Date[] curTime = new Date[1]; // stCubeRecs.isSameStartTime必须放第一个,因为要取值 if(!astCubeRecs.isSameStartTime(mergeTime, curTime) || mergeGroup == null || !mergeGroup._title.equals(astCubeRecs._title)) { mergeTime = curTime[0]; mergeGroup = new DuckMergeGroupChart(); mergeGroup._title = astCubeRecs._title; listDetailMerge.add(mergeGroup); } DuckMergeChart mergeChart = new DuckMergeChart(); mergeGroup._listRecsValue.add(mergeChart); // 添加时间过滤 if(!astCubeRecs._isRawRS) { { SMTJsonWriter jsonFilter = mergeGroup.prepareFilterJson("time_range_1"); jsonFilter.addKeyValue("type", "time_range"); jsonFilter.addKeyValue("update", "set"); jsonFilter.addKeyValue("title", "时间范围"); jsonFilter.addKeyValue("start_value", astCubeRecs._timeRange._startTime); jsonFilter.addKeyValue("end_value", astCubeRecs._timeRange._endTime); long deltaDays = (astCubeRecs._timeRange._endTime.getTime() - astCubeRecs._timeRange._startTime.getTime()) / 1000 / 24 / 3600 - 60; jsonFilter.addKeyValue("time_step", deltaDays > 0 ? "month" : "day"); jsonFilter.beginArray("start_path"); { jsonFilter.addKeyValue(null, astCubeRecs._timeRange._pathStartTime); } jsonFilter.endArray(); jsonFilter.beginArray("end_path"); { jsonFilter.addKeyValue(null, astCubeRecs._timeRange._pathEndTime); } jsonFilter.endArray(); } if(astCubeRecs._timeRange._title2 != null) { if(astCubeRecs._timeRange._startTime.equals(astCubeRecs._timeRange._startTime2)) { SMTJsonWriter jsonFilter = mergeGroup.prepareFilterJson("time_range_1"); jsonFilter.beginArray("start_path"); { jsonFilter.addKeyValue(null, astCubeRecs._timeRange._pathStartTime2); } jsonFilter.endArray(); jsonFilter.beginArray("end_path"); { jsonFilter.addKeyValue(null, astCubeRecs._timeRange._pathEndTime2); } jsonFilter.endArray(); } else { SMTJsonWriter jsonFilter = mergeGroup.prepareFilterJson("time_range_2"); jsonFilter.addKeyValue("type", "time_range"); jsonFilter.addKeyValue("update", "set"); jsonFilter.addKeyValue("title", "时间范围"); jsonFilter.addKeyValue("start_value", astCubeRecs._timeRange._startTime2); jsonFilter.addKeyValue("end_value", astCubeRecs._timeRange._endTime2); long deltaDays = (astCubeRecs._timeRange._endTime.getTime() - astCubeRecs._timeRange._startTime.getTime()) / 1000 / 24 / 3600 - 60; jsonFilter.addKeyValue("time_step", deltaDays > 0 ? "month" : "day"); jsonFilter.beginArray("start_path"); { jsonFilter.addKeyValue(null, astCubeRecs._timeRange._pathStartTime2); } jsonFilter.endArray(); jsonFilter.beginArray("end_path"); { jsonFilter.addKeyValue(null, astCubeRecs._timeRange._pathEndTime2); } jsonFilter.endArray(); } } if(astCubeRecs._timeRange._pathTimeSteps != null) { SMTJsonWriter jsonFilter = mergeGroup.prepareFilterJson("time_step"); jsonFilter.addKeyValue("type", "time_step"); jsonFilter.addKeyValue("update", "set"); jsonFilter.addKeyValue("title", "步长"); jsonFilter.addKeyValue("step_value", astCubeRecs._timeRange._timeStep); jsonFilter.beginArray("step_path"); { for(String path : astCubeRecs._timeRange._pathTimeSteps) { jsonFilter.addKeyValue(null, path); } } jsonFilter.endArray(); } } mergeChart._startTime = astCubeRecs._timeRange._startTime; mergeChart._chartType = astCubeRecs._chartType; mergeChart._listCubeRecs.add(astCubeRecs); } } } }