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<String[]> _listMatches = new ArrayList<>();
|
private List<String> _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<String, Json> 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<String> 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;
|
}
|
}
|