package com.taobao.tddl.optimizer.costbased.esitimater.stat.parse; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.List; import org.apache.commons.lang.StringUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.google.common.collect.Lists; import com.taobao.tddl.common.utils.XmlHelper; import com.taobao.tddl.optimizer.costbased.esitimater.stat.KVIndexStat; import com.taobao.tddl.optimizer.costbased.esitimater.stat.TableIndexStat; /** * 解析matrix配置 * * @author jianghang 2013-11-28 下午6:08:57 * @since 5.0.0 */ public class TableIndexStatParser { private static final String XSD_SCHEMA = "META-INF/stat.xsd"; public static List<TableIndexStat> parse(String data) { InputStream is = new ByteArrayInputStream(data.getBytes()); return parse(is); } public static List<TableIndexStat> parse(InputStream in) { Document doc = XmlHelper.createDocument(in, Thread.currentThread().getContextClassLoader().getResourceAsStream(XSD_SCHEMA)); Element root = doc.getDocumentElement(); List<TableIndexStat> stats = Lists.newArrayList(); NodeList list = root.getElementsByTagName("tableIndexStat"); for (int i = 0; i < list.getLength(); i++) { Node item = list.item(i); stats.add(parseTableIndexStat(item)); } return stats; } private static TableIndexStat parseTableIndexStat(Node node) { NodeList list = node.getChildNodes(); TableIndexStat stat = new TableIndexStat(); for (int i = 0; i < list.getLength(); i++) { Node item = list.item(i); if ("tableName".equals(item.getNodeName())) { stat.setTableName(StringUtils.upperCase(item.getFirstChild().getNodeValue())); } else if ("indexStats".equals(item.getNodeName())) { NodeList indexChilds = item.getChildNodes(); for (int j = 0; j < indexChilds.getLength(); j++) { Node indexItem = indexChilds.item(j); if ("indexStat".equals(indexItem.getNodeName())) { stat.addKVIndexStat(parseKVIndexStat(indexItem)); } } } } return stat; } private static KVIndexStat parseKVIndexStat(Node node) { NodeList list = node.getChildNodes(); KVIndexStat stat = new KVIndexStat(); for (int i = 0; i < list.getLength(); i++) { Node item = list.item(i); if ("indexName".equals(item.getNodeName())) { stat.setIndexName(StringUtils.upperCase(item.getFirstChild().getNodeValue())); } else if ("indexType".equals(item.getNodeName())) { stat.setIndexType(Integer.valueOf(item.getFirstChild().getNodeValue())); } else if ("distinctKeys".equals(item.getNodeName())) { stat.setDistinctKeys(Integer.valueOf(item.getFirstChild().getNodeValue())); } else if ("numRows".equals(item.getNodeName())) { stat.setNumRows(Integer.valueOf(item.getFirstChild().getNodeValue())); } else if ("factor".equals(item.getNodeName())) { stat.setFactor(Double.valueOf(item.getFirstChild().getNodeValue())); } } return stat; } }