package tdb import ( "testing" // "encoding/ascii85" // "log" // "reflect" // "strconv" // "git.keganmyers.com/terribleplan/tdb/stringy" // bolt "go.etcd.io/bbolt" // "github.com/golang/protobuf/proto" ) func TestSimpleQuery(t *testing.T) { setupTestDb() defer cleanupTestDb() guarantee := randomString(16) id := tdb.TEST_Main.CreateOrPanic(&TEST_Main{Guarantee: guarantee}) items, err := tdb.TEST_Main.Query(). Where("Id", "=", id). Run() if assertNilEnd(t, err, "Unable to run query") { return } if assertEqualEnd(t, len(items), 1, "Wrong number of results") { return } tmi, ok := items[0].(*TEST_Main) if assertOkEnd(t, ok, "Unable to cast returned to *TEST_Main") { return } assertEqual(t, tmi.Guarantee, guarantee, "Mismatched guarantee strings") } func TestSimpleQueryAmongstMany(t *testing.T) { setupTestDb() defer cleanupTestDb() guarantee := randomString(16) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) // id: 6 id := tdb.TEST_Main.CreateOrPanic(&TEST_Main{Guarantee: guarantee}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) items, err := tdb.TEST_Main.Query(). Where("Id", "=", id). Run() if assertNilEnd(t, err, "Unable to run query") { return } if assertEqualEnd(t, len(items), 1, "Wrong number of results") { return } tmi, ok := items[0].(*TEST_Main) if assertOkEnd(t, ok, "Unable to cast returned to *TEST_Main") { return } assertEqual(t, tmi.Guarantee, guarantee, "Mismatched guarantee strings") } func TestForeignQuery(t *testing.T) { setupTestDb() defer cleanupTestDb() mid1 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) mid2 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) id1 := tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) id3 := tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) q := tdb.TEST_OwnedBy.Query(). Where("MainId", "=", mid1) items, err := q.Run() if assertNilEnd(t, err, "Unable to run query") { return } if assertEqualEnd(t, len(items), 2, "Wrong number of results") { return } for _, item := range items { tmi, ok := item.(*TEST_OwnedBy) if assertOkEnd(t, ok, "Unable to cast returned item to *TEST_OwnedBy") { continue } assertEqual(t, tmi.MainId, mid1, "Got result with bad MainId") if tmi.Id != id1 && tmi.Id != id3 { t.Errorf("Got result with bad Id: got %d, expected %d or %d", tmi.Id, id1, id3) } } qd := q.(*queryData) assertUint64Equal(t, qd.sr, 2, "Scanned incorrect number of records") } func EmptyIndexQuery(t *testing.T) { setupTestDb() defer cleanupTestDb() mid1 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) mid2 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) q := tdb.TEST_OwnedBy.Query(). Where("MainId", "=", mid1) items, err := q.Run() if assertNilEnd(t, err, "Unable to run query") { return } if assertEqualEnd(t, len(items), 0, "Wrong number of results") { return } qd := q.(*queryData) assertUint64Equal(t, qd.sr, 0, "Scanned incorrect number of records") } func TestComplexQueryAmongstMany(t *testing.T) { setupTestDb() defer cleanupTestDb() guarantee := randomString(16) mid1 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) mid2 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) id := tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2, Guarantee: guarantee}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1}) tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2}) q := tdb.TEST_OwnedBy.Query(). Where("MainId", "=", mid2). // indexed, speeds query Where("Guarantee", "=", guarantee) // non-indexed, filters during index scan items, err := q.Run() if assertNilEnd(t, err, "Unable to run query") { return } if assertEqualEnd(t, len(items), 1, "Wrong number of results") { return } tobi, ok := items[0].(*TEST_OwnedBy) if assertOkEnd(t, ok, "Unable to cast returned to *TEST_OwnedBy") { return } assertEqual(t, tobi.Id, id, "Mismatched IDs") assertEqual(t, tobi.Guarantee, guarantee, "Mismatched guarantee strings") qd := q.(*queryData) assertUint64Equal(t, qd.sr, 6, "Scanned incorrect number of records") }