googleapis / googleapis/google-cloud-go
bigtable: implement PrepareQuery and ExecuteQuery on bigtable emulator
- Dominant language
- Go
- Stars
- 4.5k
- Forks
- 1.6k
- Avg merge
- 1d 13h
- Merged PRs (30d)
- 109
Description
## Is your feature request related to a problem? Please describe.
PrepareQuery and ExecuteQuery were introduced in release 1.36, but the bigtable emulator doesn't support it. This prevents us from using Bigtable SQL since we can't write tests using this feature in our current setup with integration tests using the emulator.
## Describe the solution you'd like
Implement those methods on the emulator: https://github.com/googleapis/google-cloud-go/blob/main/bigtable/bttest/inmem.go#L1453.
## Describe alternatives you've considered
-
## Additional context
```go
package main
import (
"context"
"fmt"
"log"
"os"
"cloud.google.com/go/bigtable"
)
const (
projectID = "test"
instanceID = "my-instance"
tableName = "my-instance-table"
)
func main() {
if err := os.Setenv("BIGTABLE_EMULATOR_HOST", "localhost:8086"); err != nil {
log.Fatalf("Setenv: %v", err)
}
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, projectID, instanceID)
if err != nil {
log.Fatalf("NewAdminClient: %v", err)
}
_ = adminClient.DeleteTable(ctx, tableName)
tableConf := bigtable.TableConf{
TableID: tableName,
Families: map[string]bigtable.GCPolicy{
"cf": bigtable.MaxVersionsPolicy(1),
},
}
if err := adminClient.CreateTableFromConf(ctx, &tableConf); err != nil {
log.Fatalf("CreateTableFromConf: %v", err)
}
client, err := bigtable.NewClient(ctx, projectID, instanceID)
if err != nil {
log.Fatalf("NewClient: %v", err)
}
tbl := client.Open(tableName)
mut := bigtable.NewMutation()
mut.Set("cf", "col", bigtable.Timestamp(1000), []byte("val"))
if err := tbl.Apply(ctx, "r1", mut); err != nil {
log.Fatalf("mut err: %v", err)
}
stmt, err := client.PrepareStatement(
ctx,
"SELECT cf['col'] as cfcol FROM my-instance-table WHERE _key=@rowKey",
map[string]bigtable.SQLType{
"rowKey": bigtable.BytesSQLType{},
},
)
if err != nil {
log.Fatalf("PrepareStatement: %v", err)
}
bs, err := stmt.Bind(map[string]any{
"rowKey": []byte("r1"),
})
if err != nil {
log.Fatalf("Bind: %v", err)
}
var val []uint8
err = bs.Execute(ctx, func(rr bigtable.ResultRow) bool {
err := rr.GetByName("cfcol", &val)
if err != nil {
log.Fatalf("GetByName: %v", err)
}
return true
})
if err != nil {
log.Fatalf("Execute: %v", err)
}
fmt.Printf("val: %+v\n", string(val))
}
```
docker-compose.yml
```
services:
bigtable-emulator:
image: google/cloud-sdk:latest
container_name: bigtable_test
platform: linux/amd64
ports:
- "8086:8086"
command: gcloud beta emulators bigtable start --host-port=0.0.0.0:8086
```
Contributor guide
Assessment
This issue has not been assessed yet.