114 lines
2.7 KiB
Go
114 lines
2.7 KiB
Go
|
package hbase
|
||
|
|
||
|
import (
|
||
|
pb "github.com/golang/protobuf/proto"
|
||
|
"github.com/pingcap/go-hbase/proto"
|
||
|
|
||
|
"fmt"
|
||
|
"math"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type Delete struct {
|
||
|
Row []byte
|
||
|
Families set
|
||
|
FamilyQuals map[string]set
|
||
|
Ts map[string]uint64
|
||
|
}
|
||
|
|
||
|
func NewDelete(row []byte) *Delete {
|
||
|
return &Delete{
|
||
|
Row: row,
|
||
|
Families: newSet(),
|
||
|
FamilyQuals: make(map[string]set),
|
||
|
Ts: make(map[string]uint64),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (d *Delete) AddString(famqual string) error {
|
||
|
parts := strings.Split(famqual, ":")
|
||
|
|
||
|
if len(parts) > 2 {
|
||
|
return fmt.Errorf("Too many colons were found in the family:qualifier string. '%s'", famqual)
|
||
|
} else if len(parts) == 2 {
|
||
|
d.AddStringColumn(parts[0], parts[1])
|
||
|
} else {
|
||
|
d.AddStringFamily(famqual)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (d *Delete) GetRow() []byte {
|
||
|
return d.Row
|
||
|
}
|
||
|
|
||
|
func (d *Delete) AddColumn(family, qual []byte) *Delete {
|
||
|
d.AddFamily(family)
|
||
|
d.FamilyQuals[string(family)].add(string(qual))
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
func (d *Delete) AddStringColumn(family, qual string) *Delete {
|
||
|
return d.AddColumn([]byte(family), []byte(qual))
|
||
|
}
|
||
|
|
||
|
func (d *Delete) AddFamily(family []byte) *Delete {
|
||
|
d.Families.add(string(family))
|
||
|
if _, ok := d.FamilyQuals[string(family)]; !ok {
|
||
|
d.FamilyQuals[string(family)] = newSet()
|
||
|
}
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
func (d *Delete) AddStringFamily(family string) *Delete {
|
||
|
return d.AddFamily([]byte(family))
|
||
|
}
|
||
|
|
||
|
func (d *Delete) AddColumnWithTimestamp(family, qual []byte, ts uint64) *Delete {
|
||
|
d.AddColumn(family, qual)
|
||
|
k := string(family) + ":" + string(qual)
|
||
|
d.Ts[k] = ts
|
||
|
return d
|
||
|
}
|
||
|
|
||
|
func (d *Delete) ToProto() pb.Message {
|
||
|
del := &proto.MutationProto{
|
||
|
Row: d.Row,
|
||
|
MutateType: proto.MutationProto_DELETE.Enum(),
|
||
|
}
|
||
|
|
||
|
for family := range d.Families {
|
||
|
cv := &proto.MutationProto_ColumnValue{
|
||
|
Family: []byte(family),
|
||
|
QualifierValue: make([]*proto.MutationProto_ColumnValue_QualifierValue, 0),
|
||
|
}
|
||
|
|
||
|
if len(d.FamilyQuals[family]) == 0 {
|
||
|
cv.QualifierValue = append(cv.QualifierValue, &proto.MutationProto_ColumnValue_QualifierValue{
|
||
|
Qualifier: nil,
|
||
|
Timestamp: pb.Uint64(uint64(math.MaxInt64)),
|
||
|
DeleteType: proto.MutationProto_DELETE_FAMILY.Enum(),
|
||
|
})
|
||
|
}
|
||
|
|
||
|
for qual := range d.FamilyQuals[family] {
|
||
|
v := &proto.MutationProto_ColumnValue_QualifierValue{
|
||
|
Qualifier: []byte(qual),
|
||
|
Timestamp: pb.Uint64(uint64(math.MaxInt64)),
|
||
|
DeleteType: proto.MutationProto_DELETE_MULTIPLE_VERSIONS.Enum(),
|
||
|
}
|
||
|
tsKey := string(family) + ":" + string(qual)
|
||
|
if ts, ok := d.Ts[tsKey]; ok {
|
||
|
v.Timestamp = pb.Uint64(ts)
|
||
|
v.DeleteType = proto.MutationProto_DELETE_ONE_VERSION.Enum()
|
||
|
}
|
||
|
cv.QualifierValue = append(cv.QualifierValue, v)
|
||
|
}
|
||
|
|
||
|
del.ColumnValue = append(del.ColumnValue, cv)
|
||
|
}
|
||
|
|
||
|
return del
|
||
|
}
|