Skip to content

Commit

Permalink
fix multi annotationTable writing and unify API
Browse files Browse the repository at this point in the history
  • Loading branch information
HLWeil committed Aug 6, 2024
1 parent d40fea9 commit d1b9f9b
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 49 deletions.
4 changes: 2 additions & 2 deletions src/ARCtrl/ARC.fs
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ type ARC(?isa : ArcInvestigation, ?cwl : CWL.CWL, ?fs : FileSystem.FileSystem) =
let workbooks = System.Collections.Generic.Dictionary<string, DTOType*FsWorkbook>()
match this.ISA with
| Some inv ->
let investigationConverter = Spreadsheet.ArcInvestigation.toFsWorkbook
let investigationConverter = ArcInvestigation.toFsWorkbook
workbooks.Add (InvestigationFileName, (DTOType.ISA_Investigation, investigationConverter inv))
inv.StaticHash <- inv.GetLightHashCode()
inv.Studies
Expand Down Expand Up @@ -365,7 +365,7 @@ type ARC(?isa : ArcInvestigation, ?cwl : CWL.CWL, ?fs : FileSystem.FileSystem) =

| None ->
//printfn "ARC contains no ISA part."
workbooks.Add (InvestigationFileName, (DTOType.ISA_Investigation, Spreadsheet.ArcInvestigation.toFsWorkbook (ArcInvestigation.create(Identifier.MISSING_IDENTIFIER))))
workbooks.Add (InvestigationFileName, (DTOType.ISA_Investigation, ArcInvestigation.toFsWorkbook (ArcInvestigation.create(Identifier.MISSING_IDENTIFIER))))

// Iterates over filesystem and creates a write contract for every file. If possible, include DTO.
_fs.Tree.ToFilePaths(true)
Expand Down
10 changes: 7 additions & 3 deletions src/Spreadsheet/AnnotationTable/ArcTable.fs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module ARCtrl.Spreadsheet.ArcTable
module ARCtrl.Spreadsheet.ArcTable

open ARCtrl
open ARCtrl.Helper
Expand Down Expand Up @@ -121,7 +121,7 @@ let tryFromFsWorksheet (sheet : FsWorksheet) =
| err -> failwithf "Could not parse table with name \"%s\":\n%s" sheet.Name err.Message


let toFsWorksheet (table : ArcTable) =
let toFsWorksheet (index : int option) (table : ArcTable) =
/// This dictionary is used to add spaces at the end of duplicate headers.
let stringCount = System.Collections.Generic.Dictionary<string,string>()
let ws = FsWorksheet(table.Name)
Expand All @@ -137,7 +137,11 @@ let toFsWorksheet (table : ArcTable) =
|> List.collect CompositeColumn.toStringCellColumns
let maxRow = columns.Head.Length
let maxCol = columns.Length
let fsTable = ws.Table("annotationTable",FsRangeAddress(FsAddress(1,1),FsAddress(maxRow,maxCol)))
let name =
match index with
| Some i -> $"{annotationTablePrefix}{i}"
| None -> annotationTablePrefix
let fsTable = ws.Table(name,FsRangeAddress(FsAddress(1,1),FsAddress(maxRow,maxCol)))
columns
|> List.iteri (fun colI col ->
col
Expand Down
10 changes: 8 additions & 2 deletions src/Spreadsheet/ArcAssay.fs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,12 @@ module ArcAssayExtensions =
|> Option.iter (DataMapTable.toFsWorksheet >> doc.AddWorksheet)

assay.Tables
|> Seq.iter (ArcTable.toFsWorksheet >> doc.AddWorksheet)
|> Seq.iteri (fun i -> ArcTable.toFsWorksheet (Some i) >> doc.AddWorksheet)

doc
doc

/// Write an assay to a spreadsheet
///
/// If datamapSheet is true, the datamap will be written to a worksheet inside assay workbook.
member this.ToFsWorkbook (?datamapSheet: bool) =
ArcAssay.toFsWorkbook (this, ?datamapSheet = datamapSheet)
67 changes: 42 additions & 25 deletions src/Spreadsheet/ArcInvestigation.fs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ module ArcInvestigation =
let [<Literal>] publicationsLabelPrefix = "Investigation Publication"
let [<Literal>] contactsLabelPrefix = "Investigation Person"

let [<Literal>] metaDataSheetName = "isa_investigation"
let [<Literal>] metaDataSheetName_deprecated = "Investigation"
let [<Literal>] metadataSheetName = "isa_investigation"
let [<Literal>] obsoleteMetadataSheetName = "Investigation"


type InvestigationInfo =
Expand Down Expand Up @@ -202,28 +202,45 @@ module ArcInvestigation =
|> insertRemarks (List.ofSeq investigation.Remarks)
|> seq

let fromFsWorkbook (doc:FsWorkbook) =
try
match doc.TryGetWorksheetByName metaDataSheetName with
| Some sheet -> sheet
| None ->
match doc.TryGetWorksheetByName metaDataSheetName_deprecated with
let isMetadataSheetName (name : string) =
name = metadataSheetName || name = obsoleteMetadataSheetName

let isMetadataSheet (sheet : FsWorksheet) =
isMetadataSheetName sheet.Name

let tryGetMetadataSheet (doc:FsWorkbook) =
doc.GetWorksheets()
|> Seq.tryFind isMetadataSheet


[<AutoOpen>]
module ArcInvestigationExtensions =

open ArcInvestigation

type ArcInvestigation with

static member fromFsWorkbook (doc:FsWorkbook) =
try
match ArcInvestigation.tryGetMetadataSheet doc with
| Some sheet -> sheet
| None -> failwith "Could not find metadata sheet with sheetname \"isa_investigation\" or deprecated sheetname \"Investigation\""
|> FsWorksheet.getRows
|> Seq.map SparseRow.fromFsRow
|> fromRows
with
| err -> failwithf "Could not read investigation from spreadsheet: %s" err.Message

let toFsWorkbook (investigation:ArcInvestigation) : FsWorkbook =
try
let wb = new FsWorkbook()
let sheet = FsWorksheet(metaDataSheetName)
investigation
|> toRows
|> Seq.iteri (fun rowI r -> SparseRow.writeToSheet (rowI + 1) r sheet)
wb.AddWorksheet(sheet)
wb
with
| err -> failwithf "Could not write investigation to spreadsheet: %s" err.Message
|> FsWorksheet.getRows
|> Seq.map SparseRow.fromFsRow
|> fromRows
with
| err -> failwithf "Could not read investigation from spreadsheet: %s" err.Message

static member toFsWorkbook (investigation:ArcInvestigation) : FsWorkbook =
try
let wb = new FsWorkbook()
let sheet = FsWorksheet(metadataSheetName)
investigation
|> toRows
|> Seq.iteri (fun rowI r -> SparseRow.writeToSheet (rowI + 1) r sheet)
wb.AddWorksheet(sheet)
wb
with
| err -> failwithf "Could not write investigation to spreadsheet: %s" err.Message

member this.ToFsWorkbook() = ArcInvestigation.toFsWorkbook this
7 changes: 5 additions & 2 deletions src/Spreadsheet/ArcStudy.fs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ module ArcStudyExtensions =
|> Option.iter (DataMapTable.toFsWorksheet >> doc.AddWorksheet)

study.Tables
|> ResizeArray.iter (ArcTable.toFsWorksheet >> doc.AddWorksheet)
|> Seq.iteri (fun i -> ArcTable.toFsWorksheet (Some i) >> doc.AddWorksheet)

doc
doc

member this.ToFsWorkbook (?assays : ArcAssay list, ?datamapSheet: bool) =
ArcStudy.toFsWorkbook (this, ?assays = assays, ?datamapSheet = datamapSheet)
4 changes: 2 additions & 2 deletions src/Spreadsheet/Template.fs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace ARCtrl.Spreadsheet
namespace ARCtrl.Spreadsheet

open FsSpreadsheet
open ARCtrl.Helper
Expand Down Expand Up @@ -300,7 +300,7 @@ module Template =
doc.AddWorksheet metaDataSheet

template.Table
|> ArcTable.toFsWorksheet
|> ArcTable.toFsWorksheet None
|> doc.AddWorksheet

doc
Expand Down
22 changes: 11 additions & 11 deletions tests/Spreadsheet/ArcTableTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ let private dataColumnsTable =
testCase "Only Freetext" <| fun _ ->
let table = ArcTable.init("MyTable")
table.AddColumn(CompositeHeader.Input(IOType.Data), [|for i in 1 .. 5 do mkInputStr i |> CompositeCell.FreeText|])
let fsws = ArcTable.toFsWorksheet table
let fsws = ArcTable.toFsWorksheet None table
let actualColValues = (fsws.Column(1).Cells |> Seq.map (fun c -> c.ValueAsString()))
Expect.sequenceEqual actualColValues ["Input [Data]"; "Input_1"; "Input_2"; "Input_3"; "Input_4"; "Input_5"] ""
testCase "Only Data" <| fun _ ->
let table = ArcTable.init("MyTable")
table.AddColumn(CompositeHeader.Input(IOType.Data), [|for i in 1 .. 5 do CompositeCell.createData (Data(name = mkDataNameStr i, format = "text/csv", selectorFormat = "MySelector"))|])
let fsws = ArcTable.toFsWorksheet table
let fsws = ArcTable.toFsWorksheet None table
fsws.RescanRows()
let rows = fsws.Rows |> Seq.map (fun x -> x.Cells |> Seq.map (fun c -> c.ValueAsString()) |> Array.ofSeq) |> Array.ofSeq
Expect.equal rows.[0].Length 3 "col count"
Expand All @@ -37,7 +37,7 @@ let private dataColumnsTable =
mkInputStr i |> CompositeCell.FreeText
|]
)
let fsws = ArcTable.toFsWorksheet table
let fsws = ArcTable.toFsWorksheet None table
fsws.RescanRows()
let rows = fsws.Rows |> Seq.map (fun x -> x.Cells |> Seq.map (fun c -> c.ValueAsString()) |> Array.ofSeq) |> Array.ofSeq
Expect.equal rows.[0].Length 3 "col count"
Expand Down Expand Up @@ -170,7 +170,7 @@ let private simpleTable =

let table = ArcTable.tryFromFsWorksheet ws
Expect.isSome table "Table was not created"
let out = ArcTable.toFsWorksheet table.Value
let out = ArcTable.toFsWorksheet None table.Value
Expect.workSheetEqual out ws "Worksheet was not correctly written"

)
Expand Down Expand Up @@ -262,7 +262,7 @@ let private mixedTable =

let table = ArcTable.tryFromFsWorksheet ws
Expect.isSome table "Table was not created"
let out = ArcTable.toFsWorksheet table.Value
let out = ArcTable.toFsWorksheet None table.Value
Expect.workSheetEqual out ws "Worksheet was not correctly written"

)
Expand Down Expand Up @@ -317,7 +317,7 @@ let private ioTable =

let table = ArcTable.tryFromFsWorksheet ws
Expect.isSome table "Table was not created"
let out = ArcTable.toFsWorksheet table.Value
let out = ArcTable.toFsWorksheet None table.Value
Expect.workSheetEqual out ws "Worksheet was not correctly written"

)
Expand Down Expand Up @@ -366,7 +366,7 @@ let private fullDataTable =

let table = ArcTable.tryFromFsWorksheet ws
Expect.isSome table "Table was not created"
let out = ArcTable.toFsWorksheet table.Value
let out = ArcTable.toFsWorksheet None table.Value
Expect.workSheetEqual out ws "Worksheet was not correctly written"

)
Expand Down Expand Up @@ -414,7 +414,7 @@ let private commentTable =

let table = ArcTable.tryFromFsWorksheet ws
Expect.isSome table "Table was not created"
let out = ArcTable.toFsWorksheet table.Value
let out = ArcTable.toFsWorksheet None table.Value
Expect.workSheetEqual out ws "Worksheet was not correctly written"

)
Expand Down Expand Up @@ -483,7 +483,7 @@ let private writeOrder =
]

let mixedTable = ArcTable.tryFromFsWorksheet mixedWs |> Option.get
let mixedOut = ArcTable.toFsWorksheet mixedTable
let mixedOut = ArcTable.toFsWorksheet None mixedTable

let orderedWs =
initWorksheet wsName
Expand All @@ -506,12 +506,12 @@ let private emptyTable =
let name = "EmptyTable"
let t = ArcTable.init(name)
testCase "Write" (fun () ->
let sheet = ArcTable.toFsWorksheet t
let sheet = ArcTable.toFsWorksheet None t
Expect.equal name sheet.Name "Worksheet name did not match"
Expect.equal 0 sheet.Rows.Count "Row count should be 0"
)
testCase "Read" (fun () ->
let sheet = ArcTable.toFsWorksheet t
let sheet = ArcTable.toFsWorksheet None t
Expect.isNone (ArcTable.tryFromFsWorksheet sheet) "Table was not created"
)
]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module TestObjects.Spreadsheet.Study
module TestObjects.Spreadsheet.Study

open FsSpreadsheet

Expand Down Expand Up @@ -539,7 +539,7 @@ module LargeFile =
| Some t -> t
| None -> createTable()

let fsws_large = Spreadsheet.ArcTable.toFsWorksheet table
let fsws_large = Spreadsheet.ArcTable.toFsWorksheet None table
Workbook.AddWorksheet(fsws_large)
Workbook.AddWorksheet studyMetadataEmpty

Expand Down

0 comments on commit d1b9f9b

Please sign in to comment.