package com.smtaiserver.smtaiserver.javaai.metrics.base; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import org.apache.commons.text.similarity.JaccardSimilarity; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.smtaiserver.smtaiserver.control.SMTAIServerControl; import com.smtaiserver.smtaiserver.core.SMTAIServerApp; import com.smtaiserver.smtaiserver.database.SMTDatabase; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecords; import com.smtservlet.util.Json; import com.smtservlet.util.SMTStatic; public class SMTDimensionDef { private String _id; private String _name; private String _prompt; private char _type; private String _unitName; private List _listMatches = new ArrayList<>(); private List _listEnums = null; private static Logger _logger = LogManager.getLogger(SMTAIServerControl.class); public SMTDimensionDef(DBRecord rec) throws Exception { _id = rec.getString("dim_id"); _name = rec.getString("dim_name"); _prompt = rec.getString("dim_title"); _unitName = rec.getString("dim_unit"); if(SMTStatic.isNullOrEmpty(_unitName)) _unitName = ""; if(SMTStatic.isNullOrEmpty(_prompt)) _prompt = _name; else _prompt = _name + "," + _prompt; _type = rec.getString("dim_type").charAt(0); String sAlias = rec.getString("dim_alias"); if(!SMTStatic.isNullOrEmpty(sAlias)) { Json jsonMatch = Json.read(sAlias); for(Entry entry : jsonMatch.asJsonMap().entrySet()) { String key = entry.getKey(); for(Json jsonValue : entry.getValue().asJsonList()) { _listMatches.add(new String[] {jsonValue.asString(), key}); } } } // 如果枚举值存在,则读取枚举值 String sJsonValueList = rec.getString("dim_value_list"); if(!SMTStatic.isNullOrEmpty(sJsonValueList)) { Json jsonValueList = Json.read(sJsonValueList); // 如果能取到直接值,则用直接值 Json jsonValues = jsonValueList.safeGetJson("values"); if(jsonValues != null && jsonValues.asJsonList().size() > 0) { if(_listEnums == null) _listEnums = new ArrayList<>(); for(Json jsonValue : jsonValues.asJsonList()) { _listEnums.add(jsonValue.asString()); } } // 如果配置了SQL, 则查询sql Json jsonSqlConfig = jsonValueList.safeGetJson("sql"); if(jsonSqlConfig != null) { try { String dsId = jsonSqlConfig.getJson("ds_id").asString(); String sql = jsonSqlConfig.getJson("sql").asString(); SMTDatabase db = SMTAIServerApp.getApp().getDataSource(dsId).allocDatabase(); try { DBRecords recs = db.querySQL(sql, null); if(recs.getRowCount() > 0) { if(_listEnums == null) _listEnums = new ArrayList<>(); for(DBRecord recValue : recs.getRecords()) { _listEnums.add(recValue.getString(0)); } } } finally { db.close(); } } catch(Exception ex) { _logger.fatal("load dim value list from db error : " + _id + ", error=" + ex.getMessage()); } } } } public List getValueList() { return _listEnums; } public boolean hasValueList() { return _listEnums != null && _listEnums.size() > 0; } public String getUnitName(boolean hasBound) { if(SMTStatic.isNullOrEmpty(_unitName)) return ""; if(hasBound) return "(" + _unitName + ")"; return _unitName; } public String matchDimension(String value, JaccardSimilarity jaccardSimilarity) { double maxSim = 0; String maxName = null; for(String[] match : _listMatches) { double curSim = jaccardSimilarity.apply(match[0], value); if(curSim == 1) return match[1]; if(curSim < 0.8) continue; if(curSim > maxSim) { maxSim = curSim; maxName = match[1]; } } if(maxName != null) return maxName; return value; } public char getType() { return _type; } public String getName() { return _name; } public String getPrompt() { return _prompt; } public String getId() { return _id; } }