package com.smtaiserver.smtaiserver.javaai.metrics.base;
|
|
import java.util.ArrayList;
|
import java.util.Iterator;
|
import java.util.List;
|
|
import org.dom4j.Element;
|
import org.dom4j.Node;
|
import org.dom4j.tree.DefaultText;
|
|
import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
|
import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError;
|
import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap;
|
|
import com.smtservlet.util.Json;
|
import com.smtservlet.util.SMTStatic;
|
|
|
|
@SuppressWarnings("unused")
|
public class SMTMetricsSampleXml
|
{
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static class SQLXMLExecArg
|
{
|
public SMTMetricsDefXml _metricsDef;
|
public ASTDBMap _dbMap;
|
public Json _jsonAST;
|
public SMTAIServerRequest _tranReq;
|
public StringBuilder _sbQuestion = new StringBuilder();
|
public StringBuilder _sbSqlText;
|
public List<Object> _listSqlArgs;
|
public List<String> _listQuestion;
|
|
public SQLXMLExecArg(SMTMetricsDefXml metricsDef, ASTDBMap dbMap, Json jsonAST, SMTAIServerRequest tranReq, List<String> r_list)
|
{
|
_metricsDef = metricsDef;
|
_dbMap = dbMap;
|
_jsonAST = jsonAST;
|
_tranReq = tranReq;
|
_listQuestion = r_list;
|
}
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static abstract class SQLXMLNode
|
{
|
public abstract SMTJavaAIError execute(SQLXMLExecArg execArg) throws Exception;
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static abstract class SQLXMLNodeSQLXml extends SQLXMLNode
|
{
|
private List<Object> _listChildren = new ArrayList<>();
|
|
|
public SQLXMLNodeSQLXml(Element xmlRoot) throws Exception
|
{
|
for (Iterator<Node> iterInner = xmlRoot.nodeIterator(); iterInner.hasNext();)
|
{
|
Node nodeInner = iterInner.next();
|
if(nodeInner.getNodeType() == Node.TEXT_NODE)
|
{
|
String text = ((DefaultText)nodeInner).getText();
|
int lastPos = _listChildren.size() - 1;
|
if(lastPos >= 0 && _listChildren.get(lastPos) instanceof String)
|
{
|
_listChildren.set(lastPos, (String)_listChildren.get(lastPos) + text);
|
}
|
else
|
{
|
_listChildren.add(text);
|
}
|
}
|
else
|
{
|
_listChildren.add(createSQLXMLNode((Element)nodeInner));
|
}
|
}
|
}
|
|
protected SMTJavaAIError parseSQLText(SQLXMLExecArg execArg, StringBuilder r_sbSQL, List<Object> r_sqlArgs) throws Exception
|
{
|
// 生成查询SQL
|
execArg._sbSqlText = r_sbSQL;
|
execArg._listSqlArgs = r_sqlArgs;
|
|
for(Object oxmlNode : _listChildren)
|
{
|
if(oxmlNode instanceof String)
|
{
|
execArg._sbSqlText.append(oxmlNode);
|
}
|
else if(oxmlNode instanceof SQLXMLNode)
|
{
|
SMTJavaAIError error = ((SQLXMLNode)oxmlNode).execute(execArg);
|
if(error != null)
|
return error;
|
}
|
}
|
|
return null;
|
}
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static class SQLXMLNodePARAM extends SQLXMLNode
|
{
|
private String _paramKey;
|
private String _defValue;
|
|
public SQLXMLNodePARAM(Element xmlRoot) throws Exception
|
{
|
_paramKey = SMTStatic.getXmlAttr(xmlRoot, "key");
|
_defValue = SMTStatic.getXmlAttr(xmlRoot, "default");
|
}
|
|
@Override
|
public SMTJavaAIError execute(SQLXMLExecArg execArg) throws Exception
|
{
|
String value = execArg._jsonAST.safeGetStr(_paramKey, null);
|
if(value == null)
|
value = _defValue;
|
|
execArg._sbQuestion.append(value);
|
|
return null;
|
}
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static class SQLXMLNodeMETRIC_NAME extends SQLXMLNode
|
{
|
public SQLXMLNodeMETRIC_NAME(Element xmlRoot)
|
{
|
}
|
|
@Override
|
public SMTJavaAIError execute(SQLXMLExecArg execArg) throws Exception
|
{
|
execArg._sbQuestion.append(execArg._metricsDef.getTitle());
|
|
return null;
|
}
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static class SQLXMLNodeQuestion extends SQLXMLNode
|
{
|
private List<Object> _listChildren = new ArrayList<>();
|
|
public SQLXMLNodeQuestion(Element xmlRoot) throws Exception
|
{
|
for (Iterator<Node> iterInner = xmlRoot.nodeIterator(); iterInner.hasNext();)
|
{
|
Node nodeInner = iterInner.next();
|
if(nodeInner.getNodeType() == Node.TEXT_NODE)
|
{
|
String text = ((DefaultText)nodeInner).getText();
|
int lastPos = _listChildren.size() - 1;
|
if(lastPos >= 0 && _listChildren.get(lastPos) instanceof String)
|
{
|
_listChildren.set(lastPos, (String)_listChildren.get(lastPos) + text);
|
}
|
else
|
{
|
_listChildren.add(text);
|
}
|
}
|
else
|
{
|
_listChildren.add(createSQLXMLNode((Element)nodeInner));
|
}
|
}
|
}
|
|
@Override
|
public SMTJavaAIError execute(SQLXMLExecArg execArg) throws Exception
|
{
|
execArg._sbQuestion.setLength(0);
|
for(Object oxmlNode : _listChildren)
|
{
|
if(oxmlNode instanceof String)
|
{
|
execArg._sbQuestion.append(oxmlNode);
|
}
|
else if(oxmlNode instanceof SQLXMLNode)
|
{
|
SMTJavaAIError error = ((SQLXMLNode)oxmlNode).execute(execArg);
|
if(error != null)
|
return error;
|
}
|
}
|
if(execArg._sbQuestion.length() > 0)
|
execArg._listQuestion.add(
|
execArg._sbQuestion.toString()
|
.replace("\r", "")
|
.replace("\n", "")
|
.replace("\t", "")
|
.replace(" ", "")
|
);
|
|
return null;
|
}
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////
|
private static class SQLXMLNodeSAMPLE_QUESTIONS extends SQLXMLNode
|
{
|
private List<Object> _listChildren = new ArrayList<>();
|
|
public SQLXMLNodeSAMPLE_QUESTIONS(Element xmlRoot) throws Exception
|
{
|
for (Iterator<Node> iterInner = xmlRoot.nodeIterator(); iterInner.hasNext();)
|
{
|
Node nodeInner = iterInner.next();
|
if(nodeInner.getNodeType() != Node.TEXT_NODE)
|
{
|
_listChildren.add(createSQLXMLNode((Element)nodeInner));
|
}
|
}
|
}
|
|
@Override
|
public SMTJavaAIError execute(SQLXMLExecArg execArg) throws Exception
|
{
|
for(Object oxmlNode : _listChildren)
|
{
|
if(oxmlNode instanceof String)
|
{
|
execArg._sbQuestion.append(oxmlNode);
|
}
|
else if(oxmlNode instanceof SQLXMLNode)
|
{
|
SMTJavaAIError error = ((SQLXMLNode)oxmlNode).execute(execArg);
|
if(error != null)
|
return error;
|
}
|
}
|
|
|
return null;
|
}
|
}
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
private SQLXMLNodeSAMPLE_QUESTIONS _SQLXMLNode;
|
|
private static SQLXMLNode createSQLXMLNode(Element xmlRoot) throws Exception
|
{
|
String name = xmlRoot.getName().toUpperCase();
|
if("QUESTION".equals(name))
|
return new SQLXMLNodeQuestion(xmlRoot);
|
else if("PARAM".equals(name))
|
return new SQLXMLNodePARAM(xmlRoot);
|
else if("METRIC_NAME".equals(name))
|
return new SQLXMLNodeMETRIC_NAME(xmlRoot);
|
else
|
throw new Exception("unknow SQLXML : " + name);
|
}
|
|
public SMTMetricsSampleXml(Element rootElement) throws Exception
|
{
|
_SQLXMLNode = new SQLXMLNodeSAMPLE_QUESTIONS(rootElement);
|
}
|
|
public void createSampleQuestion(SMTMetricsDefXml metricsDef, ASTDBMap dbMap, Json jsonAST, SMTAIServerRequest tranReq, List<String> r_list) throws Exception
|
{
|
SQLXMLExecArg execArg = new SQLXMLExecArg(metricsDef, dbMap, jsonAST, tranReq, r_list);
|
|
_SQLXMLNode.execute(execArg);
|
}
|
}
|