featurebase/querycontext/dot_test.go
Seebs 75a68cf60c querycontext updates/changes to support the big changeover
This is a unification of a number of bug fixes, feature additions,
and so on. Features include:

* Dropping the "New" from NewWrite/NewRead.
* IndexName->keys.Index, etc.
* Add a new "Flush" operation which is necessary to get the
  intended behavior of Delete, which allows us to commit/flush
  changes without letting go of a write lock.
* Some additional wrapping and locking in rbfTxWrappers to
  support that. rbfQueryRead/Write now forward their calls
  to the parent rbfTxWrappers, so it can lock around the
  reference to its underlying tx, so the flush operation can
  replace that tx safely.
* AddIndexShards now treats no shards as "all shards", to
  simplify call sites.
* Added parameters to NewRBFTxStore to let it interact with
  executor's logger and worker pool.
* Internally, support explicit closes of parts of the database
  which can also check for errors and fail if it's in use.
* Add ability to request a map of fields and views in use
  for a given index/shard pair. This is probably deprecated
  but we need it for the way backup/restore work.
* Add ability to request a complete map of the database showing
  which shards exist for which index/field/view tuples. This is
  backwards from how we store things on disk, but we need it
  to allow creating the right in-memory data structures on
  database open.
* Add "Backend()" method to let us distinguish backends in case
  we some day have them again.
* Support deleting indexes, fields, or fragments.
* Support Backup (returning a ReadCloser that dumps the RBF
  file, implicitly merging any current WAL) and Restore (create
  a new RBF file).
* Change directory structure and fragment keys to match existing
  databases, so we should in theory be able to open an existing
  data directory.
* Fragment delete probably doesn't lock correctly and this
  should be reviewed.
* Export the DOT-format Dump so we can hook it up to a debug
  endpoint. This wants to be explored more; ideally the front-end
  UI should be able to display this.
* Create a NopTxStore which can be used like a TxStore but everything
  that can error errors out. This is then used to let a holder that
  hasn't had a txstore initialized work anyway.

There's at least a couple of open issues that need to be revisited
here.
2023-01-11 12:52:04 -06:00

44 lines
1.3 KiB
Go

// Copyright 2022 Molecula Corp (DBA FeatureBase). All rights reserved.
package querycontext
import (
"context"
"os"
"testing"
"github.com/molecula/featurebase/v3/keys"
)
func TestDot(t *testing.T) {
// test this with two splitters, one of which is the default indexShardKeySplitter. the second one will overwrite
// the output from the first one.
for _, splitter := range []KeySplitter{&flexibleKeySplitter{splitIndexes: map[keys.Index]struct{}{"i": {}}}, nil} {
txs := testTxStore(t, "foo", splitter)
file, err := os.Create("test.dot")
if err != nil {
t.Fatalf("creating file: %v", err)
}
defer file.Close()
q, _ := txs.NewWriteQueryContext(context.Background(), txs.Scope().AddIndex("i").AddIndexShards("k", 0))
defer q.Release()
q.Write("i", "f", "v", 0)
q.Write("i", "g", "v", 0)
q.Write("i", "f", "v", 1)
// read, but it's in a writable thing, so still creates rbfQueryWrite
q.Read("i", "f", "v", 2)
q.Read("j", "f", "v", 0)
q2, _ := txs.NewQueryContext(context.Background())
defer q2.Release()
q2.Read("i", "f", "v", 0)
q2.Read("i", "g", "v", 0)
var dg dotGraph
// we know what we actually have here...
inner := txs.inner
dg.enqueue(inner.(*rbfTxStore))
dg.build(5)
err = dg.Write(file)
if err != nil {
t.Fatalf("writing dot: %v", err)
}
}
}