package com.smtaiserver.smtaiserver.javaai.metrics.base;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.text.similarity.JaccardSimilarity;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap;
import com.smtservlet.util.Json;
import com.smtservlet.util.SMTStatic;
public abstract class SMTMetricsDefXml extends SMTMetricsDef
{
protected SMTMetricsSampleXml _sampleQuestionXml;
public void initInstance(DBRecord rec) throws Exception
{
super.initInstance(rec);
String sJsonMacro = rec.getString("metrics_macro");
Json jsonMacro = SMTStatic.isNullOrEmpty(sJsonMacro) ? null : Json.read(sJsonMacro);
String sXml = SMTAIServerApp.getApp().convGlobalMacroString(rec.getString("metrics_config"), jsonMacro);
Document doc = SMTStatic.convStrToXmlDoc("" + sXml + "");
Node nodeSampleQuestion = doc.selectSingleNode("ROOT/SAMPLE_QUESTIONS");
if(nodeSampleQuestion != null)
{
_sampleQuestionXml = new SMTMetricsSampleXml((Element)nodeSampleQuestion);
}
initInstanceByDoc(rec, doc);
}
protected void appendSampleQuestionToResponse(Json jsonAST, SMTAIServerRequest tranReq) throws Exception
{
List listSampleQuestion = new ArrayList<>();
querySampleQuestionToList(jsonAST, tranReq, listSampleQuestion);
for(String sample : listSampleQuestion)
{
tranReq.addContentSampleQuestion(sample);
}
}
protected void querySampleQuestionToList(Json jsonAST, SMTAIServerRequest tranReq, List r_list) throws Exception
{
if(_sampleQuestionXml == null)
return;
ASTDBMap dbMap = new ASTDBMap();
try
{
_sampleQuestionXml.createSampleQuestion(this, dbMap, jsonAST, tranReq, r_list);
}
finally
{
dbMap.close();
}
}
public void queryUnknowQuestionList(JaccardSimilarity jaccardSimilarity, String keyword, SMTAIServerRequest tranReq) throws Exception
{
for(String matchName : this._setMatch)
{
double curSim = jaccardSimilarity.apply(matchName, keyword);
if(curSim > 0.3 || keyword.indexOf(matchName) >= 0 || matchName.indexOf(keyword) >= 0)
{
List listQuestion = new ArrayList<>();
querySampleQuestionToList(Json.object(), tranReq, listQuestion);
for(String question : listQuestion)
{
tranReq.addContentSampleQuestion(question);
}
break;
}
}
}
protected abstract void initInstanceByDoc(DBRecord rec, Document doc) throws Exception;
}