|
- package hbase
-
- import (
- "bytes"
- "math"
-
- pb "github.com/golang/protobuf/proto"
- "github.com/pingcap/go-hbase/proto"
- )
-
- type Put struct {
- Row []byte
- Families [][]byte
- Qualifiers [][][]byte
- Values [][][]byte
- Timestamp uint64
- }
-
- func NewPut(row []byte) *Put {
- return &Put{
- Row: row,
- Families: make([][]byte, 0),
- Qualifiers: make([][][]byte, 0),
- Values: make([][][]byte, 0),
- }
- }
-
- func (p *Put) GetRow() []byte {
- return p.Row
- }
-
- func (p *Put) AddValue(family, qual, value []byte) *Put {
- pos := p.posOfFamily(family)
- if pos == -1 {
- p.Families = append(p.Families, family)
- p.Qualifiers = append(p.Qualifiers, make([][]byte, 0))
- p.Values = append(p.Values, make([][]byte, 0))
-
- pos = p.posOfFamily(family)
- }
-
- p.Qualifiers[pos] = append(p.Qualifiers[pos], qual)
- p.Values[pos] = append(p.Values[pos], value)
- return p
- }
-
- func (p *Put) AddStringValue(family, column, value string) *Put {
- return p.AddValue([]byte(family), []byte(column), []byte(value))
- }
-
- func (p *Put) AddTimestamp(ts uint64) *Put {
- if ts == 0 {
- p.Timestamp = math.MaxInt64
- } else {
- p.Timestamp = ts
- }
- return p
- }
-
- func (p *Put) posOfFamily(family []byte) int {
- for p, v := range p.Families {
- if bytes.Equal(family, v) {
- return p
- }
- }
- return -1
- }
-
- func (p *Put) ToProto() pb.Message {
- put := &proto.MutationProto{
- Row: p.Row,
- MutateType: proto.MutationProto_PUT.Enum(),
- }
-
- for i, family := range p.Families {
- cv := &proto.MutationProto_ColumnValue{
- Family: family,
- }
-
- for j := range p.Qualifiers[i] {
- cv.QualifierValue = append(cv.QualifierValue, &proto.MutationProto_ColumnValue_QualifierValue{
- Qualifier: p.Qualifiers[i][j],
- Value: p.Values[i][j],
- Timestamp: pb.Uint64(p.Timestamp),
- })
- }
-
- put.ColumnValue = append(put.ColumnValue, cv)
- }
-
- return put
- }
|