157 lines
3.4 KiB
Go
157 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"math/rand/v2"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/typesense/typesense-go/v2/typesense"
|
|
"github.com/typesense/typesense-go/v2/typesense/api"
|
|
"github.com/typesense/typesense-go/v2/typesense/api/pointer"
|
|
)
|
|
|
|
func main() {
|
|
if err := run(); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func run() error {
|
|
var url, apiKey string
|
|
var list, del bool
|
|
var delay time.Duration
|
|
flag.StringVar(&url, "url", "url", "url")
|
|
flag.StringVar(&apiKey, "api-key", "nope", "api key")
|
|
flag.BoolVar(&list, "list", false, "whether to list 10 latest documents from collection")
|
|
flag.BoolVar(&del, "delete", false, "whether delete collection")
|
|
flag.DurationVar(&delay, "delay", time.Second, "delay between requests")
|
|
flag.Parse()
|
|
|
|
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
|
defer stop()
|
|
|
|
client := typesense.NewClient(
|
|
typesense.WithServer(url),
|
|
typesense.WithAPIKey(apiKey),
|
|
)
|
|
|
|
{
|
|
ok, err := client.Health(ctx, 5*time.Second)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !ok {
|
|
return fmt.Errorf("health check failed")
|
|
}
|
|
}
|
|
|
|
const collectionName = "companies"
|
|
|
|
if del {
|
|
_, err := client.Collection(collectionName).Delete(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("deleted collection: %s\n", collectionName)
|
|
time.Sleep(3 * time.Second)
|
|
}
|
|
|
|
var exists bool
|
|
{
|
|
collections, err := client.Collections().Retrieve(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, collection := range collections {
|
|
fmt.Printf("listed collection: %s\n", collection.Name)
|
|
if collection.Name == collectionName {
|
|
exists = true
|
|
}
|
|
}
|
|
}
|
|
if !exists {
|
|
collection, err := client.Collections().Create(ctx, &api.CollectionSchema{
|
|
Name: "companies",
|
|
Fields: []api.Field{
|
|
{
|
|
Name: "num_employees",
|
|
Type: "int32",
|
|
},
|
|
{
|
|
Name: "created",
|
|
Type: "string",
|
|
},
|
|
{
|
|
Name: "unix",
|
|
Type: "int64",
|
|
},
|
|
},
|
|
DefaultSortingField: pointer.String("unix"),
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Printf("created collection: %s\n", collection.Name)
|
|
time.Sleep(3 * time.Second)
|
|
}
|
|
|
|
if list {
|
|
search, err := client.Collection(collectionName).Documents().Search(ctx, &api.SearchCollectionParams{
|
|
Q: pointer.String("*"),
|
|
Limit: pointer.Int(250),
|
|
SortBy: pointer.String("unix:desc"),
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for i := range *search.Hits {
|
|
hit := (*search.Hits)[len(*search.Hits)-1-i]
|
|
doc := *hit.Document
|
|
fmt.Printf("LIST: ==> %s (%s)\n", doc["created"], doc["id"])
|
|
}
|
|
}
|
|
|
|
for {
|
|
if ctx.Err() != nil {
|
|
fmt.Println("context canceled")
|
|
return nil
|
|
}
|
|
|
|
now := time.Now()
|
|
document := map[string]any{
|
|
"num_employees": rand.Int32N(10000),
|
|
"created": now.Format(time.TimeOnly),
|
|
"unix": now.Unix(),
|
|
}
|
|
|
|
var id string
|
|
documentResponse, err := client.Collection(collectionName).Documents().Create(ctx, document)
|
|
if err != nil {
|
|
fmt.Printf("create document failed: %v\n", err)
|
|
continue
|
|
}
|
|
fmt.Printf("%s ==>\n", document["created"])
|
|
|
|
id = documentResponse["id"].(string)
|
|
for {
|
|
documentResponse, err = client.Collection(collectionName).Document(id).Retrieve(ctx)
|
|
if err != nil {
|
|
if ctx.Err() != nil {
|
|
fmt.Println("context canceled")
|
|
return nil
|
|
}
|
|
time.Sleep(100 * time.Millisecond)
|
|
continue
|
|
}
|
|
fmt.Printf("==> %s (%s)\n", documentResponse["created"], documentResponse["id"])
|
|
break
|
|
}
|
|
|
|
time.Sleep(delay)
|
|
}
|
|
}
|