// Index-related test. Similar to TestProcessTaskIndeMLayer except we call // MergeLists in between a lot of updates. func TestProcessTaskIndex(t *testing.T) { dir, ps := initTest(t, `scalar friend:string @index`) defer os.RemoveAll(dir) defer ps.Close() query := newQuery("friend", nil, []string{"anyof", "hey photon"}) r, err := processTask(query) require.NoError(t, err) require.EqualValues(t, [][]uint64{ []uint64{}, []uint64{10, 12}, }, algo.ToUintsListForTest(r.UidMatrix)) posting.CommitLists(10) time.Sleep(200 * time.Millisecond) // Let the index process jobs from channel. // Now try changing 12's friend value from "photon" to "notphotonExtra" to // "notphoton". edge := &task.DirectedEdge{ Value: []byte("notphotonExtra"), Label: "author0", Attr: "friend", Entity: 12, } addEdge(t, edge, getOrCreate(x.DataKey("friend", 12))) edge.Value = []byte("notphoton") addEdge(t, edge, getOrCreate(x.DataKey("friend", 12))) time.Sleep(200 * time.Millisecond) // Let the index process jobs from channel. // Issue a similar query. query = newQuery("friend", nil, []string{"anyof", "hey photon notphoton notphotonExtra"}) r, err = processTask(query) require.NoError(t, err) require.EqualValues(t, [][]uint64{ []uint64{}, []uint64{10}, []uint64{12}, []uint64{}, }, algo.ToUintsListForTest(r.UidMatrix)) posting.CommitLists(10) time.Sleep(200 * time.Millisecond) // Let the index process jobs from channel. // Try deleting. edge = &task.DirectedEdge{ Value: []byte("photon"), Label: "author0", Attr: "friend", Entity: 10, } // Redundant deletes. delEdge(t, edge, getOrCreate(x.DataKey("friend", 10))) delEdge(t, edge, getOrCreate(x.DataKey("friend", 10))) // Delete followed by set. edge.Entity = 12 edge.Value = []byte("notphoton") delEdge(t, edge, getOrCreate(x.DataKey("friend", 12))) edge.Value = []byte("ignored") addEdge(t, edge, getOrCreate(x.DataKey("friend", 12))) time.Sleep(200 * time.Millisecond) // Let indexing finish. // Issue a similar query. query = newQuery("friend", nil, []string{"anyof", "photon notphoton ignored"}) r, err = processTask(query) require.NoError(t, err) require.EqualValues(t, [][]uint64{ []uint64{}, []uint64{}, []uint64{12}, }, algo.ToUintsListForTest(r.UidMatrix)) }
func TestBackup(t *testing.T) { // Index the name predicate. We ensure it doesn't show up on backup. dir, ps := initTestBackup(t, "scalar name:string @index") defer os.RemoveAll(dir) defer ps.Close() // Remove already existing backup folders is any. bdir, err := ioutil.TempDir("", "backup") require.NoError(t, err) defer os.RemoveAll(bdir) posting.CommitLists(10) time.Sleep(time.Second) // We have 4 friend type edges. FP("friends")%10 = 2. err = backup(group.BelongsTo("friend"), bdir) require.NoError(t, err) // We have 2 name type edges(with index). FP("name")%10 =7. err = backup(group.BelongsTo("name"), bdir) require.NoError(t, err) searchDir := bdir fileList := []string{} err = filepath.Walk(searchDir, func(path string, f os.FileInfo, err error) error { if path != bdir { fileList = append(fileList, path) } return nil }) require.NoError(t, err) var counts []int for _, file := range fileList { f, err := os.Open(file) require.NoError(t, err) r, err := gzip.NewReader(f) require.NoError(t, err) scanner := bufio.NewScanner(r) count := 0 for scanner.Scan() { nq, err := rdf.Parse(scanner.Text()) require.NoError(t, err) // Subject should have uid 1/2/3/4. require.Contains(t, []string{"_uid_:0x1", "_uid_:0x2", "_uid_:0x3", "_uid_:0x4"}, nq.Subject) // The only value we set was "photon". if !bytes.Equal(nq.ObjectValue, nil) { require.Equal(t, []byte("pho\\ton"), nq.ObjectValue) } // The only objectId we set was uid 5. if nq.ObjectId != "" { require.Equal(t, "_uid_:0x5", nq.ObjectId) } count++ } counts = append(counts, count) require.NoError(t, scanner.Err()) } // This order will bw presereved due to file naming. require.Equal(t, []int{4, 2}, counts) }