-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdriver_test.go
More file actions
95 lines (90 loc) · 2.33 KB
/
Copy pathdriver_test.go
File metadata and controls
95 lines (90 loc) · 2.33 KB
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
package lbug
import (
"database/sql"
"fmt"
"os"
"strings"
"testing"
)
func TestDriver(t *testing.T) {
ctx := nextContext()
dbPath := getDatabasePath(t)
// Normalize the path for Windows
dbPath = strings.ReplaceAll(dbPath, "\\", "/")
t.Log("Test database path: " + dbPath)
cc, err := sql.Open(Name, fmt.Sprintf("lbug://%s", dbPath))
if nil != err {
t.Error(err)
return
}
defer func() {
if err = os.RemoveAll(dbPath); nil != err {
t.Error(err)
}
}()
exps := []string{
"CREATE NODE TABLE User(name STRING, age INT64, PRIMARY KEY (name))",
"CREATE NODE TABLE City(name STRING, population INT64, PRIMARY KEY (name))",
"CREATE REL TABLE Follows(FROM User TO User, since INT64)",
"CREATE REL TABLE LivesIn(FROM User TO City)",
"COPY User FROM \"dataset/demo-db/user.csv\"",
"COPY City FROM \"dataset/demo-db/city.csv\"",
"COPY Follows FROM \"dataset/demo-db/follows.csv\"",
"COPY LivesIn FROM \"dataset/demo-db/lives-in.csv\"",
}
for _, expr := range exps {
r, err := cc.ExecContext(ctx, expr)
if nil != err {
t.Error(err)
return
}
t.Log("RowsAffected: " + fmt.Sprint(r.RowsAffected()))
}
doQuery := func(query string, args map[string]any) ([]map[string]string, error) {
var namedArgs []any
for n, v := range args {
namedArgs = append(namedArgs, sql.Named(n, v))
}
rows, err := cc.QueryContext(ctx, query, namedArgs...)
if nil != err {
return nil, err
}
defer closeQuiet(rows)
cols, err := rows.Columns()
if nil != err {
return nil, err
}
var datum []map[string]string
for rows.Next() {
set := make([]any, len(cols))
for idx := range set {
set[idx] = new(sql.NullString)
}
if err = rows.Scan(set...); nil != err {
return nil, err
}
data := make(map[string]string, len(cols))
for idx, v := range set {
if ns, ok := v.(*sql.NullString); ok && ns.Valid {
data[cols[idx]] = ns.String
} else {
data[cols[idx]] = ""
}
}
datum = append(datum, data)
}
return datum, nil
}
queries := map[string]map[string]any{
"MATCH (a:User)-[e:Follows]->(b:User) RETURN a.name, e.since, b.name": {},
"MATCH (a:User) WHERE a.name = $name RETURN a.age": {"name": "Adam"},
}
for query, args := range queries {
rs, err := doQuery(query, args)
if nil != err {
t.Error(err)
return
}
t.Log("Rows:" + fmt.Sprint(rs))
}
}