Skip to content

Commit a923ea9

Browse files
committed
Use FireQuery
1 parent 08e5609 commit a923ea9

4 files changed

Lines changed: 156 additions & 114 deletions

File tree

go.mod

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
11
module github.com/spicehq/spar
22

3-
go 1.18
4-
5-
require github.com/logrusorgru/aurora v2.0.3+incompatible
3+
go 1.20
64

75
require (
8-
github.com/montanaflynn/stats v0.6.6
9-
github.com/valyala/fasthttp v1.37.0
6+
github.com/apache/arrow/go/v12 v12.0.0
7+
github.com/montanaflynn/stats v0.7.1
8+
github.com/spiceai/gospice/v2 v2.1.0
9+
golang.org/x/sync v0.2.0
1010
)
1111

1212
require (
13-
github.com/andybalholm/brotli v1.0.4 // indirect
14-
github.com/klauspost/compress v1.15.0 // indirect
15-
github.com/valyala/bytebufferpool v1.0.0 // indirect
13+
github.com/andybalholm/brotli v1.0.5 // indirect
14+
github.com/apache/thrift v0.18.1 // indirect
15+
github.com/goccy/go-json v0.10.2 // indirect
16+
github.com/golang/protobuf v1.5.3 // indirect
17+
github.com/golang/snappy v0.0.4 // indirect
18+
github.com/google/flatbuffers v23.5.26+incompatible // indirect
19+
github.com/klauspost/asmfmt v1.3.2 // indirect
20+
github.com/klauspost/compress v1.16.5 // indirect
21+
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
22+
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect
23+
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect
24+
github.com/pierrec/lz4/v4 v4.1.17 // indirect
25+
github.com/zeebo/xxh3 v1.0.2 // indirect
26+
golang.org/x/mod v0.10.0 // indirect
27+
golang.org/x/net v0.10.0 // indirect
28+
golang.org/x/sys v0.8.0 // indirect
29+
golang.org/x/text v0.9.0 // indirect
30+
golang.org/x/tools v0.9.1 // indirect
31+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
32+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
33+
google.golang.org/grpc v1.55.0 // indirect
34+
google.golang.org/protobuf v1.30.0 // indirect
1635
)

go.sum

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,69 @@
1-
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
2-
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
3-
github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U=
4-
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
5-
github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8=
6-
github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
7-
github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ=
8-
github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
9-
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
10-
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
11-
github.com/valyala/fasthttp v1.37.0 h1:7WHCyI7EAkQMVmrfBhWTCOaeROb1aCBiTopx63LkMbE=
12-
github.com/valyala/fasthttp v1.37.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I=
13-
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
14-
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
15-
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
16-
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
17-
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
18-
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
19-
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
20-
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
21-
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
22-
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
23-
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
24-
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
25-
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
26-
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
1+
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
2+
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
3+
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
4+
github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc=
5+
github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg=
6+
github.com/apache/thrift v0.18.1 h1:lNhK/1nqjbwbiOPDBPFJVKxgDEGSepKuTh6OLiXW8kg=
7+
github.com/apache/thrift v0.18.1/go.mod h1:rdQn/dCcDKEWjjylUeueum4vQEjG2v8v2PqriUnbr+I=
8+
github.com/bradleyjkemp/cupaloy v2.3.0+incompatible h1:UafIjBvWQmS9i/xRg+CamMrnLTKNzo+bdmT/oH34c2Y=
9+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
10+
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
11+
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
12+
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
13+
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
14+
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
15+
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
16+
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
17+
github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg=
18+
github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
19+
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
20+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
21+
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
22+
github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
23+
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
24+
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
25+
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
26+
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
27+
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
28+
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
29+
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
30+
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
31+
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
32+
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
33+
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
34+
github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
35+
github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
36+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
37+
github.com/spiceai/gospice/v2 v2.1.0 h1:BiB+8OkG9BQL3iYC093SuYVNgZ6VCK3JWSU79cQc1ek=
38+
github.com/spiceai/gospice/v2 v2.1.0/go.mod h1:BjhEruXY+P+9HQUPRbPAnzj4tZmrGLbSvlLcy+d0DkQ=
39+
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
40+
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
41+
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
42+
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
43+
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91 h1:tnebWN09GYg9OLPss1KXj8txwZc6X6uMr6VFdcGNbHw=
44+
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
45+
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
46+
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
47+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
48+
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
49+
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
50+
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
51+
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
52+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
53+
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
54+
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
55+
golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
56+
golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
57+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
58+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
59+
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
60+
gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E=
61+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc=
62+
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA=
63+
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
64+
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
65+
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
66+
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
67+
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
68+
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
69+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

main.go

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,65 @@
11
package main
22

33
import (
4+
"context"
45
"flag"
56
"fmt"
67
"log"
78
"os"
89
"os/signal"
910
"runtime"
11+
"strconv"
1012
"syscall"
13+
"time"
1114

12-
"github.com/logrusorgru/aurora"
1315
"github.com/spicehq/spar/pkg/spar"
14-
"github.com/valyala/fasthttp"
16+
"golang.org/x/sync/errgroup"
1517
)
1618

1719
func main() {
20+
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
21+
defer stop()
22+
1823
flag.Parse()
1924

2025
if flag.NArg() < 1 {
21-
fmt.Println("Usage: spar <url>")
26+
fmt.Println("Usage: spar <throws> <sql>")
2227
fmt.Println()
23-
fmt.Println("Example: spar localhost:3000")
28+
fmt.Println(`Example: spar "SELECT * FROM eth.recent_blocks ORDER BY number DESC LIMIT 10"`)
2429
return
2530
}
2631

27-
uri := fasthttp.AcquireURI()
28-
defer fasthttp.ReleaseURI(uri)
29-
30-
if err := uri.Parse(nil, []byte(flag.Arg(0))); err != nil {
31-
fmt.Println(err)
32-
return
32+
throws, err := strconv.Atoi(flag.Arg(0))
33+
if err != nil {
34+
log.Fatalf("invalid throws: %s", err.Error())
3335
}
36+
sql := flag.Arg(1)
3437

35-
if len(uri.Scheme()) == 0 {
36-
uri.SetScheme("http")
38+
sparClient := spar.NewSparClient()
39+
if err := sparClient.Init(); err != nil {
40+
log.Fatalf("failed to initialize spar client: %s", err.Error())
3741
}
42+
defer sparClient.Close()
3843

39-
sparClient := spar.NewSparClient(uri)
44+
log.Printf("throwing %d times using %d CPUs.\n", throws, runtime.NumCPU())
4045

41-
fmt.Printf("SPAR POST %s\n", aurora.BrightCyan(uri.String()))
46+
errGroup, errGroupCtx := errgroup.WithContext(ctx)
47+
errGroup.SetLimit(runtime.NumCPU())
4248

43-
signalChannel := make(chan os.Signal, 1)
44-
signal.Notify(signalChannel,
45-
syscall.SIGINT)
49+
startTime := time.Now()
50+
for j := 0; j < throws; j++ {
51+
errGroup.Go(func() error {
52+
return sparClient.Throw(errGroupCtx, sql)
53+
})
54+
}
4655

47-
for i := 0; i < runtime.NumCPU(); i++ {
48-
go func() {
49-
for j := 0; j < 100; j++ {
50-
err := sparClient.Throw()
51-
if err != nil {
52-
log.Println(err.Error())
53-
}
54-
}
55-
}()
56+
if err := errGroup.Wait(); err != nil {
57+
log.Fatalf("failed to throw: %s", err.Error())
5658
}
5759

58-
<-signalChannel
60+
duration := time.Since(startTime)
61+
62+
fmt.Printf("Done in %s\n\n", duration.Round(time.Microsecond))
5963

6064
sparClient.PrintStats()
6165

pkg/spar/spar.go

Lines changed: 29 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package spar
22

33
import (
4-
"encoding/json"
4+
"context"
55
"fmt"
6-
"math/rand"
7-
"net/http"
6+
"log"
87
"runtime"
98
"sort"
10-
"strings"
119
"time"
1210

13-
"github.com/logrusorgru/aurora"
11+
"github.com/apache/arrow/go/v12/arrow/array"
1412
"github.com/montanaflynn/stats"
15-
"github.com/valyala/fasthttp"
13+
"github.com/spiceai/gospice/v2"
1614
)
1715

1816
type Spear struct {
@@ -21,73 +19,51 @@ type Spear struct {
2119
}
2220

2321
type SparClient struct {
24-
uri *fasthttp.URI
25-
client *fasthttp.Client
22+
spiceClient *gospice.SpiceClient
2623

2724
durationsChan chan float64
2825
}
2926

30-
func NewSparClient(uri *fasthttp.URI) *SparClient {
27+
func NewSparClient() *SparClient {
3128
return &SparClient{
32-
uri: uri,
33-
client: &fasthttp.Client{},
29+
spiceClient: gospice.NewSpiceClient(),
3430
durationsChan: make(chan float64, runtime.NumCPU()*100),
3531
}
3632
}
3733

38-
func (p *SparClient) Throw() error {
39-
start := time.Now()
40-
41-
resp := fasthttp.AcquireResponse()
42-
defer fasthttp.ReleaseResponse(resp)
43-
44-
req := fasthttp.AcquireRequest()
45-
defer fasthttp.ReleaseRequest(req)
46-
req.SetURI(p.uri)
47-
req.Header.SetMethod("POST")
48-
49-
randVal := rand.Intn(5)
50-
if randVal > 2 {
51-
randVal = 1
52-
} else {
53-
randVal = -1
34+
func (p *SparClient) Init() error {
35+
if err := p.spiceClient.Init("323337|b42eceab2e7c4a60a04ad57bebea830d"); err != nil {
36+
return fmt.Errorf("failed to initialize spice client: %w", err)
5437
}
5538

56-
randTime := rand.Intn(20 * 1000)
57-
58-
spear := Spear{
59-
Time: time.Now().Add(-10 * time.Second).Add(time.Duration(randTime)),
60-
Value: randVal,
61-
}
39+
return nil
40+
}
6241

63-
if err := json.NewEncoder(req.BodyWriter()).Encode(spear); err != nil {
64-
return err
42+
func (p *SparClient) Close() {
43+
if p.spiceClient != nil {
44+
p.spiceClient.Close()
6545
}
46+
}
6647

67-
if err := p.client.Do(req, resp); err != nil {
68-
return err
48+
func (p *SparClient) Throw(ctx context.Context, sql string) error {
49+
start := time.Now()
50+
reader, err := p.spiceClient.FireQuery(ctx, sql)
51+
if err != nil {
52+
return fmt.Errorf("failed to query spice: %w", err)
6953
}
54+
duration := time.Since(start)
55+
defer reader.Release()
7056

71-
statusCode := resp.StatusCode()
72-
statusText := http.StatusText(statusCode)
57+
rowCount := 0
7358

74-
var status aurora.Value
75-
if statusCode >= 200 && statusCode < 300 {
76-
status = aurora.BrightGreen(statusText)
77-
} else if statusCode >= 400 && statusCode < 500 {
78-
status = aurora.BrightYellow(statusText)
79-
} else {
80-
status = aurora.BrightRed(statusText)
59+
for reader.Next() {
60+
arr := array.RecordToStructArray(reader.Record())
61+
rowCount += arr.Len()
8162
}
8263

83-
duration := time.Since(start)
84-
p.durationsChan <- float64(duration)
64+
log.Printf("Got %d rows in time=%s\n", rowCount, duration.Round(time.Microsecond))
8565

86-
body := resp.Body()
87-
content := " " + strings.TrimSpace(strings.SplitN(string(body), "\n", 2)[0])
88-
contentLength := len(body)
89-
90-
fmt.Printf("%s (%d bytes) from %s: time=%s%s\n", status, contentLength, aurora.BrightBlue(string(req.Host())), duration.Round(time.Microsecond), content)
66+
p.durationsChan <- float64(duration)
9167

9268
return nil
9369
}

0 commit comments

Comments
 (0)