Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 20 additions & 38 deletions cbt.go
Original file line number Diff line number Diff line change
Expand Up @@ -1393,10 +1393,7 @@ func doLookup(ctx context.Context, args ...string) {
filters = append(filters, bigtable.LatestNFilter(n))
}
if columns := parsed["columns"]; columns != "" {
columnFilters, err := parseColumnsFilter(columns)
if err != nil {
log.Fatal(err)
}
columnFilters := parseColumnsFilter(columns)
filters = append(filters, columnFilters)
}

Expand Down Expand Up @@ -1636,10 +1633,7 @@ func doRead(ctx context.Context, args ...string) {
filters = append(filters, bigtable.RowKeyFilter(regex))
}
if columns := parsed["columns"]; columns != "" {
columnFilters, err := parseColumnsFilter(columns)
if err != nil {
log.Fatal(err)
}
columnFilters := parseColumnsFilter(columns)
filters = append(filters, columnFilters)
}
var keysOnly bool
Expand Down Expand Up @@ -1761,10 +1755,7 @@ func doCheckAndMutate(ctx context.Context, args ...string) {
// Parse the lookup test.
filter := bigtable.LatestNFilter(1)
if arg, ok := parsed["columns"]; ok {
var err error
if filter, err = parseColumnsFilter(arg); err != nil {
log.Fatalf("While parsing columns=...: %v", err)
}
filter = parseColumnsFilter(arg)
}

// Parse mutations.
Expand Down Expand Up @@ -2680,44 +2671,35 @@ func stringInSlice(s string, list []string) bool {
return false
}

func parseColumnsFilter(columns string) (bigtable.Filter, error) {
func parseColumnsFilter(columns string) bigtable.Filter {
splitColumns := strings.FieldsFunc(columns, func(c rune) bool { return c == ',' })
if len(splitColumns) == 1 {
filter, err := columnFilter(splitColumns[0])
if err != nil {
return nil, err
}
return filter, nil
filter := columnFilter(splitColumns[0])
return filter
}

var columnFilters []bigtable.Filter
for _, column := range splitColumns {
filter, err := columnFilter(column)
if err != nil {
return nil, err
}
filter := columnFilter(column)
columnFilters = append(columnFilters, filter)
}
return bigtable.InterleaveFilters(columnFilters...), nil
return bigtable.InterleaveFilters(columnFilters...)
}

func columnFilter(column string) (bigtable.Filter, error) {
splitColumn := strings.Split(column, ":")
func columnFilter(column string) bigtable.Filter {
splitColumn := strings.SplitN(column, ":", 2)
if len(splitColumn) == 1 {
return bigtable.ColumnFilter(splitColumn[0]), nil
} else if len(splitColumn) == 2 {
if strings.HasSuffix(column, ":") {
return bigtable.FamilyFilter(splitColumn[0]), nil
} else if strings.HasPrefix(column, ":") {
return bigtable.ColumnFilter(splitColumn[1]), nil
} else {
familyFilter := bigtable.FamilyFilter(splitColumn[0])
qualifierFilter := bigtable.ColumnFilter(splitColumn[1])
return bigtable.ChainFilters(familyFilter, qualifierFilter), nil
}
} else {
return nil, fmt.Errorf("bad format for column %q", column)
return bigtable.ColumnFilter(splitColumn[0])
}

family, qualifier := splitColumn[0], splitColumn[1]
if family == "" {
return bigtable.ColumnFilter(qualifier)
}
if qualifier == "" {
return bigtable.FamilyFilter(family)
}
return bigtable.ChainFilters(bigtable.FamilyFilter(family), bigtable.ColumnFilter(qualifier))
}

func parseProfileRoute(str string) (routingPolicy, clusterID string, err error) {
Expand Down
35 changes: 13 additions & 22 deletions cbt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,8 @@ func TestParseArgs(t *testing.T) {

func TestParseColumnsFilter(t *testing.T) {
tests := []struct {
in string
out bigtable.Filter
fail bool
in string
out bigtable.Filter
}{
{
in: "columnA",
Expand Down Expand Up @@ -178,29 +177,21 @@ func TestParseColumnsFilter(t *testing.T) {
),
},
{
in: "familyA:columnA:cellA",
fail: true,
in: "familyA:columnA:cellA",
out: bigtable.ChainFilters(bigtable.FamilyFilter("familyA"), bigtable.ColumnFilter("columnA:cellA")),
},
{
in: "familyA::columnA",
out: bigtable.ChainFilters(bigtable.FamilyFilter("familyA"), bigtable.ColumnFilter(":columnA")),
},
{
in: "familyA::columnA",
fail: true,
in: ":",
out: bigtable.ColumnFilter(""),
},
}

for _, tc := range tests {
got, err := parseColumnsFilter(tc.in)

if !tc.fail && err != nil {
t.Errorf("parseColumnsFilter(%q) unexpectedly failed: %v", tc.in, err)
continue
}
if tc.fail && err == nil {
t.Errorf("parseColumnsFilter(%q) did not fail", tc.in)
continue
}
if tc.fail {
continue
}
got := parseColumnsFilter(tc.in)

var cmpOpts cmp.Options
cmpOpts =
Expand Down Expand Up @@ -482,14 +473,14 @@ func TestPrintRowWithHighTimestamp(t *testing.T) {
mut := bigtable.NewMutation()

loc, err := time.LoadLocation("US/Pacific")
if (err != nil) {
if err != nil {
t.Fatalf("Failed to load timezone: %v", err)
}

// a timestamp that is just over int64 max in nanoseconds
mut.Set("my-family", "foo", 9223372036855000, []byte("bar"))
err = tbl.Apply(ctx, "my-key", mut)
if (err != nil) {
if err != nil {
t.Fatalf("Could not write some rows to prepare the test.")
}
row, err := tbl.ReadRow(ctx, "my-key")
Expand Down