Skip to content

Commit 9ac2154

Browse files
authored
Improve efficiency when processing response (#258)
* Improve efficiency when processing response * Gofmt * Bring back warnings logs, but as debug * Revert "Bring back warnings logs, but as debug" This reverts commit 58103d3. * Bring back warnings logs, but as debug * Fix lint * Fix lint
1 parent db0dbce commit 9ac2154

File tree

3 files changed

+21615
-8
lines changed

3 files changed

+21615
-8
lines changed

pkg/googlesheets/googlesheets.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (gs *GoogleSheets) GetSpreadsheets(ctx context.Context, config models.Datas
8181
return nil, err
8282
}
8383

84-
fileNames := map[string]string{}
84+
fileNames := make(map[string]string, len(files))
8585
for _, i := range files {
8686
fileNames[i.Id] = i.Name
8787
}
@@ -180,16 +180,18 @@ func (gs *GoogleSheets) transformSheetToDataFrame(sheet *sheets.GridData, meta m
180180
if column.HasMixedTypes() {
181181
warning := fmt.Sprintf("Multiple data types found in column %q. Using string data type", column.Header)
182182
warnings = append(warnings, warning)
183-
log.DefaultLogger.Warn(warning)
183+
log.DefaultLogger.Debug(warning)
184184
}
185185

186186
if column.HasMixedUnits() {
187187
warning := fmt.Sprintf("Multiple units found in column %q. Formatted value will be used", column.Header)
188188
warnings = append(warnings, warning)
189-
log.DefaultLogger.Warn(warning)
189+
log.DefaultLogger.Debug(warning)
190190
}
191191
}
192192

193+
// We want to show the warnings only once per column
194+
warningsIncludeConverterErrorForColumns := make(map[int]bool, len(columns))
193195
for rowIndex := start; rowIndex < len(sheet.RowData); rowIndex++ {
194196
for columnIndex, cellData := range sheet.RowData[rowIndex].Values {
195197
if columnIndex >= len(columns) {
@@ -202,8 +204,10 @@ func (gs *GoogleSheets) transformSheetToDataFrame(sheet *sheets.GridData, meta m
202204
}
203205

204206
err := inputConverter.Set(columnIndex, rowIndex-start, cellData)
205-
if err != nil {
207+
if err != nil && !warningsIncludeConverterErrorForColumns[columnIndex] {
208+
log.DefaultLogger.Debug("unsuccessful converting of cell data", "err", err)
206209
warnings = append(warnings, err.Error())
210+
warningsIncludeConverterErrorForColumns[columnIndex] = true
207211
}
208212
}
209213
}
@@ -212,7 +216,6 @@ func (gs *GoogleSheets) transformSheetToDataFrame(sheet *sheets.GridData, meta m
212216
meta["spreadsheetId"] = qm.Spreadsheet
213217
meta["range"] = qm.Range
214218
frame.Meta = &data.FrameMeta{Custom: meta}
215-
log.DefaultLogger.Debug("frame.Meta: %s", spew.Sdump(frame.Meta))
216219
return frame, nil
217220
}
218221

@@ -287,13 +290,13 @@ func getUniqueColumnName(formattedName string, columnIndex int, columns map[stri
287290
}
288291

289292
func getColumnDefinitions(rows []*sheets.RowData) ([]*ColumnDefinition, int) {
290-
columns := []*ColumnDefinition{}
291-
columnMap := map[string]bool{}
292293
if len(rows) < 1 {
293-
return columns, 0
294+
return []*ColumnDefinition{}, 0
294295
}
295296
headerRow := rows[0].Values
296297

298+
columns := make([]*ColumnDefinition, 0, len(headerRow))
299+
columnMap := make(map[string]bool, len(headerRow))
297300
start := 0
298301
if len(rows) > 1 {
299302
start = 1
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package googlesheets
2+
3+
import (
4+
"testing"
5+
6+
"github.com/grafana/google-sheets-datasource/pkg/models"
7+
8+
"github.com/grafana/grafana-plugin-sdk-go/data"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
// To avoid compiler optimizations eliminating the function under test
13+
// we are storing the result to a package level variable
14+
var Frame *data.Frame
15+
16+
func BenchmarkTransformMixedSheetToDataFrame(b *testing.B) {
17+
sheet, err := loadTestSheet("./testdata/mixed-data.json")
18+
require.NoError(b, err)
19+
gsd := &GoogleSheets{}
20+
qm := models.QueryModel{Spreadsheet: "someId"}
21+
meta := make(map[string]any)
22+
b.ResetTimer()
23+
for i := 0; i < b.N; i++ {
24+
frame, err := gsd.transformSheetToDataFrame(sheet.Sheets[0].Data[0], meta, "ref1", &qm)
25+
require.NoError(b, err)
26+
Frame = frame
27+
}
28+
}
29+
30+
func BenchmarkTransformMixedSheetWithInvalidDateToDataFrame(b *testing.B) {
31+
sheet, err := loadTestSheet("./testdata/invalid-date-time.json")
32+
require.NoError(b, err)
33+
gsd := &GoogleSheets{}
34+
qm := models.QueryModel{Spreadsheet: "someId"}
35+
meta := make(map[string]any)
36+
b.ResetTimer()
37+
for i := 0; i < b.N; i++ {
38+
frame, err := gsd.transformSheetToDataFrame(sheet.Sheets[0].Data[0], meta, "ref1", &qm)
39+
require.NoError(b, err)
40+
Frame = frame
41+
}
42+
}

0 commit comments

Comments
 (0)