googleapis / googleapis/google-cloud-go

bigtable: implement PrepareQuery and ExecuteQuery on bigtable emulator

Open
#12,049 2 comments 3 reactions 1 assignee Claimed by @sushanb View on GitHub
api: bigtable type: feature request
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.