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 _listSqlArgs; public List _listQuestion; public SQLXMLExecArg(SMTMetricsDefXml metricsDef, ASTDBMap dbMap, Json jsonAST, SMTAIServerRequest tranReq, List 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 _listChildren = new ArrayList<>(); public SQLXMLNodeSQLXml(Element xmlRoot) throws Exception { for (Iterator 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 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 _listChildren = new ArrayList<>(); public SQLXMLNodeQuestion(Element xmlRoot) throws Exception { for (Iterator 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 _listChildren = new ArrayList<>(); public SQLXMLNodeSAMPLE_QUESTIONS(Element xmlRoot) throws Exception { for (Iterator 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 r_list) throws Exception { SQLXMLExecArg execArg = new SQLXMLExecArg(metricsDef, dbMap, jsonAST, tranReq, r_list); _SQLXMLNode.execute(execArg); } }