77 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
package hbase
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	"github.com/pingcap/go-hbase/proto"
 | 
						|
)
 | 
						|
 | 
						|
type Kv struct {
 | 
						|
	Row   []byte
 | 
						|
	Ts    uint64
 | 
						|
	Value []byte
 | 
						|
	// history results
 | 
						|
	Values map[uint64][]byte
 | 
						|
	Column
 | 
						|
}
 | 
						|
 | 
						|
func (kv *Kv) String() string {
 | 
						|
	if kv == nil {
 | 
						|
		return "<nil>"
 | 
						|
	}
 | 
						|
	return fmt.Sprintf("Kv(%+v)", *kv)
 | 
						|
}
 | 
						|
 | 
						|
type ResultRow struct {
 | 
						|
	Row           []byte
 | 
						|
	Columns       map[string]*Kv
 | 
						|
	SortedColumns []*Kv
 | 
						|
}
 | 
						|
 | 
						|
func (r *ResultRow) String() string {
 | 
						|
	if r == nil {
 | 
						|
		return "<nil>"
 | 
						|
	}
 | 
						|
	return fmt.Sprintf("ResultRow(%+v)", *r)
 | 
						|
}
 | 
						|
 | 
						|
func NewResultRow(result *proto.Result) *ResultRow {
 | 
						|
	// empty response
 | 
						|
	if len(result.GetCell()) == 0 {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	res := &ResultRow{}
 | 
						|
	res.Columns = make(map[string]*Kv)
 | 
						|
	res.SortedColumns = make([]*Kv, 0)
 | 
						|
 | 
						|
	for _, cell := range result.GetCell() {
 | 
						|
		res.Row = cell.GetRow()
 | 
						|
 | 
						|
		col := &Kv{
 | 
						|
			Row: res.Row,
 | 
						|
			Column: Column{
 | 
						|
				Family: cell.GetFamily(),
 | 
						|
				Qual:   cell.GetQualifier(),
 | 
						|
			},
 | 
						|
			Value: cell.GetValue(),
 | 
						|
			Ts:    cell.GetTimestamp(),
 | 
						|
		}
 | 
						|
 | 
						|
		colName := string(col.Column.Family) + ":" + string(col.Column.Qual)
 | 
						|
 | 
						|
		if v, exists := res.Columns[colName]; exists {
 | 
						|
			// renew the same cf result
 | 
						|
			if col.Ts > v.Ts {
 | 
						|
				v.Value = col.Value
 | 
						|
				v.Ts = col.Ts
 | 
						|
			}
 | 
						|
			v.Values[col.Ts] = col.Value
 | 
						|
		} else {
 | 
						|
			col.Values = map[uint64][]byte{col.Ts: col.Value}
 | 
						|
			res.Columns[colName] = col
 | 
						|
			res.SortedColumns = append(res.SortedColumns, col)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return res
 | 
						|
}
 |