annotate pkg/xlsx/templater.go @ 5343:bb6761abd81d extented-report

XLSX template: Copy column and row height explicitly.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 18 Jun 2021 13:43:21 +0200
parents 6c0f40676984
children 7df6062a1371
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2021 by via donau
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package xlsx
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 "bufio"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "context"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "database/sql"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "errors"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 "fmt"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 "io"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 "os"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 "strings"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 "github.com/360EntSecGroup-Skylar/excelize/v2"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 "gopkg.in/yaml.v2"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 "github.com/PaesslerAG/gval"
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 )
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 type Action struct {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 Type string `yaml:"type"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 Actions []*Action `yaml:"actions"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 Location []string `yaml:"location"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 Source string `yaml:"source"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 Destination string `yaml:"destination"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 Statement string `yaml:"statement"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 Vars []string `yaml:"vars"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 Name string `yaml:"name"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 Expr string `yaml:"expr"`
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 type frame struct {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 res *sqlResult
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 index int
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 type executor struct {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 ctx context.Context
5333
6c0f40676984 Run xlsx templating in a read-only transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5325
diff changeset
51 tx *sql.Tx
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 template *excelize.File
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 keep map[string]bool
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 expressions map[string]gval.Evaluable
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 sourceSheet string
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 destinationSheet string
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 frames []frame
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 func ActionFromFile(filename string) (*Action, error) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 f, err := os.Open(filename)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 return nil, err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 defer f.Close()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 return ActionFromReader(f)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 func ActionFromReader(r io.Reader) (*Action, error) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 action := new(Action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 err := yaml.NewDecoder(bufio.NewReader(r)).Decode(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 return action, err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 func (a *Action) Execute(
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 ctx context.Context,
5333
6c0f40676984 Run xlsx templating in a read-only transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5325
diff changeset
77 tx *sql.Tx,
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 template *excelize.File,
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 ) error {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 e := executor{
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 ctx: ctx,
5333
6c0f40676984 Run xlsx templating in a read-only transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5325
diff changeset
83 tx: tx,
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 template: template,
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 keep: map[string]bool{},
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 expressions: map[string]gval.Evaluable{},
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 oldSheets := template.GetSheetList()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91 if err := e.dispatch(a); err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
93 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95 for _, sheet := range oldSheets {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 if !e.keep[sheet] {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 template.DeleteSheet(sheet)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 return nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103 func (e *executor) dispatch(action *Action) error {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 if len(action.Vars) > 0 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105 e.pushVars(action.Vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 defer e.popFrame()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
107 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 switch action.Type {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 case "sheet":
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 return e.sheet(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 case "copy":
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112 return e.copy(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
113 case "select":
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 return e.sel(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115 case "assign":
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 return e.assign(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117 case "":
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 return e.actions(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
120 return fmt.Errorf("unknown type '%s'", action.Type)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
123 func (e *executor) pushVars(vars []string) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
124 e.frames = append(e.frames, frame{
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 res: &sqlResult{
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 columns: vars,
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127 rows: [][]interface{}{make([]interface{}, len(vars))},
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
128 },
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
129 })
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132 func (e *executor) popFrame() {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
133 n := len(e.frames)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
134 e.frames[n-1].res = nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
135 e.frames = e.frames[:n-1]
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
136 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
137
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
138 func (e *executor) assign(action *Action) error {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
139 if action.Name == "" {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
140 return errors.New("missing name in assign")
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
141 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
142 if action.Expr == "" {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
143 return errors.New("missing expr in assign")
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
144 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
145
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
146 for i := len(e.frames) - 1; i >= 0; i-- {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
147 fr := &e.frames[i]
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
148 if idx := fr.res.find(action.Name); idx >= 0 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 f, err := e.expr(action.Expr)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
150 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153 value, err := f(e.ctx, e.vars())
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 fr.res.rows[fr.index][idx] = value
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 break
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
161 return e.actions(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 func (e *executor) copy(action *Action) error {
5325
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
165 if n := len(action.Location); !(n == 1 || n == 2) {
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
166 return fmt.Errorf("length location = %d (expect 1 or 2)",
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
167 len(action.Location))
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
168 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
169
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 vars := e.vars()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 var err error
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173 expand := func(s string) string {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 if err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175 s, err = e.expand(s, vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 return s
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 split := func(s string) (int, int) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 var x, y int
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181 if err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182 var cell string
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183 if cell, y, err = excelize.SplitCellName(s); err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184 x, err = excelize.ColumnNameToNumber(cell)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187 return x, y
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189 order := func(a, b int) (int, int) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 if a > b {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191 return b, a
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
192 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 return a, b
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
195
5325
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
196 var location []string
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
197
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
198 if len(action.Location) == 1 {
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
199 location = []string{action.Location[0], action.Location[0]}
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
200 } else {
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
201 location = action.Location
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
202 }
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
203
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
204 var destination string
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
205
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
206 if action.Destination == "" {
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
207 destination = location[0]
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
208 } else {
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
209 destination = action.Destination
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
210 }
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
211
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
212 var (
5325
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
213 s1 = expand(location[0])
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
214 s2 = expand(location[1])
313bf3f3a8b1 XLSX templater: Simplify copy action.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5321
diff changeset
215 d1 = expand(destination)
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
216 sx1, sy1 = split(s1)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
217 sx2, sy2 = split(s2)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 dx1, dy1 = split(d1)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219 )
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
220 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
221 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
222 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
223 sx1, sx2 = order(sx1, sx2)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224 sy1, sy1 = order(sy1, sy2)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
225
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
226 //log.Printf("%s/%s -> %s\n", sFrom, sTo, dTo)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
227
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
228 for y, i := sy1, 0; y <= sy2; y, i = y+1, i+1 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
229 for x, j := sx1, 0; x <= sx2; x, j = x+1, j+1 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230 src, err1 := excelize.CoordinatesToCellName(x, y)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 dst, err2 := excelize.CoordinatesToCellName(dx1+j, dy1+i)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 if err1 != nil || err2 != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 continue
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234 }
5343
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
235
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
236 sc, sr, err1 := excelize.SplitCellName(src)
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
237 dc, dr, err2 := excelize.SplitCellName(dst)
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
238 if err1 != nil || err2 != nil {
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
239 continue
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
240 }
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
241 cw, err1 := e.template.GetColWidth(e.sourceSheet, sc)
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
242 rh, err1 := e.template.GetRowHeight(e.sourceSheet, sr)
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
243 if err1 != nil || err2 != nil {
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
244 continue
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
245 }
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
246
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
247 if e.template.SetColWidth(e.destinationSheet, dc, dc, cw) != nil {
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
248 continue
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
249 }
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
250
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
251 if e.template.SetRowHeight(e.destinationSheet, dr, rh) != nil {
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
252 continue
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
253 }
bb6761abd81d XLSX template: Copy column and row height explicitly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5333
diff changeset
254
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
255 if s, err := e.template.GetCellStyle(e.sourceSheet, src); err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
256 e.template.SetCellStyle(e.destinationSheet, dst, dst, s)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
257 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
258 if s, err := e.template.GetCellFormula(e.sourceSheet, src); err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
259 e.template.SetCellFormula(e.destinationSheet, dst, s)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
260 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
261 if s, err := e.template.GetCellValue(e.sourceSheet, src); err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
262 if s, err = e.expand(s, vars); err == nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
263 e.template.SetCellStr(e.destinationSheet, dst, s)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
264 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
265 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
266 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
267 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
268
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
269 return nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
270 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
271
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
272 func (e *executor) sel(action *Action) error {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
273 vars := e.vars()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
274
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
275 eval := func(x string) (interface{}, error) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
276 f, err := e.expr(x)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
277 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
278 return nil, err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280 return f(e.ctx, vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
281 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282
5333
6c0f40676984 Run xlsx templating in a read-only transaction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5325
diff changeset
283 res, err := query(e.ctx, e.tx, action.Statement, eval)
5321
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
284 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 e.frames = append(e.frames, frame{res: res})
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 defer e.popFrame()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
291 for i := range res.rows {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
292 e.frames[len(e.frames)-1].index = i
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
293 if err := e.actions(action); err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298 return nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
300
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
301 func (e *executor) actions(action *Action) error {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
302 for _, a := range action.Actions {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
303 if err := e.dispatch(a); err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
304 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
305 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
306 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
307 return nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
308 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
309
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
310 func (e *executor) sheet(action *Action) error {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
311
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
312 vars := e.vars()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
313 source, err := e.expand(action.Source, vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
314 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
315 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
316 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
317
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
318 srcIdx := e.template.GetSheetIndex(source)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
319 if srcIdx == -1 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
320 return fmt.Errorf("sheet '%s' not found", source)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
321 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
322
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
323 destination := action.Destination
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
324 if destination == "" { // same as source
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
325 e.keep[source] = true
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
326 destination = source
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
327 } else { // new sheet
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
328 destination, err = e.expand(destination, vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
329 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
330 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
331 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
332 dstIdx := e.template.NewSheet(destination)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
333 if len(action.Actions) == 0 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
334 // Only copy if there are no explicit instructions.
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
335 if err := e.template.CopySheet(srcIdx, dstIdx); err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
336 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
337 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
338 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
339 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
340
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
341 if len(action.Actions) > 0 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
342 pSrc, pDst := e.sourceSheet, e.destinationSheet
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
343 defer func() {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
344 e.sourceSheet, e.destinationSheet = pSrc, pDst
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
345 }()
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
346 e.sourceSheet, e.destinationSheet = source, destination
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
347 return e.actions(action)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
348 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
349
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
350 // Simple filling
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
351
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
352 // "{{" only as a quick filter
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
353 result, err := e.template.SearchSheet(destination, "{{", true)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
354 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
355 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
356 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
357 for _, axis := range result {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
358 value, err := e.template.GetCellValue(destination, axis)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
359 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
360 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
361 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
362 value, err = e.expand(value, vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
363 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
364 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
365 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
366 if err := e.template.SetCellStr(destination, axis, value); err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
367 return err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
368 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
369 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
370
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
371 return nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
372 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
373
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
374 func (e *executor) expr(x string) (gval.Evaluable, error) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
375 if f := e.expressions[x]; f != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
376 return f, nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
377 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
378 f, err := gval.Full().NewEvaluable(x)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
379 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
380 return nil, err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
381 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
382 e.expressions[x] = f
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
383 return f, nil
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
384 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
385
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
386 func (e *executor) vars() map[string]interface{} {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
387 vars := map[string]interface{}{}
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
388 if len(e.frames) > 0 {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
389 vars["row_number"] = e.frames[len(e.frames)-1].index
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
390 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
391 for i := len(e.frames) - 1; i >= 0; i-- {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
392 fr := &e.frames[i]
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
393 for j, n := range fr.res.columns {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
394 if _, found := vars[n]; !found {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
395 vars[n] = fr.res.rows[fr.index][j]
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
396 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
397 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
398 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
399 return vars
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
400 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
401
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
402 func (e *executor) expand(str string, vars map[string]interface{}) (string, error) {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
403
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
404 var err error
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
405
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
406 replace := func(s string) string {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
407 if err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
408 return ""
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
409 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
410 var eval gval.Evaluable
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
411 if eval, err = e.expr(strings.TrimSpace(s)); err != nil {
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
412 return ""
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
413 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
414 s, err = eval.EvalString(e.ctx, vars)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
415 return s
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
416 }
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
417
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
418 str = handlebars(str, replace)
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
419 return str, err
0919946f624b Added a report controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
420 }