From 6ae2bca201dd816cc6d387b0642e7d03728ea617 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Fri, 15 Sep 2017 13:16:10 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1.=E9=87=8D=E6=9E=84excel=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E3=80=822.=E5=A2=9E=E5=8A=A0writeExcel?= =?UTF-8?q?=E5=92=8CwriteCsv=E3=80=823.=E9=87=8D=E6=9E=84readExcel?= =?UTF-8?q?=EF=BC=88=E8=BF=94=E5=9B=9Edataset=E9=9B=86=E5=90=88=EF=BC=89?= =?UTF-8?q?=E3=80=824.=E5=A2=9E=E5=8A=A0=E7=9B=B8=E5=85=B3=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../csv/function/ReadCsvFunction.java | 55 ++++--- .../csv/function/WriteCsvFunction.java | 116 +++++++++++++++ .../excel/function/ReadExcelFunction.java | 88 +++++------ .../excel/function/WriteExcelFunction.java | 140 ++++++++++++++++++ .../src/main/resources/excel.beans.xml | 8 + .../src/main/resources/excel.properties | 2 + .../src/main/resources/excel_zh_CN.properties | 2 + .../impl/DefaultTinyScriptEngine.java | 6 + .../resources/dataSetExample/writeCsvTest.csv | 5 + .../resources/dataSetExample/writeExcel.ts | 16 ++ .../dataSetExample/writeExcelTest.xlsx | Bin 0 -> 9719 bytes .../tinyscript/interpret/FileObjectUtil.java | 120 ++++++++++----- 12 files changed, 452 insertions(+), 106 deletions(-) create mode 100644 org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java create mode 100644 org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java create mode 100644 org.tinygroup.tinyscript.excel/src/main/resources/excel.properties create mode 100644 org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts create mode 100644 org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcelTest.xlsx diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java index 8534472..c71d0c9 100644 --- a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/ReadCsvFunction.java @@ -11,10 +11,12 @@ import org.tinygroup.tinyscript.csv.CSVParser; import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; import org.tinygroup.vfs.FileObject; /** * 读取csv格式文件 + * * @author yancheng11334 * */ @@ -24,49 +26,44 @@ public class ReadCsvFunction extends AbstractScriptFunction { return "readCsv"; } - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { if (parameters == null || parameters.length == 0) { - throw new ScriptException(String.format("%s函数的参数为空!",getNames())); - }else if(parameters.length == 1 && parameters[0]!=null){ - return readCsv((String)parameters[0],"utf-8",context); - }else if(parameters.length == 2 && parameters[0]!=null && parameters[1]!=null){ - return readCsv((String)parameters[0],(String)parameters[1],context); - }else{ - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames())); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + return readCsv((String) parameters[0], "utf-8", context); + } else if (checkParameters(parameters, 2)) { + return readCsv((String) parameters[0], (String) parameters[1], context); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - }catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames()),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DataSet readCsv(String file,String encode,ScriptContext context) throws Exception{ - DataSet dataSet = extractDataSet(file,encode); + + private DataSet readCsv(String file, String encode, ScriptContext context) throws Exception { + DataSet dataSet = extractDataSet(file, encode); dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); return dataSet; } - - public DataSet extractDataSet(String file,String encode) - throws Exception { + + public DataSet extractDataSet(String file, String encode) throws Exception { FileObject fileObject = null; BufferedReader reader = null; - try{ + try { fileObject = FileObjectUtil.findFileObject(file, false); - reader = new BufferedReader(new InputStreamReader(fileObject.getInputStream(),encode)); - CSVParser parser = new CSVParser(reader,CSVFormat.DEFAULT); + reader = new BufferedReader(new InputStreamReader(fileObject.getInputStream(), encode)); + CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT); return parser.extractDataSet(); - }catch (Exception e) { - throw new Exception( - String.format("抽取csv文件%s,发生异常:", file ), e); + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getResourceMessage("excel", "file.find.error", file), e); } finally { - if(reader!=null){ - reader.close(); + if (reader != null) { + reader.close(); } - if(fileObject!=null){ - fileObject.clean(); + if (fileObject != null) { + fileObject.clean(); } } } diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java new file mode 100644 index 0000000..edc7ac7 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/csv/function/WriteCsvFunction.java @@ -0,0 +1,116 @@ +package org.tinygroup.tinyscript.csv.function; + +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.List; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.ScriptException; +import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.csv.CSVFormat; +import org.tinygroup.tinyscript.csv.CSVPrinter; +import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.vfs.FileObject; + +public class WriteCsvFunction extends AbstractScriptFunction { + + private static final String DEFAULT_ENCODE = "utf-8"; + private static final String DEFAULT_TYPE = "DEFAULT"; + + @Override + public String getNames() { + return "writeCsv"; + } + + @Override + public String getBindingTypes() { + return DataSet.class.getName(); + } + + @Override + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { + if (parameters == null || parameters.length < 2) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + DataSet dataSet = (DataSet) parameters[0]; + String filePath = (String) parameters[1]; + + switch (parameters.length) { + case 2: + writeCsv(dataSet, filePath, DEFAULT_ENCODE, 1, dataSet.getRows(), DEFAULT_TYPE); + break; + case 3: + if (parameters[2] instanceof String) { + writeCsv(dataSet, filePath, (String) parameters[2], 1, dataSet.getRows(), DEFAULT_TYPE); + } else { + writeCsv(dataSet, filePath, DEFAULT_ENCODE, (Integer) parameters[2], dataSet.getRows(), + DEFAULT_TYPE); + } + break; + case 4: + if (parameters[2] instanceof String) { + writeCsv(dataSet, filePath, (String) parameters[2], (Integer) parameters[3], dataSet.getRows(), + DEFAULT_TYPE); + } else { + writeCsv(dataSet, filePath, DEFAULT_ENCODE, (Integer) parameters[2], (Integer) parameters[3], + DEFAULT_TYPE); + } + break; + case 5: + if (parameters[2] instanceof String) { + writeCsv(dataSet, filePath, (String) parameters[2], (Integer) parameters[3], + (Integer) parameters[4], DEFAULT_TYPE); + } else { + writeCsv(dataSet, filePath, DEFAULT_ENCODE, (Integer) parameters[2], (Integer) parameters[3], + (String) parameters[4]); + } + break; + case 6: + writeCsv(dataSet, filePath, (String) parameters[2], (Integer) parameters[3], (Integer) parameters[4], + (String) parameters[5]); + break; + default: + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + return null; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + private void writeCsv(DataSet dataSet, String filePath, String encode, int start, int end, String type) + throws Exception { + FileObject csvFile = FileObjectUtil.getOrCreateFile(filePath, false); + CSVPrinter printer = null; + try { + printer = new CSVPrinter(new OutputStreamWriter(csvFile.getOutputStream(), encode), + (CSVFormat) (CSVFormat.class.getDeclaredField(type).get(CSVFormat.class))); + } catch (NoSuchFieldException e) { + throw new ScriptException(ResourceBundleUtil.getResourceMessage("excel", "csv.type.error", type)); + } + + List records = new ArrayList(); + + for (Field field : dataSet.getFields()) { + records.add(field.getName()); + } + printer.printRecord(records); + + for (int i = start; i <= end; i++) { + records = new ArrayList(); + for (int j = 1; j <= dataSet.getColumns(); j++) { + records.add(dataSet.getData(i, j)); + } + printer.printRecord(records); + } + printer.close(); + } + +} diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java index 7f838b4..0539f55 100644 --- a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/ReadExcelFunction.java @@ -1,6 +1,8 @@ package org.tinygroup.tinyscript.excel.function; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -12,10 +14,12 @@ import org.tinygroup.tinyscript.excel.SheetDataSet; import org.tinygroup.tinyscript.excel.util.ExcelUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; import org.tinygroup.vfs.FileObject; /** * 读取excel的函数 + * * @author yancheng11334 * */ @@ -25,59 +29,60 @@ public class ReadExcelFunction extends AbstractScriptFunction { return "readExcel"; } - - public Object execute(ScriptSegment segment, ScriptContext context, - Object... parameters) throws ScriptException { - try{ + public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { + try { if (parameters == null || parameters.length == 0) { - throw new ScriptException(String.format("%s函数的参数为空!",getNames())); - }else if(parameters.length == 1 && parameters[0]!=null){ - return readExcel((String)parameters[0],null,context); - }else if(parameters.length == 2 && parameters[0]!=null && parameters[1]!=null){ - return readExcel((String)parameters[0],(String)parameters[1],context); - }else{ - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames())); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); + } else if (checkParameters(parameters, 1)) { + return readExcel((String) parameters[0], null); + } else if (checkParameters(parameters, 2)) { + return readExcel((String) parameters[0], (String) parameters[1]); + } else { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - }catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException(String.format("%s函数的参数格式不正确!",getNames()),e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - - private DataSet readExcel(String file,String name,ScriptContext context) throws Exception{ - DataSet dataSet = extractDataSet(file,name); - dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); + + private Object readExcel(String file, String name) throws Exception { + Object dataSet = extractDataSet(file, name); return dataSet; } - - public DataSet extractDataSet(String file,String name) - throws Exception { + + public Object extractDataSet(String file, String name) throws Exception { Workbook wb = null; FileObject fileObject = null; try { fileObject = FileObjectUtil.findFileObject(file, false); - wb = ExcelUtil.readWorkbook(fileObject); - - if(name!=null){ - for (int i = 0; i < wb.getNumberOfSheets(); i++) { - Sheet sheet = wb.getSheetAt(i); - if(name.equals(sheet.getSheetName())){ - DataSet dataSet = createDataSet(sheet); - return dataSet; - } - } - return null; - }else{ - Sheet sheet = wb.getSheetAt(0); - DataSet dataSet = createDataSet(sheet); - return dataSet; - } - + wb = ExcelUtil.readWorkbook(fileObject); + + if (name != null) { + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + if (name.equals(sheet.getSheetName())) { + DataSet dataSet = createDataSet(sheet); + dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); + return dataSet; + } + } + return null; + } else { + List dataSets = new ArrayList(); + for (int i = 0; i < wb.getNumberOfSheets(); i++) { + Sheet sheet = wb.getSheetAt(i); + if (sheet.getPhysicalNumberOfRows() != 0) { + DataSet dataSet = createDataSet(sheet); + dataSet.setIndexFromOne(getScriptEngine().isIndexFromOne()); + dataSets.add(dataSet); + } + } + + return dataSets; + } } catch (Exception e) { - throw new Exception( - String.format("抽取excel文件%s,发生异常:", file ), e); + throw new ScriptException(ResourceBundleUtil.getResourceMessage("excel", "file.find.error", file), e); } finally { if (fileObject != null) { fileObject.clean(); @@ -100,10 +105,9 @@ public class ReadExcelFunction extends AbstractScriptFunction { * @throws Exception */ private DataSet createDataSet(Sheet sheet) throws Exception { - SheetDataSet dataSet = new SheetDataSet(sheet,null); + SheetDataSet dataSet = new SheetDataSet(sheet, null); dataSet.setName(sheet.getSheetName()); return dataSet; } - } diff --git a/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java new file mode 100644 index 0000000..b359385 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/java/org/tinygroup/tinyscript/excel/function/WriteExcelFunction.java @@ -0,0 +1,140 @@ +package org.tinygroup.tinyscript.excel.function; + +import java.util.List; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +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.function.AbstractScriptFunction; +import org.tinygroup.tinyscript.interpret.FileObjectUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; +import org.tinygroup.vfs.FileObject; + +public class WriteExcelFunction extends AbstractScriptFunction { + + @Override + public String getNames() { + return "writeExcel"; + } + + @Override + public String getBindingTypes() { + return DataSet.class.getName() + "," + List.class.getName(); + } + + @SuppressWarnings("unchecked") + @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.error", getNames())); + } + + switch (parameters.length) { + case 2: + writeExcel((String) parameters[1], parameters[0], null, 1, -1); + break; + case 3: + if (parameters[2] instanceof List) { + writeExcel((String) parameters[1], parameters[0], (List) parameters[2], 1, -1); + } else { + writeExcel((String) parameters[1], parameters[0], null, (Integer) parameters[2], -1); + } + break; + case 4: + if (parameters[2] instanceof List) { + writeExcel((String) parameters[1], parameters[0], (List) parameters[2], + (Integer) parameters[3], -1); + } else { + writeExcel((String) parameters[1], parameters[0], null, (Integer) parameters[2], + (Integer) parameters[3]); + } + break; + case 5: + writeExcel((String) parameters[1], parameters[0], (List) parameters[2], (Integer) parameters[3], + (Integer) parameters[4]); + break; + default: + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); + } + + return null; + } catch (Exception e) { + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); + } + } + + @SuppressWarnings("unchecked") + private void writeExcel(String fileUrl, Object dataSet, List sheetNames, int start, int end) + throws Exception { + Workbook wb = null; + FileObject excelFile = FileObjectUtil.getOrCreateFile(fileUrl, false); + + if (fileUrl.endsWith("xls")) { + wb = new HSSFWorkbook(); + } else if (fileUrl.endsWith("xlsx")) { + wb = new XSSFWorkbook(); + } + + if (dataSet instanceof DataSet) { + writeSheet(wb, (DataSet) dataSet, + (sheetNames == null || sheetNames.size() == 0) ? "sheet1" : sheetNames.get(0), start, + checkEnd((DataSet) dataSet, end)); + } else { + List dataSets = ((List) dataSet); + for (int i = 0; i < dataSets.size(); i++) { + + String sheetName = null; + if (sheetNames != null && sheetNames.size() > i) { + sheetName = sheetNames.get(i); + } else { + sheetName = "sheet" + (i + 1); + } + + writeSheet(wb, dataSets.get(i), sheetName, start, checkEnd(dataSets.get(i), end)); + } + } + + wb.write(excelFile.getOutputStream()); + + } + + private void writeSheet(Workbook wb, DataSet dataSet, String sheetName, int start, int end) throws Exception { + Sheet sheet = (Sheet) wb.createSheet(sheetName); + CellStyle style = wb.createCellStyle(); + + style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直 + style.setAlignment(CellStyle.ALIGN_CENTER);// 水平 + style.setWrapText(true);// 指定当单元格内容显示不下时自动换行 + + Row row = sheet.createRow(0); + Cell cell = null; + for (int i = 0; i < dataSet.getFields().size(); i++) { + cell = row.createCell(i); + cell.setCellValue(dataSet.getFields().get(i).getName()); + cell.setCellStyle(style); + } + + for (int i = 1 + start; i <= 1 + end; i++) { + row = sheet.createRow(i - start); + for (int j = 1; j <= dataSet.getFields().size(); j++) { + cell = row.createCell(j - 1); + cell.setCellValue(dataSet.getData(i, j).toString()); + cell.setCellStyle(style); + } + } + } + + private int checkEnd(DataSet dataSet, int end) throws Exception { + // 因为sheetdataset的data包括标题,所以计算rows时需要减一 + return end == -1 ? dataSet.getRows() - 1 : end <= dataSet.getRows() - 1 ? end : dataSet.getRows() - 1; + } +} diff --git a/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml b/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml index fa2ff72..c0190e6 100644 --- a/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml +++ b/org.tinygroup.tinyscript.excel/src/main/resources/excel.beans.xml @@ -10,5 +10,13 @@ + + + + + + diff --git a/org.tinygroup.tinyscript.excel/src/main/resources/excel.properties b/org.tinygroup.tinyscript.excel/src/main/resources/excel.properties new file mode 100644 index 0000000..895d690 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/resources/excel.properties @@ -0,0 +1,2 @@ +csv.type.error=CSV mode error, unsupported CSV mode +file.find.error=An exception occurred while extracting [%s] \ No newline at end of file diff --git a/org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties b/org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties new file mode 100644 index 0000000..75fd754 --- /dev/null +++ b/org.tinygroup.tinyscript.excel/src/main/resources/excel_zh_CN.properties @@ -0,0 +1,2 @@ +csv.type.error=\u0063\u0073\u0076\u6a21\u5f0f\u9519\u8bef\u002c\u4e0d\u652f\u6301\u7684\u0063\u0073\u0076\u6a21\u5f0f:[%s] +file.find.error=\u62bd\u53d6[%s]\u6587\u4ef6\uff0c\u53d1\u751f\u5f02\u5e38 \ No newline at end of file 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 6e0be3a..243f365 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 @@ -32,6 +32,8 @@ import org.tinygroup.tinyscript.collection.function.set.SetUnionFunction; import org.tinygroup.tinyscript.collection.function.set.SetXorFunction; import org.tinygroup.tinyscript.collection.objectitem.ListToListProcessor; import org.tinygroup.tinyscript.collection.objectitem.MapItemProcessor; +import org.tinygroup.tinyscript.csv.function.ReadCsvFunction; +import org.tinygroup.tinyscript.csv.function.WriteCsvFunction; import org.tinygroup.tinyscript.database.function.ExecuteSqlFunction; import org.tinygroup.tinyscript.database.function.QuerySqlFunction; import org.tinygroup.tinyscript.database.function.WriteDBFunction; @@ -73,6 +75,7 @@ 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.excel.function.ReadExcelFunction; +import org.tinygroup.tinyscript.excel.function.WriteExcelFunction; import org.tinygroup.tinyscript.expression.ExpressionUtil; import org.tinygroup.tinyscript.expression.Operator; import org.tinygroup.tinyscript.interpret.AttributeProcessor; @@ -192,6 +195,9 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new PreviewRowFunction()); addScriptFunction(new ReadExcelFunction()); + addScriptFunction(new WriteExcelFunction()); + addScriptFunction(new ReadCsvFunction()); + addScriptFunction(new WriteCsvFunction()); addScriptFunction(new ReadTxtFunction()); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv new file mode 100644 index 0000000..54d24aa --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeCsvTest.csv @@ -0,0 +1,5 @@ +,name,age +,һ,12 +Ǯ,,20 +,,34 +,,11.5 diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts new file mode 100644 index 0000000..da8a9b1 --- /dev/null +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcel.ts @@ -0,0 +1,16 @@ +dataSet1 = readExcel("/dataSetExample/writeExcelTest.xlsx"); +dataSet1.get(0).writeExcel("/dataSetExample/testExcel1.xlsx"); +dataSet1.writeExcel("/dataSetExample/testExcel2.xlsx",["mysheet"]); +dataSet1.writeExcel("/dataSetExample/testExcel3.xlsx",["mysheet"],2); +dataSet1.writeExcel("/dataSetExample/testExcel4.xlsx",1,2); +dataSet1.writeExcel("C:/Users/hspcadmin/Desktop/testExcel5.xlsx",["mysheet1","mysheet2"],1,2); + +dataSet1 = readCsv("/dataSetExample/writeCsvTest.csv","gbk"); +dataSet1.writeCsv("/dataSetExample/testCsv1.csv"); +dataSet1.writeCsv("/dataSetExample/testCsv2.csv",2); +dataSet1.writeCsv("/dataSetExample/testCsv3.csv","gbk"); +dataSet1.writeCsv("/dataSetExample/testCsv4.csv","gbk",2); +dataSet1.writeCsv("/dataSetExample/testCsv5.csv",2,3); +dataSet1.writeCsv("/dataSetExample/testCsv6.csv","gbk",2,3); +dataSet1.writeCsv("/dataSetExample/testCsv7.csv",1,4,"RFC4180"); +dataSet1.writeCsv("/dataSetExample/testCsv8.csv","gbk",2,3,"RFC4180"); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcelTest.xlsx b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/writeExcelTest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2a3536fa90650c3b1a455d6bca14cc2fc856d5c7 GIT binary patch literal 9719 zcmeHtbyQSq+y2lX-6>ro2t$K(N~bhP4$MdoARyfx(h|}j-3$@}5=uxn(xoDepdj## zp7*?-!}0sA@6X>_@4IKs-fOSD?`uE%exB>jt*L^7N&-L!U;+RD20+=FLE#f50DuG? z03ZfnA{)y(Il6%z-OL_%IfGqIxjY^0>GM&M*>eHNi2MJ${ReAc=t2LZZV*8``8mGA z3=xM?UNR9|IM*A&gcB4JJNxL_#8K7pjeXI_WXf-YptGKWkQ~~+Ez*O74-lH<~CuJoDP`}fB?O(+24EvRjE3%DOxwq(#oiPs#4tGQO# zPDO6h@T{+h!J^P0%b}*$lT)`xqzK-2O7O?sU4H(QsYZNN8YGilOLao%IA?u+Kn(y~ zU!wpt|3=wHT@ce3#5z<(FcKRXaYVfvgwwaL*e1Ji z@ySsUGq0#sRk4-f0c|Jq9$jN>0khQEX$VS?vem-a>Gp`E@zUNF^Z^}>CAWHa3%hhJ zpQZQABhShlJ^WltMq4P!8>%=O3;o3-C|`izCvS>}b&Y3q~uH=dAN48YkCH!Y+&|k)w($$70J-u2MTYfm}I| z(y#5qVrwNKt7_I?ExLN~ADAIt{GTjY!n$NfMmV-f6aat!1QsA>Ls7ZW0{d6tb_uay`st?e?D`kxQbDpV z{&4?pb=U85#b227qgc?w=JpE<$IYvOF0>9=lUyemR+Lm9-Myx92gKCiyx*q+EQ^70 zDM8K^g7oUa@x#}4tu2l!J}#TK@u}4YZ=J}8tqDY;K8@0Iq#H56>1U1Xp|9@V5DM#0 zGq0oWwpIZx2w1%R5HKYgo-Wf;@o4&Cke3l@SU6Xh-z}WjFNv4y8K*QFSloM7z&9TA z;aQ88huFVcL7&ETWbF{EA{b$3@exY{v4Z}(c4D*#9bbb8+Vnq38oVNBW0fa)O0Vmn z%SEaU%v$u6<)jgoaP+mWUrsDuPxLC>K=V0)cb7&z-buxj*y?%@&CGin zZdrv&Bg2j#tO`9@U-ig!Ks3T7bs?{+fTyp0C|FtEtZ2>*|Mb>@UCPw_R$Z_V zeRTE6s$J!~$KF$2)Cs-S!>g_2ROJHXPErg7hn{$qx94|@Ctcr0)bDD4rRtoy1M~?C zg1jwIsi!zJxEs}oxxAH+4ZyWF7^5hK$|%f+n>(&U=-H=n4(@e@Qi^U2zGQfZtzhj1$RIaCSZiug(#dM*Jn(&Q1=N@Wapc>6R{*#$jZR>%#0@K3~4D`TMw#UtVnt z>f=jtycuM?n%SonyZ$x-qqiPa%_q;1yxRS^P987e_w8Lb(bwY6V8%8LCdM%VSiq?# zY71p|b7E4U@M4r-L}@*8xKwM1+x<|ygL#sAUX$qNzE)taXEGAEhNEcRsSJ-+L&$Lo z2o@lkRZm7b`U+k-0pC4upEPIAlWOeaak%q^EGL95a zQI%xe)kjq^@-dv<{d0?~Zx;(4&@DQjthk8v<3u2_V!iwVKXQlapc}frXw%%wNTaM2 zXuJHWDKj&w4a@5@EY~4VN)3{@0mW07o+$K=C|v_qYo|Nk8LOB`J@3)S6bvUQ8a8dU z0DQ64JA(2arnLBmt1*!SNp7c&wMB_=Gs3?%-(F(}cAr9M$ZF}{@`SJ}w3?)Jc{FD- zoKt=eSP$KMr4+fow~pO~OC`+s4q0wQRW6d7n|QCs$!S0#J^c;}%VOyyVeEC8J>M<& z1(>IPQ|1z@y(PH6-nYtU4OTXwR`gzN`kbOzBJo3$>xtUEvVA!2X zYN7?Z%wbWZSCwZBoWi4M$A+_^|2d79V0LtC=^!H|m7F63Tab9xr10)|?(mRXhe+c!!R)LmMXehOHgrk`wx z>H$^RJ}maLbeTh}gSJcd)=@8&G(#8g?ao9(v+pHfmNwPkI6%@%`B4ojL=3;B?U+y3 zYv&eHWvfP|2w;Z!tKO<9*fHXzA~Yk-Hl-MAs*i^PH;LutxM^r}kuoF1arS2NZk^+l zhEU_{5T2lzj6m%&fpFmxCH*!MK4H-~L!z~Y_n%1K@y@+glO6zrG|&#E;M#MsuoC^= z!ta!&+Boai&+a^t4CIJN$vX|ePwPQu$_A>%W0S&O$S5gZRt5BRP2xq6HLrz2G4C{& z2`&eH-f_xwO$}4B6ILn{r=pj(kkrnjw20bBOcCiuQS zZ$Yp6)V?Uo5Ykf03Z(=!7aVR&lu+_xx+Uoh36&&ndRM;->}Wl%?Z;7m=|0QP|LoG0 z@c7icseJy6jaSnd8R-~tyj~2_nyQ~?a)>?NDr zDNi(hZGK(w+O{X8c1iQX2mcXA&>49KMF_6k7m)=|dQFY&u-*6^hT6R*jE%fu`>$u9@Ss9&R+xTL3oY=bH7?&6?3q7A_ zy%_MWG2?@I^ViAzU8vP%sA04%wnu=(Wf;GT&=uIgA5>u#f1p3kE%q$Qk@Tzc2j zfIBxgokunWGcUwSscrC{a!$4&hi+JrLuwAZ=kIn%*9w1nPl9zs1Ddy1H`Y zn*;+=?AlN*=1Yohzn;0;IIPkHiLE)MNH0+Tw`l6oin2!zM`joe-0F?{oEyIS!S}?q z4X-}O`O=9w7IX|N9*u-3i6odyIJ-wi>Y;~`5CbbJ26IS&cWR4618W>n ze63Ub1W!lQ?JWQgV^fG)1EU8TM ze$9Us9_V0)%QzrUxK(#1Kw>${k6Qw(9%pf@xYKMyHRe5+6xWcYmv?QS%>W zv~8C$*^VwLP6hjw#Vtw17wZj2#*9`Qlxs-BzSiWOL1ie%oX7$d-J9`{>#YlMTm7uK zIF{W_i8pZpZ({HU>9Ic>6OLd<>emHs2o`ksNtiBbS>8@!u}cn#q3s&K_`Z{Nk~>sh zi9{of0p&9iElC13w1uV4NkJ1{JQ!#gTAj9+Eyt}Hzn&Ca<&1KCor+2 zYsuqek6L_+7#p&Y+7Vl5^L^o~s>(hi{;8;1GJK;5Oq4gD`DiG_oQE(ZN1CbZ;5wD* zUPoVJB&0uNIJ*Ero>B&?6BT{)ix0X_&)2d!_@xbe(2;^MLUy1TQwGNBjh3r~TehFD zkRRp@mIrj9yne_3?ombW_VGE_Dup{ZVtoZ?N#{hUqa(ki?`#MwPN-db+?{W7v9O@e zBCSmG=u+!5t3v%WeiZA$XRB6MKn0B|A11CmCUQ{P zx)v*%IiYg6F4xFN+!pMh zktuhg>t?mJ@=Ov5PO=3T(wy$^2$lR(X~u(n)G!3Cbr7`1{g=|*yzIe$Xe(JI8o}j& z{m?6nJa4_>^4Q?rPzp@!(kYdkVYjmATC&;XRR(PtcuNqi1si2KE5pBe3={1`POP+yp! zkN27`qHrs(>fXy#Qg@$zG>_J>(5FLhJUEJQO>Zf>FWesW8F9oLIY``AFg9)B=p-~v z6|)_wk5N($NMI@1(Gt^37`^WpJ??CfeoU!bT|- zE5_LG7#?_@f4Lk%WQyg5iP5H`r)~Kk!8@!X54KWzN(d80!Xn!@iR$;Wj|2qB9Pe7s z(3wO{gwzwnW4mbkXj)^L1X(G(>x?q;sx8k|Mmr`NN1Kq}PswX_bn-kxf+E}WYiA;F zxh_9mUdQcrarF>;{0iPfhOPd#I9^wQFn?mK$BCN0FIiy5Hh%NVQzgl_qEu|_> z!B`hfpIXkMFMn>w3~jJn2@T%P8Arb8HE6gy@=Z!i>4Nj4tmnpk`d*Frcz=JtU?c}Z zh@tCh^F0i~O_cgsT4RE5)Xsi^LGH_sKge|{8)3tRDRg|2murJ&h#u#Ec`_n2FAzaO zx4AMkbZ4Q(8`}!U=>hfgHEwtk{P5)Q^iE8E{|mkk^%iWj>c!csD>l5@!)q_d7k$L% zw#n^Xk7xRcW|wP8YmSTWHmUjfO%{FKaNftLoO_52?QYzUrawIp8oK%|qp78g<_i#4 z6cCIiK-6EYovburPR_2}7S7H;*oPpQ+(6=Aj)}8NN(Rf>#$0&4- zd1F*NIQzZsZiT)a2Ntw$);IOx6ZR9_C!ZD?M&Eq+%+)k=>H5*Z=2d)rjzVJdl7OHc z1M9kJS8-Anc%^|mc7g1(g{#N6C@@wEN6HtxTTS6TRhzxowNVmMawxz8%(Pp2Okrr- zN;9J`_!;J&YJZz$FBEiqS$(HqwQpw|o#x2!dB;YLtTRh;+A77{upas7Yigq>i-$#T z-boPDkW|aoC~y?&48Rrc=lF!q?WzZp`f%RLHxBlTLqFps_jw=Hs7IDc!pQ+9#`L3# z@YY-$*Bj_zmXD4m<3CSlIS!l_w3_oy$?XOjl;>;VVU^e8s+lb$fClKyB>k^X54TIW zgOVhM&SCbqXSS4wy-`TF`?$@=vO}I=>Uwp=@jn{5M8OT17yX0iz{sB zzku^6#A!_JM}GBVGCF5vhqJ93wDar%#Y18{v@pX(h3TT)D;bmB9562V3CAgu}D z%J*ag!P^>n-aPT$@PvtSC5e%bJTW#wIT8Wi5q9;TR=2(c)k+pIaqkg-wm+<{Gr~u? zfnhpeH@6?oiu=Yn50@p>(K43+R0pbAM9S!@80qYM+u09_UI<}Ad%I>EVQz^$PN+I0 zHU6|KM8-Rzkxxd1J_9R4`oy0;;8r&f@sQt)qj96IP69zNErbUk{42q%oM7PpGVF)a z{@8pHwN$!6B%#Y_*RuWInGM~gdAm|z4LnqiC?|%OJ5g#>i4eHIQ-)(>FvAARS=Pm3 zlFHH4!=^EOiUqeaDX5GlYLrL5mV4k*nY&Lo<4!tJ#V!fS2LM^+z)pFV-GC?xckzU| z35wtmGZ;97HZM{F>`UF3;?497KU!tO|N_0Eqb_CwISa zg;?7^QxJgqW;6(OlT$s3iAED*f z@4%~Bv5v5kzF4Zqy+|o9SCXmCtN6fi+vFY1sfO@F(Ir88TD*rHn#5u~w;AXe=>pU62rSnOJ72_)O#9ZgRSgn(?e`NoR z@T;qagnSnfll}gKkw10(=kYh6k7%m=9pLZn>pum59P1IT;xEnYn}UDu=>1i24$%$x z-}`$vac=f?ej!mKY7;lQJU4}JHXnWo*Wdane6tmC6X0g8=NCXI;lH2$|Em1l1iYDx z{{jprx(WEJkn(>=5k$n}|5D1ohV}FCGrzxyax>BVHI_}%-=h3XJ8z=gOa^|Tgd=K0 zh_U=5HMogzGcx{#&_?+O!oTC>o1%Y@TYd=w0ERRGz|AP;ru0qc@JpVT?&pJVxQ5@l oikqN+xAeat0e}_+=)Z^br`^|7K|}BX0Kh~1>JXITX8dvXKbi4sy#N3J literal 0 HcmV?d00001 diff --git a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java index 10fcc51..3ac7f34 100644 --- a/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java +++ b/org.tinygroup.tinyscriptbase/src/main/java/org/tinygroup/tinyscript/interpret/FileObjectUtil.java @@ -1,54 +1,104 @@ package org.tinygroup.tinyscript.interpret; +import java.io.File; +import java.io.IOException; + import org.tinygroup.beancontainer.BeanContainerFactory; import org.tinygroup.fileresolver.FileResolver; +import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.vfs.FileObject; import org.tinygroup.vfs.VFS; +import org.tinygroup.vfs.impl.FileObjectImpl; +import org.tinygroup.vfs.impl.FileSchemaProvider; public final class FileObjectUtil { - private FileObjectUtil(){ - + private FileObjectUtil() { + } - - public static FileObject findFileObject(String path,boolean findInJar) throws Exception{ - //优先根据路径匹配 + + public static FileObject findFileObject(String path, boolean findInJar) throws Exception { + // 优先根据路径匹配 FileObject fileObject = VFS.resolveFile(path); - if(fileObject!=null && fileObject.isExist()){ - return fileObject; - } - //遍历资源扫描器 - FileResolver fileResolver = BeanContainerFactory - .getBeanContainer( - FileObjectUtil.class.getClassLoader()) - .getBean(FileResolver.BEAN_NAME); - if(fileResolver!=null){ - for(String sPath:fileResolver.getScanningPaths()){ - FileObject dir = VFS.resolveFile(sPath); - if(!dir.isInPackage() || findInJar){ - FileObject result = findFileObject(dir,path); - if(result!=null){ - return result; - } - } - } + if (fileObject != null && fileObject.isExist()) { + return fileObject; + } + // 遍历资源扫描器 + FileResolver fileResolver = BeanContainerFactory.getBeanContainer(FileObjectUtil.class.getClassLoader()) + .getBean(FileResolver.BEAN_NAME); + if (fileResolver != null) { + for (String sPath : fileResolver.getScanningPaths()) { + FileObject dir = VFS.resolveFile(sPath); + if (!dir.isInPackage() || findInJar) { + FileObject result = findFileObject(dir, path); + if (result != null) { + return result; + } + } + } } return null; } - - private static FileObject findFileObject(FileObject fileObject,String path){ - - if(fileObject.getPath().equals(path)){ - return fileObject; + + public static FileObject getOrCreateFile(String fileUrl, boolean findInJar) throws ScriptException, IOException { + + String parentFile = fileUrl.substring(0, fileUrl.lastIndexOf("/")); + String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1); + + FileObject fileObject = VFS.resolveFile(parentFile); + if (fileObject != null && fileObject.isExist()) { + return getOrCreateChildFile(fileObject, fileName); } - if(fileObject.getChildren()!=null){ - for(FileObject child:fileObject.getChildren()){ - FileObject result = findFileObject(child,path); - if(result!=null){ - return result; - } - } + + // 遍历资源扫描器 + FileResolver fileResolver = BeanContainerFactory.getBeanContainer(FileObjectUtil.class.getClassLoader()) + .getBean(FileResolver.BEAN_NAME); + if (fileResolver != null) { + for (String sPath : fileResolver.getScanningPaths()) { + FileObject dir = VFS.resolveFile(sPath); + if (!dir.isInPackage() || findInJar) { + FileObject result = getOrCreateChildFile(findFileObject(dir, parentFile), fileName); + if (result != null && result.isExist()) { + return result; + } + } + } } return null; + + } + + private static FileObject findFileObject(FileObject fileObject, String path) { + + if (fileObject.getPath().equals(path)) { + return fileObject; + } + if (fileObject.getChildren() != null) { + for (FileObject child : fileObject.getChildren()) { + FileObject result = findFileObject(child, path); + if (result != null) { + return result; + } + } + } + return null; + } + + private static FileObject getOrCreateChildFile(FileObject parent, String fileName) throws IOException { + + if (parent == null) { + return null; + } + + if (parent.getChild(fileName) == null) { + File file = new File(parent.getAbsolutePath() + File.separator + fileName); + if (file.createNewFile()) { + return new FileObjectImpl(new FileSchemaProvider(), file); + } + } else { + return parent.getChild(fileName); + } + + return null; } } -- Gitee From 451704a2008a99f12b66db1a7870d1df0169ee6c Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Fri, 15 Sep 2017 13:58:10 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3int=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8C=85=E8=A3=85=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5=E4=B8=8D=E5=8F=AF=E8=BE=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java index 440d0dd..366e485 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/AbstractDataSet.java @@ -33,7 +33,7 @@ public abstract class AbstractDataSet implements DataSet { throw new Exception("本数据集为只读数据集,不可以修改数据!"); } - protected int getColumn(String fieldName) { + protected Integer getColumn(String fieldName) { return columnIndex.get(fieldName.toUpperCase()); } -- Gitee From 781c9bf50da8b7e3414734cd00aaee78bae3e76d Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sun, 17 Sep 2017 10:57:30 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BA=8F=E8=A1=A8?= =?UTF-8?q?=E9=9B=86=E5=90=88=E8=BF=90=E7=AE=97=EF=BC=88=E7=8E=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=89=80=E6=9C=89=E5=BA=8F=E8=A1=A8=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tinyscript/dataset/RowComparator.java | 9 ++ .../AbstractDataSetOperateFunction.java | 79 +++++++++-------- .../function/DataSetIntersectionFunction.java | 59 +++++-------- .../function/DataSetSubtractFunction.java | 58 +++++-------- .../function/DataSetUnionFunction.java | 68 +++++---------- .../dataset/function/DataSetXorFunction.java | 87 ++++++------------- .../dataset/impl/DefaultDataSetRow.java | 37 ++++++-- .../dataset/impl/LambdaRowComparator.java | 54 ++++++++++++ .../dataset/impl/ListRowComparator.java | 43 +++++++++ .../tinyscript/dataset/util/DataSetUtil.java | 29 ++++++- .../resources/dataSetExample/intersect.ts | 2 +- .../test/resources/dataSetExample/subtract.ts | 4 +- .../test/resources/dataSetExample/union.ts | 2 +- .../src/test/resources/dataSetExample/xor.ts | 2 +- 14 files changed, 306 insertions(+), 227 deletions(-) create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java create mode 100644 org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java new file mode 100644 index 0000000..75fa0d8 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/RowComparator.java @@ -0,0 +1,9 @@ +package org.tinygroup.tinyscript.dataset; + +public interface RowComparator { + + public boolean isEqual(DataSetRow o1, DataSetRow o2); + + public int countHash(DataSetRow row); + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java index 006bfc0..6d55a4f 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/AbstractDataSetOperateFunction.java @@ -1,13 +1,19 @@ package org.tinygroup.tinyscript.dataset.function; import java.util.ArrayList; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; import org.tinygroup.tinyscript.dataset.Field; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.RowComparator; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; +import org.tinygroup.tinyscript.dataset.impl.LambdaRowComparator; +import org.tinygroup.tinyscript.dataset.impl.ListRowComparator; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; import org.tinygroup.tinyscript.function.AbstractScriptFunction; import org.tinygroup.tinyscript.interpret.LambdaFunction; @@ -19,6 +25,12 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct return DataSet.class.getName(); } + /**批量转换主键(string→int) + * @param dataSet + * @param pks + * @return + * @throws Exception + */ @SuppressWarnings("unchecked") protected List showPkIndex(DataSet dataSet, Object pks) throws Exception { List pksIndex = new ArrayList(); @@ -26,51 +38,50 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct for (String pk : (List) pks) { int pkIndex = DataSetUtil.getFieldIndex(dataSet, pk); if (pkIndex != -1) { - pksIndex.add(pkIndex); + pksIndex.add(dataSet.isIndexFromOne() ? pkIndex + 1 : pkIndex); } } } else if (pks instanceof String) { int pkIndex = DataSetUtil.getFieldIndex(dataSet, (String) pks); if (pkIndex != -1) { - pksIndex.add(pkIndex); + pksIndex.add(dataSet.isIndexFromOne() ? pkIndex + 1 : pkIndex); } } return pksIndex; } - protected int checkRowData(Object[] rowData, Object[][] dataArray, List pks) { - for (int i = 0; i < dataArray.length; i++) { - boolean flag = true; - for (int pk : pks) { - if (!rowData[pk].equals(dataArray[i][pk])) { - flag = false; - break; - } - } - if (flag) { - return i; - } + /**创建行集合 + * @param dataSet + * @param pks + * @param context + * @return + * @throws Exception + */ + protected Set createDataSetRows(AbstractDataSet dataSet, Object pks, ScriptContext context) + throws Exception { + Set rows = new HashSet(); + for (int i = 1; i <= dataSet.getRows(); i++) { + rows.add(new DefaultDataSetRow(dataSet, i, createRowComparator(dataSet, pks, context))); } - return -1; + return rows; } - protected int checkRowData(SimpleDataSet dataSet1, SimpleDataSet dataSet2, int row, LambdaFunction pks, - ScriptContext context) throws Exception { - int flag = -1; - for (int j = 1; j <= dataSet2.getRows(); j++) { - HashMap map1 = new HashMap(); - HashMap map2 = new HashMap(); - for (Field field : dataSet1.getFields()) { - int col = DataSetUtil.getFieldIndex(dataSet1, field.getName()); - map1.put(field.getName(), dataSet1.getData(row, dataSet1.getShowIndex(col))); - map2.put(field.getName(), dataSet2.getData(j, dataSet2.getShowIndex(col))); - } - if ((Boolean) (((LambdaFunction) pks).execute(context, map1, map2).getResult())) { - flag = j; - break; - } + /** + * 创建行比较器 + * @param dataSet + * @param pks + * @param context + * @return + * @throws Exception + */ + protected RowComparator createRowComparator(DataSet dataSet, Object pks, ScriptContext context) throws Exception { + if (pks instanceof List || pks instanceof String) { + List pksIndex = showPkIndex(dataSet, pks); + return new ListRowComparator(pksIndex); + } else if (pks instanceof LambdaFunction) { + return new LambdaRowComparator((LambdaFunction) pks, context); } - return flag; + return null; } /** @@ -96,7 +107,7 @@ public abstract class AbstractDataSetOperateFunction extends AbstractScriptFunct return true; } - protected abstract DataSet operate(SimpleDataSet dataArray1, SimpleDataSet dataArray2, Object pks, + protected abstract DataSet operate(AbstractDataSet dataArray1, AbstractDataSet dataArray2, Object pks, ScriptContext context) throws Exception; } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java index 59dea62..73c996b 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetIntersectionFunction.java @@ -1,15 +1,17 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction { @@ -27,31 +29,24 @@ public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("intersect函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); + } else { - throw new ScriptException("intersect函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("inersect函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } @@ -65,25 +60,17 @@ public class DataSetIntersectionFunction extends AbstractDataSetOperateFunction * @return * @throws Exception */ - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List result = new ArrayList(); - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) != -1) { - result.add(i - 1); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) != -1) { - result.add(i - 1); - } + Set newRows = new HashSet(); + Set set = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + if (set.contains(row)) { + newRows.add(row); } } - return DataSetUtil.createDynamicDataSet(dataSet1, result); + return DataSetUtil.createDynamicDataSet(newRows); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java index d2308c7..1105160 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetSubtractFunction.java @@ -1,15 +1,16 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; import org.tinygroup.tinyscript.dataset.util.DataSetUtil; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetSubtractFunction extends AbstractDataSetOperateFunction { @Override @@ -26,54 +27,37 @@ public class DataSetSubtractFunction extends AbstractDataSetOperateFunction { public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("union函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); + } else { - throw new ScriptException("union函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("union函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List result = new ArrayList(); - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) == -1) { - result.add(i - 1); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) == -1) { - result.add(i - 1); - } + Set set = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + if (set.contains(row)) { + set.remove(row); } } - - return DataSetUtil.createDynamicDataSet(dataSet1, result); + return DataSetUtil.createDynamicDataSet(set); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java index 08d45a6..27ad841 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetUnionFunction.java @@ -1,14 +1,16 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.LinkedList; -import java.util.List; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetUnionFunction extends AbstractDataSetOperateFunction { @@ -26,65 +28,35 @@ public class DataSetUnionFunction extends AbstractDataSetOperateFunction { public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("unite函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); } else { - throw new ScriptException("unite函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("unite函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } @Override - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List resultArray = new LinkedList(); - for (int i = 0; i < dataSet2.getRows(); i++) { - resultArray.add(dataSet2.getDataArray()[i]); + Set set1 = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + set1.add(row); } - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex) == -1) { - resultArray.add(dataSet1.getDataArray()[i - 1]); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - if (checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context) == -1) { - resultArray.add(dataSet1.getDataArray()[i - 1]); - } - - } - } - - Object[][] newArray = new Object[resultArray.size()][]; - for (int i = 0; i < newArray.length; i++) { - newArray[i] = resultArray.get(i); - } - - return new SimpleDataSet(dataSet1.getFields(), newArray, dataSet1.isIndexFromOne()); + return DataSetUtil.createDynamicDataSet(set1); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java index eb56831..7e380f3 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/function/DataSetXorFunction.java @@ -1,14 +1,17 @@ package org.tinygroup.tinyscript.dataset.function; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import org.tinygroup.tinyscript.ScriptContext; import org.tinygroup.tinyscript.ScriptException; import org.tinygroup.tinyscript.ScriptSegment; +import org.tinygroup.tinyscript.dataset.AbstractDataSet; import org.tinygroup.tinyscript.dataset.DataSet; -import org.tinygroup.tinyscript.dataset.impl.SimpleDataSet; -import org.tinygroup.tinyscript.interpret.LambdaFunction; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.impl.DefaultDataSetRow; +import org.tinygroup.tinyscript.dataset.util.DataSetUtil; +import org.tinygroup.tinyscript.interpret.ResourceBundleUtil; public class DataSetXorFunction extends AbstractDataSetOperateFunction { @@ -21,78 +24,42 @@ public class DataSetXorFunction extends AbstractDataSetOperateFunction { public Object execute(ScriptSegment segment, ScriptContext context, Object... parameters) throws ScriptException { try { if (parameters == null || parameters.length == 0) { - throw new ScriptException("xor函数的参数为空!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.empty", getNames())); } else if (checkParameters(parameters, 3)) { - if (parameters[0].getClass() != parameters[1].getClass()) { - throw new ScriptException("参数类型类型不一致不支持集合运算"); - } - - DataSet dataSet1 = (DataSet) parameters[0]; - DataSet dataSet2 = (DataSet) parameters[1]; + AbstractDataSet dataSet1 = (AbstractDataSet) parameters[0]; + AbstractDataSet dataSet2 = (AbstractDataSet) parameters[1]; if (!checkField(dataSet1, dataSet2)) { - throw new ScriptException("序表参数不一致"); + throw new ScriptException( + ResourceBundleUtil.getResourceMessage("dataset", "dataset.fields.inconsistent")); } - if (dataSet1 instanceof SimpleDataSet) { - return operate((SimpleDataSet) dataSet1, (SimpleDataSet) dataSet2, parameters[2], context); - } else { - throw new ScriptException("不支持的序表类型"); - } + return operate(dataSet1, dataSet2, parameters[2], context); + } else { - throw new ScriptException("xor函数的参数格式不正确!"); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.parameter.error", getNames())); } - } catch (ScriptException e) { - throw e; } catch (Exception e) { - throw new ScriptException("xor函数执行错误!", e); + throw new ScriptException(ResourceBundleUtil.getDefaultMessage("function.run.error", getNames()), e); } } @Override - protected DataSet operate(SimpleDataSet dataSet1, SimpleDataSet dataSet2, Object pks, ScriptContext context) + protected DataSet operate(AbstractDataSet dataSet1, AbstractDataSet dataSet2, Object pks, ScriptContext context) throws Exception { - List result = new ArrayList(); - List equalResult = new ArrayList(); - - if (pks instanceof List || pks instanceof String) { - List pksIndex = showPkIndex(dataSet1, pks); - for (int i = 1; i <= dataSet1.getRows(); i++) { - int flag = checkRowData(dataSet1.getDataArray()[i - 1], dataSet2.getDataArray(), pksIndex); - if (flag == -1) { - result.add(i - 1); - } else { - equalResult.add(flag + 1); - } - } - } else if (pks instanceof LambdaFunction) { - for (int i = 1; i <= dataSet1.getRows(); i++) { - int flag = checkRowData(dataSet1, dataSet2, i, (LambdaFunction) pks, context); - if (flag == -1) { - result.add(i - 1); - }else { - equalResult.add(flag); - } + Set newRows = new HashSet(); + Set set = createDataSetRows(dataSet1, pks, context); + for (int i = 1; i <= dataSet2.getRows(); i++) { + DataSetRow row = new DefaultDataSetRow(dataSet2, i, createRowComparator(dataSet2, pks, context)); + if (!set.contains(row)) { + newRows.add(row); + } else { + set.remove(row); } } - - Object[][] newArray = new Object[dataSet2.getRows() + result.size()][]; - System.arraycopy(dataSet2.getDataArray(), 0, newArray, 0, dataSet2.getRows()); - - for (int i = dataSet2.getRows(); i < newArray.length; i++) { - newArray[i] = dataSet1.getDataArray()[result.get(i - dataSet1.getRows())]; - } - - SimpleDataSet uniteDataSet = new SimpleDataSet(dataSet1.getFields(), newArray, dataSet1.isIndexFromOne()); - - int count = 0; - for (int i : equalResult) { - uniteDataSet.deleteRow(i - count); - count++; - } - - return uniteDataSet; + newRows.addAll(set); + return DataSetUtil.createDynamicDataSet(newRows); } } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java index bfd84b2..19c8e1f 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/DefaultDataSetRow.java @@ -5,22 +5,47 @@ import java.util.List; import org.tinygroup.tinyscript.dataset.DataSet; import org.tinygroup.tinyscript.dataset.DataSetRow; import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.RowComparator; /** * 默认的数据集行对象实现 + * * @author yancheng11334 * */ -public class DefaultDataSetRow implements DataSetRow{ +public class DefaultDataSetRow implements DataSetRow { - private DataSet dataSet; - private int row; //显示值 - - public DefaultDataSetRow(DataSet dataSet,int row) throws Exception{ + private DataSet dataSet; + private int row; // 显示值 + private RowComparator comparator; + + @Override + public boolean equals(Object o) { + if (comparator == null) { + return super.equals(o); + } + return comparator.isEqual(this, (DataSetRow) o); + } + + @Override + public int hashCode() { + if (comparator == null) { + return super.hashCode(); + } + return comparator.countHash(this); + } + + public DefaultDataSetRow(DataSet dataSet, int row) throws Exception { this.dataSet = dataSet; this.row = row; } - + + public DefaultDataSetRow(DataSet dataSet, int row, RowComparator comparator) throws Exception { + this.dataSet = dataSet; + this.row = row; + this.comparator = comparator; + } + public List getFields() { return dataSet.getFields(); } diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java new file mode 100644 index 0000000..5114ba6 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/LambdaRowComparator.java @@ -0,0 +1,54 @@ +package org.tinygroup.tinyscript.dataset.impl; + +import org.tinygroup.tinyscript.ScriptContext; +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.Field; +import org.tinygroup.tinyscript.dataset.RowComparator; +import org.tinygroup.tinyscript.impl.DefaultScriptContext; +import org.tinygroup.tinyscript.interpret.LambdaFunction; + +public class LambdaRowComparator implements RowComparator { + + private LambdaFunction compareFunction; + private ScriptContext context; + + public LambdaRowComparator(LambdaFunction compareFunction, ScriptContext context) { + this.compareFunction = compareFunction; + this.context = context; + } + + @Override + public boolean isEqual(DataSetRow o1, DataSetRow o2) { + try { + String result1 = compareFunction.execute(createContext(o1)).getResult().toString(); + String result2 = compareFunction.execute(createContext(o2)).getResult().toString(); + return result1.equals(result2); + } catch (Exception e) { + return false; + } + } + + @Override + public int countHash(DataSetRow row) { + try { + String result = compareFunction.execute(createContext(row)).getResult().toString(); + return result.hashCode(); + } catch (Exception e) { + return 0; + } + + } + + private ScriptContext createContext(DataSetRow row) { + ScriptContext sub = new DefaultScriptContext(); + sub.setParent(context); + for (Field field : row.getFields()) { + try { + sub.put(field.getName(), row.getData(field.getName())); + } catch (Exception e) { + } + } + return sub; + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java new file mode 100644 index 0000000..5e84a54 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/impl/ListRowComparator.java @@ -0,0 +1,43 @@ +package org.tinygroup.tinyscript.dataset.impl; + +import java.util.List; + +import org.tinygroup.tinyscript.dataset.DataSetRow; +import org.tinygroup.tinyscript.dataset.RowComparator; + +public class ListRowComparator implements RowComparator { + + private List pks; + + public ListRowComparator(List pks) { + this.pks = pks; + } + + @Override + public boolean isEqual(DataSetRow o1, DataSetRow o2) { + for (Integer i : pks) { + try { + if (!(o1.getData(i).equals(o2.getData(i)))) { + return false; + } + } catch (Exception e) { + return false; + } + } + return true; + } + + @Override + public int countHash(DataSetRow row){ + int hash = 0; + for (Integer i : pks) { + try { + hash += row.getData(i).toString().hashCode(); + } catch (Exception e) { + //发生异常跳过当前hash值 + } + } + return hash; + } + +} diff --git a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java index 0172be2..338970c 100644 --- a/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java +++ b/org.tinygroup.tinyscript.dataset/src/main/java/org/tinygroup/tinyscript/dataset/util/DataSetUtil.java @@ -46,6 +46,26 @@ public final class DataSetUtil { return new SimpleDataSet(fields, dataArray); } + /** + * 构建动态数据集 + * + * @param set + * @return + * @throws Exception + */ + public static DynamicDataSet createDynamicDataSet(Set set) throws Exception { + List fields = set.iterator().next().getFields(); + Object[][] data = new Object[set.size()][fields.size()]; + int rowId = 0; + for (DataSetRow row : set) { + for (int i = 0; i < fields.size(); i++) { + data[rowId][i] = row.getData(i + 1); + } + rowId++; + } + return new SimpleDataSet(fields, data, set.iterator().next().isIndexFromOne()); + } + /** * 构建动态数据集 * @@ -238,9 +258,10 @@ public final class DataSetUtil { } return -1; } - + /** * 返回索引字段对应的列 + * * @param fields * @param colName * @return @@ -405,4 +426,10 @@ public final class DataSetUtil { return columns; } + public static Set createDataSetRows(DataSet dataSet) { + Set result = new HashSet(); + + return result; + } + } diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts index 708699b..78539cb 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/intersect.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.intersect(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.intersect(dataSet2,()->{ return name+"|"+weight; }); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts index 7c06410..5e7ba78 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/subtract.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.subtract(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.subtract(dataSet2,()->{return name+"|"+weight;}); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); @@ -8,7 +8,7 @@ for(i = 1;i<=result.getRows();i++){ println(); } println("================================================================"); -result = dataSet2.subtract(dataSet1,["name","weight"]); +result = dataSet1.subtract(dataSet2,["name","weight"]); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts index 0a68e53..565acdb 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/union.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.unite(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.unite(dataSet2,()->{ return name+"|"+weight; }); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); diff --git a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts index e2f6466..ae9d239 100644 --- a/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts +++ b/org.tinygroup.tinyscript/src/test/resources/dataSetExample/xor.ts @@ -1,6 +1,6 @@ dataSet1 = readTxt("/dataSetExample/data1.txt"); dataSet2 = readTxt("/dataSetExample/data2.txt"); -result = dataSet1.xor(dataSet2,(a,b)->{ return a.name==b.name&&a.weight==b.weight; }); +result = dataSet1.xor(dataSet2,()->{ return name+"|"+weight; }); for(i = 1;i<=result.getRows();i++){ for(j=1;j<=result.getColumns();j++){ print(result[i][j]+" "); -- Gitee From 7e0f4f76b81ef3505a325297ede614673fff2e93 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sun, 17 Sep 2017 10:58:54 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0dataset=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/dataset.properties | 1 + .../src/main/resources/dataset_zh_CN.properties | 1 + 2 files changed, 2 insertions(+) create mode 100644 org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties create mode 100644 org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties diff --git a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties new file mode 100644 index 0000000..b120ff2 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset.properties @@ -0,0 +1 @@ +dataset.fields.inconsistent=Order table parameters are inconsistent! \ No newline at end of file diff --git a/org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties new file mode 100644 index 0000000..23ec379 --- /dev/null +++ b/org.tinygroup.tinyscript.dataset/src/main/resources/dataset_zh_CN.properties @@ -0,0 +1 @@ +dataset.fields.inconsistent=\u5e8f\u8868\u53c2\u6570\u4e0d\u4e00\u81f4! \ No newline at end of file -- Gitee From 67d83b8eea4929544753da0186bdfccca6153c82 Mon Sep 17 00:00:00 2001 From: fujie <405295521@qq.com> Date: Sun, 17 Sep 2017 11:02:48 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=BA=8F=E8=A1=A8?= =?UTF-8?q?=E9=9B=86=E5=90=88=E8=BF=90=E7=AE=97=E7=9B=B8=E5=85=B3=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tinyscript/impl/DefaultTinyScriptEngine.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 243f365..55392a7 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 @@ -52,6 +52,7 @@ import org.tinygroup.tinyscript.dataset.function.DataSetForEachFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupDynamicFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupFunction; import org.tinygroup.tinyscript.dataset.function.DataSetGroupStagedFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetIntersectionFunction; import org.tinygroup.tinyscript.dataset.function.DataSetJoinFunction; import org.tinygroup.tinyscript.dataset.function.DataSetLimitFunction; import org.tinygroup.tinyscript.dataset.function.DataSetMatchFunction; @@ -61,7 +62,10 @@ import org.tinygroup.tinyscript.dataset.function.DataSetReplaceFunction; import org.tinygroup.tinyscript.dataset.function.DataSetSelectFunction; import org.tinygroup.tinyscript.dataset.function.DataSetSortFunction; import org.tinygroup.tinyscript.dataset.function.DataSetSubFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetSubtractFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetUnionFunction; import org.tinygroup.tinyscript.dataset.function.DataSetUpdateFunction; +import org.tinygroup.tinyscript.dataset.function.DataSetXorFunction; import org.tinygroup.tinyscript.dataset.function.FirstRowFunction; import org.tinygroup.tinyscript.dataset.function.GroupDataSetAggregateFunction; import org.tinygroup.tinyscript.dataset.function.GroupDataSetFilterFunction; @@ -161,6 +165,10 @@ public class DefaultTinyScriptEngine extends DefaultScriptEngine implements Scri addScriptFunction(new PermutationFunction()); addScriptFunction(new AllPermutationFunction()); + addScriptFunction(new DataSetIntersectionFunction()); + addScriptFunction(new DataSetSubtractFunction()); + addScriptFunction(new DataSetUnionFunction()); + addScriptFunction(new DataSetXorFunction()); addScriptFunction(new DataSetLimitFunction()); addScriptFunction(new DataSetCopyFunction()); addScriptFunction(new DataSetRemoveFunction()); -- Gitee