func TestProcessGraph(t *testing.T) { dir, dir2, _ := populateGraph(t) defer os.RemoveAll(dir) defer os.RemoveAll(dir2) // Alright. Now we have everything set up. Let's create the query. query := ` { me(_uid_: 0x01) { friend { name } name gender alive } } ` gq, _, err := gql.Parse(query) require.NoError(t, err) ctx := context.Background() sg, err := ToSubGraph(ctx, gq) require.NoError(t, err) ch := make(chan error) go ProcessGraph(ctx, sg, nil, ch) err = <-ch require.NoError(t, err) require.EqualValues(t, childAttrs(sg), []string{"friend", "name", "gender", "alive"}) require.EqualValues(t, childAttrs(sg.Children[0]), []string{"name"}) child := sg.Children[0] require.EqualValues(t, [][]uint64{ []uint64{23, 24, 25, 31, 101}, }, algo.ToUintsListForTest(child.uidMatrix)) require.EqualValues(t, []string{"name"}, childAttrs(child)) child = child.Children[0] require.EqualValues(t, []string{"Rick Grimes", "Glenn Rhee", "Daryl Dixon", "Andrea", ""}, taskValues(t, child.values)) require.EqualValues(t, []string{"Michonne"}, taskValues(t, sg.Children[1].values)) require.EqualValues(t, []string{"female"}, taskValues(t, sg.Children[2].values)) }
func TestProcessTask(t *testing.T) { dir, ps := initTest(t, `scalar friend:string @index`) defer os.RemoveAll(dir) defer ps.Close() query := newQuery("friend", []uint64{10, 11, 12}, nil) r, err := processTask(query) require.NoError(t, err) require.EqualValues(t, [][]uint64{ []uint64{23, 31}, []uint64{23}, []uint64{23, 25, 26, 31}, }, algo.ToUintsListForTest(r.UidMatrix)) }
func TestProcessSort(t *testing.T) { dir, ps := initTest(t, `scalar dob:date @index`) defer os.RemoveAll(dir) defer ps.Close() populateGraphForSort(t, ps) sort := newSort([][]uint64{ {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}, {10, 11, 12, 13, 14, 21}, {16, 17, 18, 19, 20, 21}, }, 0, 1000) r, err := processSort(sort) require.NoError(t, err) // The sorted UIDs are: (17 16 15) (20 21 19 18) (13 14 12) (11 10) require.EqualValues(t, [][]uint64{ {17, 16, 15, 20, 21, 19, 18, 13, 14, 12, 11, 10}, {21, 13, 14, 12, 11, 10}, {17, 16, 20, 21, 19, 18}}, algo.ToUintsListForTest(r.UidMatrix)) }
func TestNewGraph(t *testing.T) { dir, err := ioutil.TempDir("", "storetest_") require.NoError(t, err) gq := &gql.GraphQuery{ UID: 101, Attr: "me", } ps, err := store.NewStore(dir) require.NoError(t, err) posting.Init(ps) ctx := context.Background() sg, err := newGraph(ctx, gq) require.NoError(t, err) require.EqualValues(t, [][]uint64{ []uint64{101}, }, algo.ToUintsListForTest(sg.uidMatrix)) }
func TestProcessSortOffsetCount(t *testing.T) { dir, ps := initTest(t, `scalar dob:date @index`) defer os.RemoveAll(dir) defer ps.Close() populateGraphForSort(t, ps) input := [][]uint64{ {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}, {10, 11, 12, 13, 14, 21}, {16, 17, 18, 19, 20, 21}} // Offset 1. Count 1. sort := newSort(input, 1, 1) r, err := processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {16}, {13}, {16}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 1. Count 2. sort = newSort(input, 1, 2) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {16, 15}, {13, 14}, {16, 20}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 1. Count 3. sort = newSort(input, 1, 3) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {16, 15, 20}, {13, 14, 12}, {16, 20, 21}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 1. Count 1000. sort = newSort(input, 1, 1000) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {16, 15, 20, 21, 19, 18, 13, 14, 12, 11, 10}, {13, 14, 12, 11, 10}, {16, 20, 21, 19, 18}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 5. Count 1. sort = newSort(input, 5, 1) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {19}, {10}, {18}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 5. Count 2. sort = newSort(input, 5, 2) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {19, 18}, {10}, {18}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 5. Count 3. sort = newSort(input, 5, 3) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {19, 18, 13}, {10}, {18}}, algo.ToUintsListForTest(r.UidMatrix)) // Offset 100. Count 100. sort = newSort(input, 100, 100) r, err = processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {}, {}, {}}, algo.ToUintsListForTest(r.UidMatrix)) }
func TestProcessSortCount(t *testing.T) { dir, ps := initTest(t, `scalar dob:date @index`) defer os.RemoveAll(dir) defer ps.Close() populateGraphForSort(t, ps) input := [][]uint64{ {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}, {10, 11, 12, 13, 14, 21}, {16, 17, 18, 19, 20, 21}} // Count 1. sort := newSort(input, 0, 1) r, err := processSort(sort) require.NoError(t, err) require.EqualValues(t, [][]uint64{ {17}, {21}, {17}}, algo.ToUintsListForTest(r.UidMatrix)) // Count 2. sort = newSort(input, 0, 2) r, err = processSort(sort) require.NoError(t, err) require.NotNil(t, r) require.EqualValues(t, [][]uint64{ {17, 16}, {21, 13}, {17, 16}}, algo.ToUintsListForTest(r.UidMatrix)) // Count 5. sort = newSort(input, 0, 5) r, err = processSort(sort) require.NoError(t, err) require.NotNil(t, r) require.EqualValues(t, [][]uint64{ {17, 16, 15, 20, 21}, {21, 13, 14, 12, 11}, {17, 16, 20, 21, 19}}, algo.ToUintsListForTest(r.UidMatrix)) // Count 6. sort = newSort(input, 0, 6) r, err = processSort(sort) require.NoError(t, err) require.NotNil(t, r) require.EqualValues(t, [][]uint64{ {17, 16, 15, 20, 21, 19}, {21, 13, 14, 12, 11, 10}, {17, 16, 20, 21, 19, 18}}, algo.ToUintsListForTest(r.UidMatrix)) // Count 7. sort = newSort(input, 0, 7) r, err = processSort(sort) require.NoError(t, err) require.NotNil(t, r) require.EqualValues(t, [][]uint64{ {17, 16, 15, 20, 21, 19, 18}, {21, 13, 14, 12, 11, 10}, {17, 16, 20, 21, 19, 18}}, algo.ToUintsListForTest(r.UidMatrix)) }
// 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)) }