// sortByValue fetches values and sort UIDList. func sortByValue(attr string, ul *task.List, scalar types.Scalar, desc bool) error { values := make([]types.Value, len(ul.Uids)) for i, uid := range ul.Uids { val, err := fetchValue(uid, attr, scalar) if err != nil { return err } values[i] = val } return scalar.Sort(values, ul, desc) }
// getPostingValue looks up key, gets the value, converts it. If any error is // encountered, we return nil. This is used in some filtering where we do not // want to waste time creating errors. func getPostingValue(key []byte, scalarType types.Scalar) *types.Value { pl, decr := posting.GetOrCreate(key) defer decr() valBytes, vType, err := pl.Value() if bytes.Equal(valBytes, nil) { return nil } val := types.ValueForType(types.TypeID(vType)) if val == nil { return nil } if err := val.UnmarshalBinary(valBytes); err != nil { return nil } // Convert to schema type. sv, err := scalarType.Convert(val) if err != nil { return nil } return &sv }
// fetchValue gets the value for a given UID. func fetchValue(uid uint64, attr string, scalar types.Scalar) (types.Value, error) { pl, decr := posting.GetOrCreate(x.DataKey(attr, uid)) defer decr() valBytes, vType, err := pl.Value() if err != nil { return nil, err } val := types.ValueForType(types.TypeID(vType)) if val == nil { return nil, x.Errorf("Invalid type: %v", vType) } err = val.UnmarshalBinary(valBytes) if err != nil { return nil, err } schemaVal, err := scalar.Convert(val) if err != nil { return nil, err } return schemaVal, nil }