// Gets the uid corresponding to an xid from the posting list which stores the // mapping. func GetUid(xid string) (uint64, error) { // If string represents a UID, convert to uint64 and return. if strings.HasPrefix(xid, "_uid_:") { return strconv.ParseUint(xid[6:], 0, 64) } return farm.Fingerprint64([]byte(xid)), nil }
// newGraph returns the SubGraph and its task query. func newGraph(ctx context.Context, gq *gql.GraphQuery) (*SubGraph, error) { euid, exid := gq.UID, gq.XID // This would set the Result field in SubGraph, // and populate the children for attributes. if len(exid) > 0 { x.AssertTruef(!strings.HasPrefix(exid, "_new_:"), "Query shouldn't contain _new_") euid = farm.Fingerprint64([]byte(exid)) x.Trace(ctx, "Xid: %v Uid: %v", exid, euid) } if euid == 0 && gq.Func == nil { err := x.Errorf("Invalid query, query internal id is zero and generator is nil") x.TraceError(ctx, err) return nil, err } // For the root, the name to be used in result is stored in Alias, not Attr. // The attr at root (if present) would stand for the source functions attr. args := params{ AttrType: schema.TypeOf(gq.Alias), isDebug: gq.Alias == "debug", Alias: gq.Alias, } sg := &SubGraph{ Params: args, } if gq.Func != nil { sg.Attr = gq.Func.Attr sg.SrcFunc = append(sg.SrcFunc, gq.Func.Name) sg.SrcFunc = append(sg.SrcFunc, gq.Func.Args...) } if euid > 0 { // euid is the root UID. sg.SrcUIDs = &task.List{Uids: []uint64{euid}} sg.uidMatrix = []*task.List{&task.List{Uids: []uint64{euid}}} } sg.values = createNilValuesList(1) return sg, nil }
func main() { x.Init() fin, err := os.Open(filename) x.Check(err) defer fin.Close() scanner := bufio.NewScanner(fin) var numLines, numValues, numNames, numReleaseDates int graph = make(map[string]map[uint64][]uint64) gNames = make(map[uint64]string) gReleaseDates = make(map[uint64]string) for scanner.Scan() { numLines++ tokens := strings.Split(scanner.Text(), "\t") x.AssertTruef(len(tokens) == 4, scanner.Text()) src := tokens[0] x.AssertTrue(bracketed(src)) src = removeFirstLast(src) srcUID := farm.Fingerprint64([]byte(src)) pred := tokens[1] x.AssertTrue(bracketed(pred)) pred = removeFirstLast(pred) value := tokens[2] if bracketed(value) { // Normal edge. value = removeFirstLast(value) destUID := farm.Fingerprint64([]byte(value)) m, found := graph[pred] if !found { m = make(map[uint64][]uint64) graph[pred] = m } m[srcUID] = append(m[srcUID], destUID) } else { numValues++ // Check for "@". pos := strings.LastIndex(value, "@") if pos >= 0 { pred = pred + "." + value[pos+1:] value = removeFirstLast(value[:pos]) } if pred == "type.object.name.en" { numNames++ gNames[srcUID] = value } else if pred == "film.film.initial_release_date" { numReleaseDates++ gReleaseDates[srcUID] = value } } } fmt.Printf("Num lines read: %d\n", numLines) fmt.Printf("Num predicates: %d\n", len(graph)) fmt.Printf("Num values read: %d\n", numValues) fmt.Printf("Num names read: %d\n", numNames) fmt.Printf("Num release dates read: %d\n", numReleaseDates) x.AssertTrue(numLines > 0) x.AssertTrue(len(graph) > 0) x.AssertTrue(numValues > 0) x.AssertTrue(numNames > 0) x.AssertTrue(numReleaseDates > 0) // doFilterString() // doSortRelease() doGen() }
func main() { x.Init() fin, err := os.Open(filename) x.Check(err) defer fin.Close() scanner := bufio.NewScanner(fin) var numLines, numValues, numNames, numReleaseDates int invGraph = make(map[string]map[uint64][]uint64) for scanner.Scan() { numLines++ tokens := strings.Split(scanner.Text(), "\t") x.AssertTruef(len(tokens) == 4, scanner.Text()) src := tokens[0] x.AssertTrue(bracketed(src)) src = removeFirstLast(src) srcUID := farm.Fingerprint64([]byte(src)) pred := tokens[1] x.AssertTrue(bracketed(pred)) pred = removeFirstLast(pred) value := tokens[2] if bracketed(value) { // Normal edge. value = removeFirstLast(value) destUID := farm.Fingerprint64([]byte(value)) m, found := invGraph[pred] if !found { m = make(map[uint64][]uint64) invGraph[pred] = m } // We are building an inverse map! m[destUID] = append(m[destUID], srcUID) } else { // A value. numValues++ value = removeFirstLast(value) if pred == "type.object.name" { numNames++ // Do some custom processing here. value = strings.ToLower(value) vTokens := strings.Split(value, " ") var found bool for _, t := range vTokens { if t == "the" { found = true break } } if found { goodUIDs = append(goodUIDs, srcUID) } } else if pred == "film.film.initial_release_date" { numReleaseDates++ } } } fmt.Printf("Num lines read: %d\n", numLines) fmt.Printf("Num predicates: %d\n", len(invGraph)) fmt.Printf("Num values read: %d\n", numValues) fmt.Printf("Num names read: %d\n", numNames) fmt.Printf("Num release dates read: %d\n", numReleaseDates) fmt.Printf("Num good UIDs: %d\n", len(goodUIDs)) x.AssertTrue(numLines > 0) x.AssertTrue(len(invGraph) > 0) x.AssertTrue(numValues > 0) x.AssertTrue(numNames > 0) x.AssertTrue(numReleaseDates > 0) x.AssertTrue(len(goodUIDs) > 0) doGood() }