diff --git a/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/DataSetToTreeFunction.java b/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/DataSetToTreeFunction.java index 124f0441a1f03107f497a0f13b9cd2a7536d621b..f2f8b3b4aaaf68130d5bd74384b716fef1e7e4b0 100644 --- a/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/DataSetToTreeFunction.java +++ b/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/DataSetToTreeFunction.java @@ -1,7 +1,7 @@ package org.tinygroup.tinyscript.datasetwithtree.function; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -19,6 +19,7 @@ import org.tinygroup.tinyscript.tree.impl.DefaultDataNode; /** * 将DataSet转换未tree + * * @author yancheng11334 * */ @@ -27,123 +28,124 @@ public class DataSetToTreeFunction extends AbstractScriptFunction { public String getNames() { return "toTree"; } - + public String getBindingTypes() { return DataSet.class.getName(); } - - public boolean enableExpressionParameter(){ + + public boolean enableExpressionParameter() { return true; } - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ - if(parameters == null || parameters.length == 0){ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); - }else if(checkParameters(parameters, 3)){ + } else if (checkParameters(parameters, 3)) { AbstractDataSet dataSet = (AbstractDataSet) getValue(parameters[0]); - String id = (String) getValue(parameters[1]); - String parentId = (String) getValue(parameters[2]); - return toTree(dataSet,id,parentId); - }else{ + String id = (String) getValue(parameters[1]); + String parentId = (String) getValue(parameters[2]); + return toTree(dataSet, id, parentId); + } else { throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - }catch(ScriptException e){ + } catch (ScriptException e) { throw e; - }catch(Exception e){ - throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()),e); + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - + @SuppressWarnings("rawtypes") - private DataNode toTree(AbstractDataSet dataSet,String id,String parentId) throws Exception{ - + private DataNode toTree(AbstractDataSet dataSet, String id, String parentId) throws Exception { + int idCol = DataSetUtil.getFieldIndex(dataSet, id); int parentIdCol = DataSetUtil.getFieldIndex(dataSet, parentId); - - Map maps = new HashMap(); - Map resultMaps = new HashMap(); - + + Map maps = new LinkedHashMap(); + Map resultMaps = new LinkedHashMap(); + String rootId = null; - //遍历行处理数据 - for(int i=0;i maps,Map resultMaps,List ids,String rootId){ - if(node.getName()==null){ - AbstractDataNode abstractDataNode = (AbstractDataNode) node; - abstractDataNode.setName(rootId); - abstractDataNode.setValue(resultMaps.get(rootId)); - NodeInfo info = maps.get(rootId); - if(info!=null){ - dealDataNode(node,maps,resultMaps,info.ids,rootId); - } - - }else{ - if(ids!=null && ids.size()>0){ - for(String id:ids){ + private void dealDataNode(DataNode node, Map maps, Map resultMaps, List ids, + String rootId) { + if (node.getName() == null) { + AbstractDataNode abstractDataNode = (AbstractDataNode) node; + abstractDataNode.setName(rootId); + abstractDataNode.setValue(resultMaps.get(rootId)); + NodeInfo info = maps.get(rootId); + if (info != null) { + dealDataNode(node, maps, resultMaps, info.ids, rootId); + } + + } else { + if (ids != null && ids.size() > 0) { + for (String id : ids) { Map rowMap = resultMaps.get(id); - DataNode subNode = new DefaultDataNode(id,rowMap); - node.addNode(subNode); - if(maps.containsKey(id)){ - NodeInfo info = maps.get(id); - dealDataNode(subNode,maps,resultMaps,info.ids,rootId); + DataNode subNode = new DefaultDataNode(id, rowMap); + node.addNode(subNode); + if (maps.containsKey(id)) { + NodeInfo info = maps.get(id); + dealDataNode(subNode, maps, resultMaps, info.ids, rootId); } } } } - + } - - @SuppressWarnings({"rawtypes" }) - private Map createMap(AbstractDataSet dataSet,int row) throws Exception { - Map maps = new HashMap(); - for(int i=0;i maps = new LinkedHashMap(); + for (int i = 0; i < dataSet.getColumns(); i++) { + maps.put(dataSet.getFields().get(i).getName(), + dataSet.getData(dataSet.getShowIndex(row), dataSet.getShowIndex(i))); } return maps; } - + class NodeInfo { String pid; List ids = new ArrayList(); - + public String toString() { return "NodeInfo [pid=" + pid + ", ids=" + ids + "]"; } - + } } diff --git a/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/TreeToDataSetFunction.java b/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/TreeToDataSetFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..ab3189a169b3414c11829b9824d358e444e55c1d --- /dev/null +++ b/org.tinygroup.tinyscript.datasetwithtree/src/main/java/org/tinygroup/tinyscript/datasetwithtree/function/TreeToDataSetFunction.java @@ -0,0 +1,102 @@ +package org.tinygroup.tinyscript.datasetwithtree.function; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.tinyscript.tree.DataNode; +import org.tinygroup.tinyscript.tree.impl.DefaultDataNode; + +public class TreeToDataSetFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "toDataSet"; + } + + @Override + public String getBindingTypes() { + return DataNode.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length == 0) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + DefaultDataNode rootNode = (DefaultDataNode) getValue(parameters[0]); + return toDataSet(rootNode); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + } catch (ScriptException e) { + throw e; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private DataSet toDataSet(DefaultDataNode dataNode) throws Exception { + + List fields = createFields(dataNode); + List> dataList = new ArrayList>(); + + Queue queue = new LinkedList(); + queue.add(dataNode); + while (!queue.isEmpty()) { + DefaultDataNode node = queue.poll(); + Map currentRow = (Map) node.getValue(); + List rowData = new ArrayList(); + + for (String key : (Set) currentRow.keySet()) { + rowData.add(currentRow.get(key)); + } + dataList.add(rowData); + if (!node.isLeaf()) { + for (DataNode childNode : node.getChildren()) { + queue.add((DefaultDataNode) childNode); + } + } + } + + SimpleDataSet dataSet = (SimpleDataSet) DataSetUtil.createDynamicDataSet(fields, convertToArray(dataList)); + return dataSet; + } + + private Object[][] convertToArray(List> dataList) { + Object[][] dataArray = new Object[dataList.size()][]; + for (int i = 0; i < dataList.size(); i++) { + dataArray[i] = dataList.get(i).toArray(); + } + return dataArray; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private List createFields(DefaultDataNode dataNode) { + List fields = new ArrayList(); + Map currentRow = (Map) dataNode.getValue(); + for (String key : (Set) currentRow.keySet()) { + Field field = new Field(); + field.setName(key); + field.setTitle(key); + field.setType(currentRow.get(key).getClass().getSimpleName()); + fields.add(field); + } + return fields; + } + +} diff --git a/org.tinygroup.tinyscript.datasetwithtree/src/main/resources/datasetwithtree.beans.xml b/org.tinygroup.tinyscript.datasetwithtree/src/main/resources/datasetwithtree.beans.xml index a1ca08559385cdadd879aca20ba740cdcf7665b9..7e2103057d813d9b5fdd3c1dbcd9214238de53bc 100644 --- a/org.tinygroup.tinyscript.datasetwithtree/src/main/resources/datasetwithtree.beans.xml +++ b/org.tinygroup.tinyscript.datasetwithtree/src/main/resources/datasetwithtree.beans.xml @@ -1,11 +1,15 @@ + xmlns="http://www.springframework.org/schema/beans" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - - + + + + + + diff --git a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java index 3e45209607494c7f07f94b3cba18944fc9985b5a..dbb2067e21075dbdb883245ede04664f095f25de 100644 --- a/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java +++ b/org.tinygroup.tinyscript/src/main/java/org/tinygroup/tinyscript/impl/DefaultTinyScriptEngine.java @@ -82,6 +82,7 @@ import org.tinygroup.tinyscript.dataset.objectitem.DataSetColumnItemProcessor; import org.tinygroup.tinyscript.dataset.objectitem.DataSetItemProcessor; import org.tinygroup.tinyscript.dataset.objectitem.DataSetRowItemProcessor; import org.tinygroup.tinyscript.datasetwithtree.function.DataSetToTreeFunction; +import org.tinygroup.tinyscript.datasetwithtree.function.TreeToDataSetFunction; import org.tinygroup.tinyscript.excel.function.ReadExcelFunction; import org.tinygroup.tinyscript.excel.function.WriteExcelFunction; import org.tinygroup.tinyscript.expression.ExpressionUtil; @@ -163,6 +164,7 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new CreateDataTreeFunction()); addScriptFunction(new DataSetToTreeFunction()); + addScriptFunction(new TreeToDataSetFunction()); addScriptFunction(new ReadJsonFunction()); addScriptFunction(new ReadXmlFunction()); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/tree.txt b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/tree.txt new file mode 100644 index 0000000000000000000000000000000000000000..f33364c3f25376e0b9c79d7485068e38d6febd84 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/tree.txt @@ -0,0 +1,6 @@ +menuid parentid name +1 根菜单 +2 1 菜单一 +3 1 菜单二 +4 2 菜单三 +5 3 菜单四 diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/treeToDataSet.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/treeToDataSet.ts new file mode 100644 index 0000000000000000000000000000000000000000..59b38abd2dff06607789103558239a36610644b4 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/treeToDataSet.ts @@ -0,0 +1,3 @@ +dataSet = readTxt("/dataSetExample/tree.txt"); +tree = dataSet.toTree("menuid","parentid"); +println(tree.toDataSet()); \ No newline at end of file