Skip to content

Commit 8b1221e

Browse files
authored
Use NUMERIC for --convert-numbers implementation in SQLiteWriter (#75)
* Use NUMERIC for --convert-numbers implementation in SQLiteWriter * Add fritz test * Fix 74 test
1 parent 43e72ff commit 8b1221e

File tree

6 files changed

+94
-11
lines changed

6 files changed

+94
-11
lines changed

main.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,10 @@ func _main() error {
582582
connector.DatabaseConnectorInfo.Database.Database = cachedPath
583583
}
584584

585+
justDumpResults := lastNonFlagArg == "" && !args.isInteractive
586+
585587
// Check if we can use direct SQLite writer
586-
useSQLiteWriter := !args.noSQLiteWriter && !args.convertNumbers && !args.schema
588+
useSQLiteWriter := !args.noSQLiteWriter && !args.schema && !justDumpResults
587589
if useSQLiteWriter && !args.cacheSettings.Enabled {
588590
tmp, err := ioutil.TempFile("", "dsq-sqlite-shared")
589591
if err != nil {
@@ -624,14 +626,22 @@ func _main() error {
624626
for i, file := range files {
625627
panelId := uuid.New().String()
626628

629+
convertNumbers := args.convertNumbers
630+
627631
var w *runner.ResultWriter
628632
if useSQLiteWriter {
629633
tableName := fmt.Sprintf("t_%d", i)
630-
sw, err := openSQLiteResultItemWriter(connector.DatabaseConnectorInfo.Database.Database, tableName)
634+
sw, err := openSQLiteResultItemWriter(connector.DatabaseConnectorInfo.Database.Database, tableName, convertNumbers)
631635
if err != nil {
632636
return err
633637
}
634638

639+
// Prevent DataStation/runner from
640+
// doing conversion in Go. SQLite will
641+
// handle this as part of the NUMERIC
642+
// field types.
643+
convertNumbers = false
644+
635645
w = runner.NewResultWriter(sw)
636646
} else {
637647
// Use JSONWriter
@@ -641,7 +651,7 @@ func _main() error {
641651
}
642652
}
643653

644-
panel, err := importFile(project.Id, panelId, file, mimetypeOverride[file], args.convertNumbers, w, !useSQLiteWriter)
654+
panel, err := importFile(project.Id, panelId, file, mimetypeOverride[file], convertNumbers, w, !useSQLiteWriter)
645655
if err != nil {
646656
return err
647657
}
@@ -655,7 +665,7 @@ func _main() error {
655665
}
656666

657667
// No query, just dump transformed file directly out
658-
if lastNonFlagArg == "" && !args.isInteractive {
668+
if justDumpResults {
659669
resultFile := ec.GetPanelResultsFile(project.Id, project.Pages[0].Panels[0].Id)
660670
return dumpJSONFile(resultFile, args.pretty, args.schema)
661671
}

scripts/test.py

+51
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,52 @@ def test(name, to_run, want, fail=False, sort=False, winSkip=False, within_secon
325325
want = '[{"host":"com","count":2}]'
326326
test("URL functions", to_run, want=want, sort=True)
327327

328+
# Number conversion
329+
to_run = """./dsq testdata/convert.csv 'SELECT * FROM {}'"""
330+
want = """[{"test":"1"},
331+
{"test":"1.1"},
332+
{"test":"+1"},
333+
{"test":"01"},
334+
{"test":"001"},
335+
{"test":"0001.1"}]"""
336+
test("No number conversion, with query", to_run, want=want, sort=True)
337+
338+
to_run = """./dsq --convert-numbers testdata/convert.csv 'SELECT * FROM {}'"""
339+
want = """[{"test":1},
340+
{"test":1.1},
341+
{"test":1},
342+
{"test":1},
343+
{"test":1},
344+
{"test":1.1}]"""
345+
test("Number conversion, with query", to_run, want=want, sort=True)
346+
347+
to_run = """./dsq testdata/convert.csv"""
348+
want = """[{"test":"1"},
349+
{"test":"1.1"},
350+
{"test":"+1"},
351+
{"test":"01"},
352+
{"test":"001"},
353+
{"test":"0001.1"}]"""
354+
test("No number conversion, no query", to_run, want=want, sort=True)
355+
356+
to_run = """./dsq --convert-numbers testdata/convert.csv"""
357+
want = """[{"test":1},
358+
{"test":1.1},
359+
{"test":1},
360+
{"test":1},
361+
{"test":1},
362+
{"test":1.1}]"""
363+
test("Number conversion, no query", to_run, want=want, sort=True)
364+
365+
to_run = """./dsq testdata/csv/numberconvert.csv 'select * from {} where score > "90"'"""
366+
want = """[{"Score": "95", "Name": "Rainer"}]"""
367+
test("No number conversion, does alphabet ordering", to_run, want=want, sort=True)
368+
369+
to_run = """./dsq --convert-numbers testdata/csv/numberconvert.csv 'select * from {} where score > "90"'"""
370+
want = """[{"Name":"Rainer","Score":95},
371+
{"Name":"Fountainer","Score":100}]"""
372+
test("Number conversion, number ordering", to_run, want=want, sort=True)
373+
328374
# END OF TESTS
329375

330376
# START OF REGRESSION TESTS
@@ -341,6 +387,11 @@ def test(name, to_run, want, fail=False, sort=False, winSkip=False, within_secon
341387
want = '[{"count": 1}]'
342388
test("https://github.com/multiprocessio/dsq/issues/67", to_run, want, sort=True)
343389

390+
to_run = """./dsq ./testdata/regr/74.csv 'SELECT * FROM {}'"""
391+
want = '[{"a": "1", "a b": "2"}]'
392+
test("https://github.com/multiprocessio/dsq/issues/74", to_run, want, sort=True)
393+
394+
344395
# END OF REGRESSION TESTS
345396

346397
print(f"{tests - failures} of {tests} succeeded.")

sqlite.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@ import (
1010
)
1111

1212
type SQLiteResultItemWriter struct {
13-
db *sql.DB
14-
fields []string
15-
panelId string
16-
rowBuffer runner.Vector[any]
13+
db *sql.DB
14+
fields []string
15+
panelId string
16+
rowBuffer runner.Vector[any]
17+
convertNumbers bool
1718
}
1819

19-
func openSQLiteResultItemWriter(f string, panelId string) (runner.ResultItemWriter, error) {
20+
func openSQLiteResultItemWriter(f string, panelId string, convertNumbers bool) (runner.ResultItemWriter, error) {
2021
var sw SQLiteResultItemWriter
2122
sw.panelId = panelId
23+
sw.convertNumbers = convertNumbers
2224

2325
sw.rowBuffer = runner.Vector[any]{}
2426

@@ -32,11 +34,17 @@ func openSQLiteResultItemWriter(f string, panelId string) (runner.ResultItemWrit
3234
}
3335

3436
func (sw *SQLiteResultItemWriter) createTable() error {
37+
fieldType := "TEXT"
38+
if sw.convertNumbers {
39+
fieldType = "NUMERIC"
40+
}
41+
3542
var columns []string
3643
for _, field := range sw.fields {
37-
columns = append(columns, field+" TEXT")
44+
columns = append(columns, `"`+field+`" `+fieldType)
3845
}
39-
_, err := sw.db.Exec("CREATE TABLE \"" + sw.panelId + "\"(" + strings.Join(columns, ", ") + ");")
46+
create := "CREATE TABLE \"" + sw.panelId + "\"(" + strings.Join(columns, ", ") + ");"
47+
_, err := sw.db.Exec(create)
4048
return err
4149
}
4250

@@ -166,5 +174,6 @@ func (sw *SQLiteResultItemWriter) Close() error {
166174
return err
167175
}
168176
}
177+
169178
return sw.db.Close()
170179
}

testdata/convert.csv

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
test
2+
1
3+
1.1
4+
+1
5+
01
6+
001
7+
0001.1

testdata/csv/numberconvert.csv

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Name,Score
2+
Fritz,90
3+
Rainer,95
4+
Fountainer,100

testdata/regr/74.csv

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"a","a b"
2+
1,2

0 commit comments

Comments
 (0)