aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/datamaps/writer.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/datamaps/writer.go')
-rw-r--r--pkg/datamaps/writer.go153
1 files changed, 0 insertions, 153 deletions
diff --git a/pkg/datamaps/writer.go b/pkg/datamaps/writer.go
deleted file mode 100644
index 9e7973f..0000000
--- a/pkg/datamaps/writer.go
+++ /dev/null
@@ -1,153 +0,0 @@
-package datamaps
-
-import (
- "database/sql"
- "fmt"
- "log"
- "path/filepath"
-
- "github.com/tealeg/xlsx/v3"
-
- // Needed for the sqlite3 driver
- _ "github.com/mattn/go-sqlite3"
-)
-
-// CreateMaster creates a master spreadsheet for a specific return given,
-// based on a datamap name - both of which already need to be in the database,
-// along with the data associated with the return. The datamap and return data
-// must already have been imported.
-func CreateMaster(opts *Options) error {
- wb := xlsx.NewFile()
- sh, err := wb.AddSheet("Master Data")
- if err != nil {
- return fmt.Errorf("cannot add 'Master Data' sheet to new XLSX file: %v", err)
- }
-
- db, err := sql.Open("sqlite3", opts.DBPath)
- if err != nil {
- return fmt.Errorf("cannot open database %v", err)
- }
-
- // Get number amount of datamap keys in target datamap
- keyCountRows := db.QueryRow("SELECT count(key) FROM datamap_line, datamap WHERE datamap.name=?;", opts.DMName)
-
- var datamapKeysNumber int64
- if err := keyCountRows.Scan(&datamapKeysNumber); err != nil {
- return err
- }
-
- datamapKeysRows, err := db.Query("SELECT key FROM datamap_line, datamap WHERE datamap.name=?;", opts.DMName)
- if err != nil {
- return fmt.Errorf("cannot query for keys in database - %v", err)
- }
-
- var datamapKeys []string
-
- var i int64
- for i = 0; i < datamapKeysNumber; i++ {
- if k := datamapKeysRows.Next(); k {
- var key string
- if err := datamapKeysRows.Scan(&key); err != nil {
- return fmt.Errorf("cannot Scan for key %s - %v", key, err)
- }
- datamapKeys = append(datamapKeys, key)
- }
- }
-
- sqlCount := `SELECT count(return_data.id)
- FROM (((return_data
- INNER JOIN datamap_line ON return_data.dml_id=datamap_line.id)
- INNER JOIN datamap ON datamap_line.dm_id=datamap.id)
- INNER JOIN return on return_data.ret_id=return.id)
- WHERE datamap.name=? AND return.name=?;`
-
- var rowCount int64
- rowCountRes := db.QueryRow(sqlCount, opts.DMName, opts.ReturnName)
-
- if err := rowCountRes.Scan(&rowCount); err != nil {
- return err
- }
-
- getDataSQL := `SELECT datamap_line.key, return_data.vFormatted, return_data.filename
- FROM (((return_data
- INNER JOIN datamap_line ON return_data.dml_id=datamap_line.id)
- INNER JOIN datamap ON datamap_line.dm_id=datamap.id)
- INNER JOIN return on return_data.ret_id=return.id)
- WHERE datamap.name=? AND return.name=? AND datamap_line.key=?
- ORDER BY return_data.filename;`
-
- seen := make(map[string]struct{}) // homemade Set https://emersion.fr/blog/2017/sets-in-go/
-
- var values = make(map[string][]string)
- headerSlice := make([]string, 0)
- for _, k := range datamapKeys {
- masterData, err := db.Query(getDataSQL, opts.DMName, opts.ReturnName, k)
- if err != nil {
- return err
- }
- for masterData.Next() {
- var key, filename, fmttedValue string
- if err := masterData.Scan(&key, &fmttedValue, &filename); err != nil {
- fmt.Errorf("Problem scanning data from database for master: %v", err)
- }
- values, err = appendValueMap(key, fmttedValue, values)
- if _, ok := seen[filename]; !ok {
- headerSlice = append(headerSlice, filename)
- seen[filename] = struct{}{}
- }
- if err != nil {
- return err
- }
- }
- }
-
- for masterRow := 0; masterRow <= len(datamapKeys); masterRow++ {
- r, err := sh.AddRowAtIndex(masterRow)
- if err != nil {
- return fmt.Errorf("cannot create row %d in output spreadsheet: %v", masterRow, err)
- }
- if masterRow == 0 {
- if hdr := r.WriteSlice(append([]string{""}, headerSlice...), -1); hdr == -1 {
- return fmt.Errorf("cannot write header values into header row: %v", err)
- }
- continue
- }
- dmlKey := datamapKeys[masterRow-1]
-
- // TODO - we need to format the cells here too, e.g. dates
- if sl := r.WriteSlice(append([]string{dmlKey}, values[dmlKey]...), -1); sl == -1 {
- log.Printf("not a slice type")
- }
- }
-
- log.Printf("saving master at %s", opts.MasterOutPutPath)
- if err := wb.Save(filepath.Join(opts.MasterOutPutPath, "master.xlsx")); err != nil {
- log.Fatalf("cannot save file to %s", opts.MasterOutPutPath)
- }
- sh.Close()
- return nil
-}
-
-func appendValueMap(k, v string, values map[string][]string) (map[string][]string, error) {
-
- var keyIn bool
- for kv := range values {
- if kv == k {
- keyIn = true
- break
- }
- }
-
- if keyIn {
- slice, ok := values[k]
- if !ok {
- return nil, fmt.Errorf("%s is not a key in this map", k)
- }
- slice = append(slice, v)
- values[k] = slice
- return values, nil
- } else {
- values[k] = []string{v}
- return values, nil
- }
-}