From 90b90588e03403171ec0339be5fb40e0eb7a42e9 Mon Sep 17 00:00:00 2001 From: Viet Le Date: Tue, 11 Feb 2025 14:56:52 +0000 Subject: [PATCH 1/2] Allow using BatchRequest --- Excel_Adapter/CRUD/Read/Read.cs | 35 ++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Excel_Adapter/CRUD/Read/Read.cs b/Excel_Adapter/CRUD/Read/Read.cs index 16d2133..6a242b9 100644 --- a/Excel_Adapter/CRUD/Read/Read.cs +++ b/Excel_Adapter/CRUD/Read/Read.cs @@ -26,12 +26,10 @@ using BH.oM.Adapter; using BH.oM.Adapters.Excel; using BH.oM.Base; -using BH.oM.Data.Collections; using BH.oM.Data.Requests; using ClosedXML.Excel; using System; using System.Collections.Generic; -using System.Data; using System.IO; using System.Linq; @@ -68,6 +66,16 @@ protected override IEnumerable Read(IRequest request, ActionConfig return new List(); } + return ReadExcel(workbook, request, actionConfig); + } + + + /***************************************************/ + /**** Private Methods ****/ + /***************************************************/ + + private List ReadExcel(XLWorkbook workbook, IRequest request, ActionConfig actionConfig) + { if (request is ObjectRequest) { List result = ReadExcel(workbook, ((ObjectRequest)request).Worksheet, ((ObjectRequest)request).Range, true).OfType().ToList(); @@ -81,6 +89,8 @@ protected override IEnumerable Read(IRequest request, ActionConfig return ReadExcel(workbook, ((CellContentsRequest)request).Worksheet, ((CellContentsRequest)request).Range, false); else if (request is WorksheetsRequest) return ReadExcel(workbook, ((WorksheetsRequest)request)); + else if (request is BatchRequest batchRequest) + return batchRequest.Requests.SelectMany(x => ReadExcel(workbook, x, actionConfig)).ToList(); else { BH.Engine.Base.Compute.RecordError($"Requests of type {request?.GetType()} are not supported by the Excel adapter."); @@ -88,18 +98,15 @@ protected override IEnumerable Read(IRequest request, ActionConfig } } - - /***************************************************/ - /**** Private Methods ****/ /***************************************************/ private List ReadExcel(XLWorkbook workbook, WorksheetsRequest request) { - var worksheets = Worksheets(workbook, null); + IEnumerable worksheets = Worksheets(workbook, null); List sheets = worksheets.Select(x => { - var sheet = new BH.oM.Adapters.Excel.Worksheet(); + Worksheet sheet = new BH.oM.Adapters.Excel.Worksheet(); sheet.Name = x.Name; return sheet; }).ToList(); @@ -120,13 +127,13 @@ private List ReadExcel(XLWorkbook workbook, string worksheet, CellR if (string.IsNullOrEmpty(range.From.Column)) range.From.Column = "A"; - if(range.From.Row == -1) + if (range.From.Row == -1) range.From.Row = 1; if (string.IsNullOrEmpty(range.To.Column)) range.To.Column = MaximumColumnName(workbook, worksheet); - if(range.To.Row == -1) + if (range.To.Row == -1) range.To.Row = MaximumRowNumber(workbook, worksheet); rangeString = range.ToExcel(); @@ -255,7 +262,7 @@ private List CreateCustomObjects(List rows) CustomObject result = new CustomObject(); Dictionary item = new Dictionary(); - for (int i = 0; i < Math.Min((int)keys.Count(), (int)row.Content?.Count()); i ++) + for (int i = 0; i < Math.Min((int)keys.Count(), (int)row.Content?.Count()); i++) { if (customProperties.Contains(keys[i])) result.SetPropertyValue(keys[i], row.Content[i]); @@ -273,19 +280,19 @@ private List CreateCustomObjects(List rows) private string MaximumColumnName(IXLWorkbook workbook, string worksheet) { - var sheet = Worksheets(workbook, worksheet).FirstOrDefault(); + IXLWorksheet sheet = Worksheets(workbook, worksheet).FirstOrDefault(); if (sheet == null) return "XFD"; //Maximum Excel Column name - var columnNumber = sheet.LastColumnUsed().ColumnNumber(); - return ConvertToColumnName(columnNumber); + int columnNumber = sheet.LastColumnUsed().ColumnNumber(); + return ConvertToColumnName(columnNumber); } /***************************************************/ private int MaximumRowNumber(IXLWorkbook workbook, string worksheet) { - var sheet = Worksheets(workbook, worksheet).FirstOrDefault(); + IXLWorksheet sheet = Worksheets(workbook, worksheet).FirstOrDefault(); if (sheet == null) return 1048576; //Maximum Excel Row number From 71eb5ba96740e8b5cd43729e72c612f2437ffb59 Mon Sep 17 00:00:00 2001 From: Arnaud Declercq Date: Wed, 12 Feb 2025 14:35:28 +0000 Subject: [PATCH 2/2] Keeping results separated when doing a batch request --- Excel_Adapter/CRUD/Read/Read.cs | 2 +- Excel_oM/ResultItem.cs | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Excel_oM/ResultItem.cs diff --git a/Excel_Adapter/CRUD/Read/Read.cs b/Excel_Adapter/CRUD/Read/Read.cs index 6a242b9..fa7d2a1 100644 --- a/Excel_Adapter/CRUD/Read/Read.cs +++ b/Excel_Adapter/CRUD/Read/Read.cs @@ -90,7 +90,7 @@ private List ReadExcel(XLWorkbook workbook, IRequest request, Actio else if (request is WorksheetsRequest) return ReadExcel(workbook, ((WorksheetsRequest)request)); else if (request is BatchRequest batchRequest) - return batchRequest.Requests.SelectMany(x => ReadExcel(workbook, x, actionConfig)).ToList(); + return batchRequest.Requests.Select(x => new ResultItem { Objects = ReadExcel(workbook, x, actionConfig), OriginalRequest = x }).ToList(); else { BH.Engine.Base.Compute.RecordError($"Requests of type {request?.GetType()} are not supported by the Excel adapter."); diff --git a/Excel_oM/ResultItem.cs b/Excel_oM/ResultItem.cs new file mode 100644 index 0000000..27e0206 --- /dev/null +++ b/Excel_oM/ResultItem.cs @@ -0,0 +1,39 @@ +/* + * This file is part of the Buildings and Habitats object Model (BHoM) + * Copyright (c) 2015 - 2025, the respective contributors. All rights reserved. + * + * Each contributor holds copyright over their respective contributions. + * The project versioning (Git) records all such contribution source information. + * + * + * The BHoM is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3.0 of the License, or + * (at your option) any later version. + * + * The BHoM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this code. If not, see . + */ + +using BH.oM.Base; +using BH.oM.Base.Attributes; +using BH.oM.Data.Requests; +using System.Collections.Generic; + +namespace BH.oM.Adapters.Excel +{ + public class ResultItem : BHoMObject + { + public virtual List Objects { get; set; } = new List(); + + public virtual IRequest OriginalRequest { get; set; } = null; + } +} + + +