You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.5 KiB
153 lines
4.5 KiB
// Copyright (C) 2017 The GoHBase Authors. All rights reserved. |
|
// This file is part of GoHBase. |
|
// Use of this source code is governed by the Apache License 2.0 |
|
// that can be found in the COPYING file. |
|
|
|
package hrpc |
|
|
|
import ( |
|
"errors" |
|
"math" |
|
"time" |
|
|
|
"github.com/tsuna/gohbase/filter" |
|
"github.com/tsuna/gohbase/pb" |
|
) |
|
|
|
// baseQuery bundles common fields that can be provided for quering requests: Scans and Gets |
|
type baseQuery struct { |
|
families map[string][]string |
|
filter *pb.Filter |
|
fromTimestamp uint64 |
|
toTimestamp uint64 |
|
maxVersions uint32 |
|
storeLimit uint32 |
|
storeOffset uint32 |
|
} |
|
|
|
// newBaseQuery return baseQuery with all default values |
|
func newBaseQuery() baseQuery { |
|
return baseQuery{ |
|
storeLimit: DefaultMaxResultsPerColumnFamily, |
|
fromTimestamp: MinTimestamp, |
|
toTimestamp: MaxTimestamp, |
|
maxVersions: DefaultMaxVersions, |
|
} |
|
} |
|
|
|
func (bq *baseQuery) setFamilies(families map[string][]string) { |
|
bq.families = families |
|
} |
|
func (bq *baseQuery) setFilter(filter *pb.Filter) { |
|
bq.filter = filter |
|
} |
|
func (bq *baseQuery) setTimeRangeUint64(from, to uint64) { |
|
bq.fromTimestamp = from |
|
bq.toTimestamp = to |
|
} |
|
func (bq *baseQuery) setMaxVersions(versions uint32) { |
|
bq.maxVersions = versions |
|
} |
|
func (bq *baseQuery) setMaxResultsPerColumnFamily(maxresults uint32) { |
|
bq.storeLimit = maxresults |
|
} |
|
func (bq *baseQuery) setResultOffset(offset uint32) { |
|
bq.storeOffset = offset |
|
} |
|
|
|
// Families option adds families constraint to a Scan or Get request. |
|
func Families(f map[string][]string) func(Call) error { |
|
return func(hc Call) error { |
|
if c, ok := hc.(hasQueryOptions); ok { |
|
c.setFamilies(f) |
|
return nil |
|
} |
|
return errors.New("'Families' option can only be used with Get or Scan request") |
|
} |
|
} |
|
|
|
// Filters option adds filters constraint to a Scan or Get request. |
|
func Filters(f filter.Filter) func(Call) error { |
|
return func(hc Call) error { |
|
if c, ok := hc.(hasQueryOptions); ok { |
|
pbF, err := f.ConstructPBFilter() |
|
if err != nil { |
|
return err |
|
} |
|
c.setFilter(pbF) |
|
return nil |
|
} |
|
return errors.New("'Filters' option can only be used with Get or Scan request") |
|
} |
|
} |
|
|
|
// TimeRange is used as a parameter for request creation. Adds TimeRange constraint to a request. |
|
// It will get values in range [from, to[ ('to' is exclusive). |
|
func TimeRange(from, to time.Time) func(Call) error { |
|
return TimeRangeUint64(uint64(from.UnixNano()/1e6), uint64(to.UnixNano()/1e6)) |
|
} |
|
|
|
// TimeRangeUint64 is used as a parameter for request creation. |
|
// Adds TimeRange constraint to a request. |
|
// from and to should be in milliseconds |
|
// // It will get values in range [from, to[ ('to' is exclusive). |
|
func TimeRangeUint64(from, to uint64) func(Call) error { |
|
return func(hc Call) error { |
|
if c, ok := hc.(hasQueryOptions); ok { |
|
if from >= to { |
|
// or equal is becuase 'to' is exclusive |
|
return errors.New("'from' timestamp is greater or equal to 'to' timestamp") |
|
} |
|
c.setTimeRangeUint64(from, to) |
|
return nil |
|
} |
|
return errors.New("'TimeRange' option can only be used with Get or Scan request") |
|
} |
|
} |
|
|
|
// MaxVersions is used as a parameter for request creation. |
|
// Adds MaxVersions constraint to a request. |
|
func MaxVersions(versions uint32) func(Call) error { |
|
return func(hc Call) error { |
|
if c, ok := hc.(hasQueryOptions); ok { |
|
if versions > math.MaxInt32 { |
|
return errors.New("'MaxVersions' exceeds supported number of versions") |
|
} |
|
c.setMaxVersions(versions) |
|
return nil |
|
} |
|
return errors.New("'MaxVersions' option can only be used with Get or Scan request") |
|
} |
|
} |
|
|
|
// MaxResultsPerColumnFamily is an option for Get or Scan requests that sets the maximum |
|
// number of cells returned per column family in a row. |
|
func MaxResultsPerColumnFamily(maxresults uint32) func(Call) error { |
|
return func(hc Call) error { |
|
if c, ok := hc.(hasQueryOptions); ok { |
|
if maxresults > math.MaxInt32 { |
|
return errors.New( |
|
"'MaxResultsPerColumnFamily' exceeds supported number of value results") |
|
} |
|
c.setMaxResultsPerColumnFamily(maxresults) |
|
return nil |
|
} |
|
return errors.New( |
|
"'MaxResultsPerColumnFamily' option can only be used with Get or Scan request") |
|
} |
|
} |
|
|
|
// ResultOffset is a option for Scan or Get requests that sets the offset for cells |
|
// within a column family. |
|
func ResultOffset(offset uint32) func(Call) error { |
|
return func(hc Call) error { |
|
if c, ok := hc.(hasQueryOptions); ok { |
|
if offset > math.MaxInt32 { |
|
return errors.New("'ResultOffset' exceeds supported offset value") |
|
} |
|
c.setResultOffset(offset) |
|
return nil |
|
} |
|
return errors.New("'ResultOffset' option can only be used with Get or Scan request") |
|
} |
|
}
|
|
|