Skip to content

Commit

Permalink
feat: report
Browse files Browse the repository at this point in the history
  • Loading branch information
maeb committed Jan 11, 2024
1 parent 02af239 commit b6114ed
Show file tree
Hide file tree
Showing 11 changed files with 738 additions and 22 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ toolchain go1.21.3
require (
github.com/bits-and-blooms/bloom/v3 v3.6.0
github.com/dgraph-io/badger/v4 v4.2.0
github.com/google/uuid v1.5.0
github.com/gorilla/handlers v1.5.2
github.com/julienschmidt/httprouter v1.3.0
github.com/nlnwa/gowarc v1.1.2
Expand Down Expand Up @@ -39,7 +40,6 @@ require (
github.com/golang/snappy v0.0.4 // indirect
github.com/google/btree v1.1.2 // indirect
github.com/google/flatbuffers v23.5.26+incompatible // indirect
github.com/google/uuid v1.5.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
Expand Down
6 changes: 6 additions & 0 deletions index/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,9 @@ type IdResponse interface {
GetValue() string
GetError() error
}

type ReportAPI interface {
GenerateReport(context.Context, Request) (*schema.Report, error)
ListReport(context.Context) ([]*schema.Report, error)
GetReport(context.Context, string) (*schema.Report, error)
}
112 changes: 112 additions & 0 deletions internal/tikvidx/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ import (
"context"
"fmt"
"strings"
"time"

"github.com/google/uuid"
"github.com/nlnwa/gowarcserver/index"
"github.com/nlnwa/gowarcserver/internal/keyvalue"
"github.com/nlnwa/gowarcserver/schema"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/timestamppb"
)

// iterator mimics tikv's internal iterator interface
Expand Down Expand Up @@ -256,3 +259,112 @@ func (db *DB) Delete(ctx context.Context) error {

return firstErr
}

func (db *DB) GenerateReport(ctx context.Context, request index.Request) (*schema.Report, error) {

Check failure on line 263 in internal/tikvidx/api.go

View workflow job for this annotation

GitHub Actions / Linting

SA4009: argument ctx is overwritten before first use (staticcheck)
taskId, err := uuid.NewV7()
if err != nil {
return nil, err
}

startTime := time.Now()

ctx, cancel := context.WithCancel(context.Background())

Check failure on line 271 in internal/tikvidx/api.go

View workflow job for this annotation

GitHub Actions / Linting

SA4009(related information): assignment to ctx (staticcheck)
defer cancel()

report := &schema.Report{
Id: taskId.String(),
Meta: &schema.ReportMetadata{
StartTime: timestamppb.New(startTime),
},
}
key := keyvalue.KeyWithPrefix(taskId.String(), reportPrefix)
value, err := proto.Marshal(report)
if err != nil {
return nil, err
}

err = db.client.Put(ctx, key, value)
if err != nil {
return nil, err
}

// // Go routine that actually starts generating report
// go func() {
// ctx, cancel := context.WithCancel(context.Background())
// defer cancel()
// db.tasks[taskId.String()] = cancel

// func() {
// report.Meta.EndTime = timestamppb.New(time.Now())

// key := keyvalue.KeyWithPrefix(taskId.String(), reportPrefix)

// }()

// }()

return report, nil
}

// func (db *DB) Report(ctx context.Context, req index.Request, res chan<- index.ReportResponse) error {
// var it iterator
// var err error

// key := keyvalue.SearchKeyWithPrefix(req, cdxPrefix)
// it, err = newIter(ctx, key, db.client, req)
// if err != nil {
// return err
// }
// if it == nil {
// close(res)
// return nil
// }

// go func() {
// defer close(res)
// defer it.Close()

// count := 0

// for it.Valid() {
// reportResponse := func() (reportResponse index.ReportResponse) {
// key := keyvalue.CdxKey(it.Key())
// if !req.DateRange().Contains(key.Unix()) {
// return
// }
// cdx := new(schema.Cdx)
// if err := proto.Unmarshal(it.Value(), cdx); err != nil {
// reportResponse.Error = err
// } else if req.Filter().Eval(cdx) {
// reportResponse.Key = string(key)
// reportResponse.Value = cdx
// }
// return
// }()
// if reportResponse == (index.ReportResponse{}) {
// if err = it.Next(); err != nil {
// res <- index.ReportResponse{Error: err}
// break
// }
// continue
// }
// select {
// case <-ctx.Done():
// res <- index.ReportResponse{Error: ctx.Err()}
// return
// case res <- reportResponse:
// if reportResponse.Error == nil {
// count++
// }
// }
// if req.Limit() > 0 && count >= req.Limit() {
// break
// }
// if err = it.Next(); err != nil {
// res <- index.ReportResponse{Error: err}
// break
// }
// }
// }()
// return nil
// }
10 changes: 7 additions & 3 deletions internal/tikvidx/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@ import (
)

var (
idPrefix = "i"
filePrefix = "f"
cdxPrefix = "c"
idPrefix = "i"
filePrefix = "f"
cdxPrefix = "c"
reportPrefix = "r"
)

const delimiter = "_"
Expand All @@ -46,6 +47,7 @@ type DB struct {
batch chan index.Record
done chan struct{}
wg sync.WaitGroup
tasks map[string]context.CancelFunc
}

func NewDB(options ...Option) (db *DB, err error) {
Expand All @@ -61,6 +63,7 @@ func NewDB(options ...Option) (db *DB, err error) {
idPrefix = dbName + delimiter + idPrefix + delimiter
filePrefix = dbName + delimiter + filePrefix + delimiter
cdxPrefix = dbName + delimiter + cdxPrefix + delimiter
reportPrefix = dbName + delimiter + reportPrefix + delimiter

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
Expand All @@ -75,6 +78,7 @@ func NewDB(options ...Option) (db *DB, err error) {
db = &DB{
client: client,
done: done,
tasks: make(map[string]context.CancelFunc),
}

if opts.ReadOnly {
Expand Down
Loading

0 comments on commit b6114ed

Please sign in to comment.