/
valueConverter.go
231 lines (193 loc) · 6.76 KB
/
valueConverter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
// Copyright (c) 2016 OpenM++
// This code is licensed under the MIT license (see LICENSE.txt for details)
package main
import (
"github.com/openmpp/go/ompp/db"
"github.com/openmpp/go/ompp/omppLog"
)
// ParameterCellConverter return parameter value converter between code cell and id's cell.
// If isToId true then from code to id cell else other way around
func (mc *ModelCatalog) ParameterCellConverter(
isToId bool, dn string, name string,
) (
func(interface{}) (interface{}, error), bool,
) {
// if model digest-or-name is empty then return empty results
if dn == "" {
omppLog.Log("Warning: invalid (empty) model digest and name")
return nil, false
}
// load model metadata and return index in model catalog
idx, ok := mc.loadModelMeta(dn)
if !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return nil, false // return empty result: model not found or error
}
// lock catalog and search model parameter by name
mc.theLock.Lock()
defer mc.theLock.Unlock()
if _, ok = mc.modelLst[idx].meta.ParamByName(name); !ok {
omppLog.Log("Error: model parameter not found: ", dn, ": ", name)
return nil, false
}
// create converter
var cvt func(interface{}) (interface{}, error)
var err error
if isToId {
var cell db.CellCodeParam
cvt, err = cell.CodeToIdCell(mc.modelLst[idx].meta, name)
} else {
var cell db.CellParam
cvt, err = cell.IdToCodeCell(mc.modelLst[idx].meta, name)
}
if err != nil {
omppLog.Log("Failed to create parameter cell value converter: ", name, ": ", err.Error())
return nil, false
}
return cvt, true
}
// TableToCodeCellConverter return output table value converter from id's cell into code cell.
func (mc *ModelCatalog) TableToCodeCellConverter(
dn string, name string, isAcc, isAllAcc bool,
) (
func(interface{}) (interface{}, error), bool,
) {
// if model digest-or-name is empty then return empty results
if dn == "" {
omppLog.Log("Warning: invalid (empty) model digest and name")
return nil, false
}
// load model metadata and return index in model catalog
idx, ok := mc.loadModelMeta(dn)
if !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return nil, false // return empty result: model not found or error
}
// lock catalog and search model output table by name
mc.theLock.Lock()
defer mc.theLock.Unlock()
if _, ok = mc.modelLst[idx].meta.OutTableByName(name); !ok {
omppLog.Log("Error: model output table not found: ", dn, ": ", name)
return nil, false
}
// create converter
var cvt func(interface{}) (interface{}, error)
var err error
switch {
case isAllAcc:
var cell db.CellAllAcc
cvt, err = cell.IdToCodeCell(mc.modelLst[idx].meta, name)
case isAcc:
var cell db.CellAcc
cvt, err = cell.IdToCodeCell(mc.modelLst[idx].meta, name)
default:
var cell db.CellExpr
cvt, err = cell.IdToCodeCell(mc.modelLst[idx].meta, name)
}
if err != nil {
omppLog.Log("Failed to create output table cell id's to code converter: ", name, ": ", err.Error())
return nil, false
}
return cvt, true
}
// ParameterToCsvConverter return parameter csv converter and csv header as string array.
func (mc *ModelCatalog) ParameterToCsvConverter(
dn string, isCode bool, name string,
) (
[]string, func(interface{}, []string) error, bool,
) {
// if model digest-or-name is empty then return empty results
if dn == "" {
omppLog.Log("Warning: invalid (empty) model digest and name")
return []string{}, nil, false
}
// load model metadata and return index in model catalog
idx, ok := mc.loadModelMeta(dn)
if !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return []string{}, nil, false // return empty result: model not found or error
}
// lock catalog and search model parameter by name
mc.theLock.Lock()
defer mc.theLock.Unlock()
if _, ok = mc.modelLst[idx].meta.ParamByName(name); !ok {
omppLog.Log("Error: model parameter not found: ", dn, ": ", name)
return []string{}, nil, false // return empty result: parameter not found or error
}
// make csv header
var cell db.CellParam
hdr, err := cell.CsvHeader(mc.modelLst[idx].meta, name, !isCode, "")
if err != nil {
omppLog.Log("Failed to make parameter csv header: ", dn, ": ", name, ": ", err.Error())
return []string{}, nil, false
}
// create converter from db cell into csv row []string
var cvt func(interface{}, []string) error
if isCode {
cvt, err = cell.CsvToRow(mc.modelLst[idx].meta, name, theCfg.doubleFmt, "")
} else {
cvt, err = cell.CsvToIdRow(mc.modelLst[idx].meta, name, theCfg.doubleFmt, "")
}
if err != nil {
omppLog.Log("Failed to create parameter converter to csv: ", dn, ": ", name, ": ", err.Error())
return []string{}, nil, false
}
return hdr, cvt, true
}
// TableToCsvConverter return output table cell to csv converter and csv header as staring array.
func (mc *ModelCatalog) TableToCsvConverter(
dn string, isCode bool, name string, isAcc, isAllAcc bool,
) (
[]string, func(interface{}, []string) error, bool,
) {
// if model digest-or-name is empty then return empty results
if dn == "" {
omppLog.Log("Warning: invalid (empty) model digest and name")
return []string{}, nil, false
}
// load model metadata and return index in model catalog
idx, ok := mc.loadModelMeta(dn)
if !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return []string{}, nil, false // return empty result: model not found or error
}
// lock catalog and search model output table by name
mc.theLock.Lock()
defer mc.theLock.Unlock()
if _, ok = mc.modelLst[idx].meta.OutTableByName(name); !ok {
omppLog.Log("Error: model output table not found: ", dn, ": ", name)
return []string{}, nil, false // return empty result: output table not found or error
}
// set cell conveter to csv
var cell db.CsvConverter
var ec db.CellExpr
var ac db.CellAcc
var alc db.CellAllAcc
if !isAcc {
cell = ec
} else {
if !isAllAcc {
cell = ac
} else {
cell = alc
}
}
// make csv header
hdr, err := cell.CsvHeader(mc.modelLst[idx].meta, name, !isCode, "")
if err != nil {
omppLog.Log("Failed to make output table csv header: ", dn, ": ", name, ": ", err.Error())
return []string{}, nil, false
}
// create converter from db cell into csv row []string
var cvt func(interface{}, []string) error
if isCode {
cvt, err = cell.CsvToRow(mc.modelLst[idx].meta, name, theCfg.doubleFmt, "")
} else {
cvt, err = cell.CsvToIdRow(mc.modelLst[idx].meta, name, theCfg.doubleFmt, "")
}
if err != nil {
omppLog.Log("Failed to create output table converter to csv: ", dn, ": ", name, ": ", err.Error())
return []string{}, nil, false
}
return hdr, cvt, true
}