Make remote joins use parallel http requests

This commit is contained in:
Vikram Rangnekar
2019-06-02 01:38:51 -04:00
parent f9fc5dd7de
commit 8b06473e58
10 changed files with 143 additions and 106 deletions

View File

@ -1,6 +1,7 @@
goos: darwin
goarch: amd64
pkg: github.com/dosco/super-graph/psql
BenchmarkCompileGQLToSQL-8 50000 38882 ns/op 15177 B/op 266 allocs/op
BenchmarkCompile-8 50000 38531 ns/op 5175 B/op 148 allocs/op
BenchmarkCompileParallel-8 200000 11472 ns/op 5237 B/op 148 allocs/op
PASS
ok github.com/dosco/super-graph/psql 2.473s
ok github.com/dosco/super-graph/psql 4.686s

View File

@ -1,6 +0,0 @@
goos: darwin
goarch: amd64
pkg: github.com/dosco/super-graph/psql
BenchmarkCompileGQLToSQL-8 50000 39601 ns/op 20165 B/op 263 allocs/op
PASS
ok github.com/dosco/super-graph/psql 2.549s

View File

@ -1,6 +0,0 @@
goos: darwin
goarch: amd64
pkg: github.com/dosco/super-graph/psql
BenchmarkCompileGQLToSQL-8 50000 35559 ns/op 8453 B/op 228 allocs/op
PASS
ok github.com/dosco/super-graph/psql 2.162s

View File

@ -1,6 +0,0 @@
goos: darwin
goarch: amd64
pkg: github.com/dosco/super-graph/psql
BenchmarkCompileGQLToSQL-8 50000 28320 ns/op 7698 B/op 154 allocs/op
PASS
ok github.com/dosco/super-graph/psql 1.724s

View File

@ -91,7 +91,7 @@ func (c *Compiler) Compile(qc *qcode.QCode, w *bytes.Buffer) (uint32, error) {
ignored |= skipped
for _, id := range v.sel.Children {
if hasBit(skipped, id) {
if hasBit(skipped, uint16(id)) {
continue
}
child := &qc.Query.Selects[id]
@ -377,7 +377,7 @@ func (v *selectBlock) renderJoinedColumns(w *bytes.Buffer, skipped uint32) error
colsRendered := len(v.sel.Cols) != 0
for _, id := range v.sel.Children {
skipThis := hasBit(skipped, id)
skipThis := hasBit(skipped, uint16(id))
if colsRendered && !skipThis {
io.WriteString(w, ", ")
@ -884,7 +884,7 @@ func alias(w *bytes.Buffer, alias string) {
w.WriteString(`"`)
}
func aliasWithID(w *bytes.Buffer, alias string, id uint16) {
func aliasWithID(w *bytes.Buffer, alias string, id int16) {
w.WriteString(` AS "`)
w.WriteString(alias)
w.WriteString(`_`)
@ -892,7 +892,7 @@ func aliasWithID(w *bytes.Buffer, alias string, id uint16) {
w.WriteString(`"`)
}
func aliasWithIDSuffix(w *bytes.Buffer, alias string, id uint16, suffix string) {
func aliasWithIDSuffix(w *bytes.Buffer, alias string, id int16, suffix string) {
w.WriteString(` AS "`)
w.WriteString(alias)
w.WriteString(`_`)
@ -917,7 +917,7 @@ func colWithTable(w *bytes.Buffer, table, col string) {
w.WriteString(`"`)
}
func colWithTableID(w *bytes.Buffer, table string, id uint16, col string) {
func colWithTableID(w *bytes.Buffer, table string, id int16, col string) {
w.WriteString(`"`)
w.WriteString(table)
w.WriteString(`_`)
@ -927,7 +927,7 @@ func colWithTableID(w *bytes.Buffer, table string, id uint16, col string) {
w.WriteString(`"`)
}
func colWithTableIDAlias(w *bytes.Buffer, table string, id uint16, col, alias string) {
func colWithTableIDAlias(w *bytes.Buffer, table string, id int16, col, alias string) {
w.WriteString(`"`)
w.WriteString(table)
w.WriteString(`_`)
@ -939,7 +939,7 @@ func colWithTableIDAlias(w *bytes.Buffer, table string, id uint16, col, alias st
w.WriteString(`"`)
}
func colWithTableIDSuffixAlias(w *bytes.Buffer, table string, id uint16,
func colWithTableIDSuffixAlias(w *bytes.Buffer, table string, id int16,
suffix, col, alias string) {
w.WriteString(`"`)
w.WriteString(table)
@ -953,7 +953,7 @@ func colWithTableIDSuffixAlias(w *bytes.Buffer, table string, id uint16,
w.WriteString(`"`)
}
func tableIDColSuffix(w *bytes.Buffer, table string, id uint16, col, suffix string) {
func tableIDColSuffix(w *bytes.Buffer, table string, id int16, col, suffix string) {
w.WriteString(`"`)
w.WriteString(table)
w.WriteString(`_`)
@ -966,18 +966,18 @@ func tableIDColSuffix(w *bytes.Buffer, table string, id uint16, col, suffix stri
const charset = "0123456789"
func int2string(w *bytes.Buffer, val uint16) {
func int2string(w *bytes.Buffer, val int16) {
if val < 10 {
w.WriteByte(charset[val])
return
}
temp := uint16(0)
temp := int16(0)
val2 := val
for val2 > 0 {
temp *= 10
temp += val2 % 10
val2 = uint16(math.Floor(float64(val2 / 10)))
val2 = int16(math.Floor(float64(val2 / 10)))
}
val3 := temp

View File

@ -480,45 +480,68 @@ func TestCompileGQL(t *testing.T) {
t.Run("syntheticTables", syntheticTables)
}
func BenchmarkCompileGQLToSQL(b *testing.B) {
gql := `query {
products(
# returns only 30 items
limit: 30,
var benchGQL = `query {
products(
# returns only 30 items
limit: 30,
# starts from item 10, commented out for now
# offset: 10,
# starts from item 10, commented out for now
# offset: 10,
# orders the response items by highest price
order_by: { price: desc },
# orders the response items by highest price
order_by: { price: desc },
# only items with an id >= 30 and < 30 are returned
where: { id: { and: { greater_or_equals: 20, lt: 28 } } }) {
id
name
price
user {
full_name
picture : avatar
}
# only items with an id >= 30 and < 30 are returned
where: { id: { and: { greater_or_equals: 20, lt: 28 } } }) {
id
name
price
user {
full_name
picture : avatar
}
}`
}
}`
w := &bytes.Buffer()
func BenchmarkCompile(b *testing.B) {
w := &bytes.Buffer{}
b.ResetTimer()
b.ReportAllocs()
for n := 0; n < b.N; n++ {
qc, err := qcompile.CompileQuery(gql)
w.Reset()
qc, err := qcompile.CompileQuery(benchGQL)
if err != nil {
b.Fatal(err)
}
_, sqlStmt, err := pcompile.Compile(qc, w)
_, err = pcompile.Compile(qc, w)
if err != nil {
b.Fatal(err)
}
w.Reset()
}
}
func BenchmarkCompileParallel(b *testing.B) {
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
w := &bytes.Buffer{}
for pb.Next() {
w.Reset()
qc, err := qcompile.CompileQuery(benchGQL)
if err != nil {
b.Fatal(err)
}
_, err = pcompile.Compile(qc, w)
if err != nil {
b.Fatal(err)
}
}
})
}