func (cs *ThriftRpcImpl) GetValuesSingle(req *gen.SingleHFileKeyRequest) (r *gen.SingleHFileKeyResponse, err error) { if Settings.debug { log.Printf("[GetValuesSingle] %s (%d keys)\n", *req.HfileName, len(req.SortedKeys)) } hfile, err := cs.ReaderFor(*req.HfileName) if err != nil { return nil, err } reader := hfile.GetScanner() // TODO: clients should request strict during dev/testing? reader.EnforceKeyOrder = false defer reader.Release() res := new(gen.SingleHFileKeyResponse) res.Values = make(map[int32][]byte, len(req.SortedKeys)) found := int32(0) for idx, key := range req.SortedKeys { if Settings.debug { log.Printf("[GetValuesSingle] key: %s\n", hex.EncodeToString(key)) } if idx > 0 && bytes.Equal(req.SortedKeys[idx-1], key) { if prev, ok := res.Values[int32(idx-1)]; ok { res.Values[int32(idx)] = prev found++ } continue } if !hfile.MightContain(key) { continue } value, err, ok := reader.GetFirst(key) if err != nil { return nil, err } if ok { found++ if !req.GetCountOnly() { res.Values[int32(idx)] = value } } } if Settings.debug { log.Printf("[GetValuesSingle] %s found %d of %d.\n", *req.HfileName, found, len(req.SortedKeys)) } res.KeyCount = &found return res, nil }
func (cs *ThriftRpcImpl) GetValuesMulti(req *gen.SingleHFileKeyRequest) (r *gen.MultiHFileKeyResponse, err error) { if Settings.debug { log.Println("[GetValuesMulti]", len(req.SortedKeys)) } hfile, err := cs.ReaderFor(*req.HfileName) if err != nil { return nil, err } reader := hfile.GetScanner() defer reader.Release() res := new(gen.MultiHFileKeyResponse) res.Values = make(map[int32][][]byte, len(req.SortedKeys)) found := int32(0) for idx, key := range req.SortedKeys { if !hfile.MightContain(key) { continue } values, err := reader.GetAll(key) if err != nil { return nil, err } if len(values) > 0 { found += int32(len(values)) if req.PerKeyValueLimit != nil { res.Values[int32(idx)] = values[:req.GetPerKeyValueLimit()] } else { res.Values[int32(idx)] = values } } } res.KeyCount = &found return res, nil }