github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/go-hbase/del.go (about)

     1  package hbase
     2  
     3  import (
     4  	pb "github.com/insionng/yougam/libraries/golang/protobuf/proto"
     5  	"github.com/insionng/yougam/libraries/pingcap/go-hbase/proto"
     6  
     7  	"fmt"
     8  	"math"
     9  	"strings"
    10  )
    11  
    12  type Delete struct {
    13  	Row         []byte
    14  	Families    set
    15  	FamilyQuals map[string]set
    16  	Ts          map[string]uint64
    17  }
    18  
    19  func NewDelete(row []byte) *Delete {
    20  	return &Delete{
    21  		Row:         row,
    22  		Families:    newSet(),
    23  		FamilyQuals: make(map[string]set),
    24  		Ts:          make(map[string]uint64),
    25  	}
    26  }
    27  
    28  func (d *Delete) AddString(famqual string) error {
    29  	parts := strings.Split(famqual, ":")
    30  
    31  	if len(parts) > 2 {
    32  		return fmt.Errorf("Too many colons were found in the family:qualifier string. '%s'", famqual)
    33  	} else if len(parts) == 2 {
    34  		d.AddStringColumn(parts[0], parts[1])
    35  	} else {
    36  		d.AddStringFamily(famqual)
    37  	}
    38  
    39  	return nil
    40  }
    41  
    42  func (d *Delete) GetRow() []byte {
    43  	return d.Row
    44  }
    45  
    46  func (d *Delete) AddColumn(family, qual []byte) *Delete {
    47  	d.AddFamily(family)
    48  	d.FamilyQuals[string(family)].add(string(qual))
    49  	return d
    50  }
    51  
    52  func (d *Delete) AddStringColumn(family, qual string) *Delete {
    53  	return d.AddColumn([]byte(family), []byte(qual))
    54  }
    55  
    56  func (d *Delete) AddFamily(family []byte) *Delete {
    57  	d.Families.add(string(family))
    58  	if _, ok := d.FamilyQuals[string(family)]; !ok {
    59  		d.FamilyQuals[string(family)] = newSet()
    60  	}
    61  	return d
    62  }
    63  
    64  func (d *Delete) AddStringFamily(family string) *Delete {
    65  	return d.AddFamily([]byte(family))
    66  }
    67  
    68  func (d *Delete) AddColumnWithTimestamp(family, qual []byte, ts uint64) *Delete {
    69  	d.AddColumn(family, qual)
    70  	k := string(family) + ":" + string(qual)
    71  	d.Ts[k] = ts
    72  	return d
    73  }
    74  
    75  func (d *Delete) ToProto() pb.Message {
    76  	del := &proto.MutationProto{
    77  		Row:        d.Row,
    78  		MutateType: proto.MutationProto_DELETE.Enum(),
    79  	}
    80  
    81  	for family := range d.Families {
    82  		cv := &proto.MutationProto_ColumnValue{
    83  			Family:         []byte(family),
    84  			QualifierValue: make([]*proto.MutationProto_ColumnValue_QualifierValue, 0),
    85  		}
    86  
    87  		if len(d.FamilyQuals[family]) == 0 {
    88  			cv.QualifierValue = append(cv.QualifierValue, &proto.MutationProto_ColumnValue_QualifierValue{
    89  				Qualifier:  nil,
    90  				Timestamp:  pb.Uint64(uint64(math.MaxInt64)),
    91  				DeleteType: proto.MutationProto_DELETE_FAMILY.Enum(),
    92  			})
    93  		}
    94  
    95  		for qual := range d.FamilyQuals[family] {
    96  			v := &proto.MutationProto_ColumnValue_QualifierValue{
    97  				Qualifier:  []byte(qual),
    98  				Timestamp:  pb.Uint64(uint64(math.MaxInt64)),
    99  				DeleteType: proto.MutationProto_DELETE_MULTIPLE_VERSIONS.Enum(),
   100  			}
   101  			tsKey := string(family) + ":" + string(qual)
   102  			if ts, ok := d.Ts[tsKey]; ok {
   103  				v.Timestamp = pb.Uint64(ts)
   104  				v.DeleteType = proto.MutationProto_DELETE_ONE_VERSION.Enum()
   105  			}
   106  			cv.QualifierValue = append(cv.QualifierValue, v)
   107  		}
   108  
   109  		del.ColumnValue = append(del.ColumnValue, cv)
   110  	}
   111  
   112  	return del
   113  }