Merge pull request #447 from benbjohnson/inverse-opt-in

Opt-in to inverse storage.
This commit is contained in:
Ben Johnson 2017-04-13 10:04:25 -06:00 committed by GitHub
commit a302521968
8 changed files with 142 additions and 77 deletions

6
db.go
View file

@ -381,7 +381,11 @@ func (db *DB) createFrame(name string, opt FrameOptions) (*Frame, error) {
}
// Set options.
if err := f.SetRowLabel(opt.RowLabel); err != nil {
if opt.RowLabel != "" {
f.rowLabel = opt.RowLabel
}
f.inverseEnabled = opt.InverseEnabled
if err := f.saveMeta(); err != nil {
f.Close()
return nil, err
}

View file

@ -534,10 +534,13 @@ func (e *Executor) executeClearBit(ctx context.Context, db string, c *pql.Call,
} else if changed {
ret = true
}
if changed, err := e.executeClearBitView(ctx, db, c, f, ViewInverse, rowID, colID, opt); err != nil {
return ret, err
} else if changed {
ret = true
if f.InverseEnabled() {
if changed, err := e.executeClearBitView(ctx, db, c, f, ViewInverse, rowID, colID, opt); err != nil {
return ret, err
} else if changed {
ret = true
}
}
return ret, nil
default:
@ -631,10 +634,13 @@ func (e *Executor) executeSetBit(ctx context.Context, db string, c *pql.Call, op
} else if changed {
ret = true
}
if changed, err := e.executeSetBitView(ctx, db, c, f, ViewInverse, rowID, colID, timestamp, opt); err != nil {
return ret, err
} else if changed {
ret = true
if f.InverseEnabled() {
if changed, err := e.executeSetBitView(ctx, db, c, f, ViewInverse, rowID, colID, timestamp, opt); err != nil {
return ret, err
} else if changed {
ret = true
}
}
return ret, nil
default:

View file

@ -22,7 +22,8 @@ const (
// Default frame settings.
const (
DefaultRowLabel = "id"
DefaultRowLabel = "id"
DefaultInverseEnabled = false
)
// Frame represents a container for views.
@ -40,8 +41,9 @@ type Frame struct {
stats StatsClient
// Label used for referring to a row.
rowLabel string
// Frame settings.
inverseEnabled bool
rowLabel string
LogOutput io.Writer
}
@ -63,7 +65,8 @@ func NewFrame(path, db, name string) (*Frame, error) {
stats: NopStatsClient,
rowLabel: DefaultRowLabel,
inverseEnabled: DefaultInverseEnabled,
rowLabel: DefaultRowLabel,
LogOutput: ioutil.Discard,
}, nil
@ -139,11 +142,17 @@ func (f *Frame) RowLabel() string {
return v
}
// InverseEnabled returns true if an inverse view is available.
func (f *Frame) InverseEnabled() bool {
return f.inverseEnabled
}
// Options returns all options for this frame.
func (f *Frame) Options() FrameOptions {
f.mu.Lock()
opt := FrameOptions{
RowLabel: f.rowLabel,
InverseEnabled: f.inverseEnabled,
RowLabel: f.rowLabel,
}
f.mu.Unlock()
return opt
@ -221,6 +230,7 @@ func (f *Frame) loadMeta() error {
if os.IsNotExist(err) {
f.timeQuantum = ""
f.rowLabel = DefaultRowLabel
f.inverseEnabled = DefaultInverseEnabled
return nil
} else if err != nil {
return err
@ -233,6 +243,7 @@ func (f *Frame) loadMeta() error {
// Copy metadata fields.
f.timeQuantum = TimeQuantum(pb.TimeQuantum)
f.rowLabel = pb.RowLabel
f.inverseEnabled = pb.InverseEnabled
return nil
}
@ -241,8 +252,9 @@ func (f *Frame) loadMeta() error {
func (f *Frame) saveMeta() error {
// Marshal metadata.
buf, err := proto.Marshal(&internal.Frame{
TimeQuantum: string(f.timeQuantum),
RowLabel: f.rowLabel,
TimeQuantum: string(f.timeQuantum),
RowLabel: f.rowLabel,
InverseEnabled: f.inverseEnabled,
})
if err != nil {
return err
@ -330,6 +342,11 @@ func (f *Frame) Views() []*View {
}
func (f *Frame) CreateViewIfNotExists(name string) (*View, error) {
// Don't create inverse views if they are not enabled.
if !f.InverseEnabled() && IsInverseView(name) {
return nil, ErrFrameInverseDisabled
}
f.mu.Lock()
defer f.mu.Unlock()
@ -483,7 +500,7 @@ func (f *Frame) Import(bitmapIDs, profileIDs []uint64, timestamps []*time.Time)
// Import into each fragment.
for key, data := range dataByFragment {
// Re-sort data for inverse views.
if IsViewInverted(key.View) {
if IsInverseView(key.View) {
sort.Sort(importBitSet{
bitmapIDs: data.BitmapIDs,
profileIDs: data.ProfileIDs,
@ -528,7 +545,8 @@ func (p frameInfoSlice) Less(i, j int) bool { return p[i].Name < p[j].Name }
// FrameOptions represents options to set when initializing a frame.
type FrameOptions struct {
RowLabel string `json:"rowLabel,omitempty"`
RowLabel string `json:"rowLabel,omitempty"`
InverseEnabled bool `json:"inverseEnabled,omitempty"`
}
// importBitSet represents slices of row and column ids.

View file

@ -37,7 +37,7 @@ func TestHandler_Schema(t *testing.T) {
d0 := idx.MustCreateDBIfNotExists("d0", pilosa.DBOptions{})
d1 := idx.MustCreateDBIfNotExists("d1", pilosa.DBOptions{})
if f, err := d0.CreateFrameIfNotExists("f1", pilosa.FrameOptions{}); err != nil {
if f, err := d0.CreateFrameIfNotExists("f1", pilosa.FrameOptions{InverseEnabled: true}); err != nil {
t.Fatal(err)
} else if _, err := f.SetBit(pilosa.ViewStandard, 0, 0, nil); err != nil {
t.Fatal(err)
@ -93,7 +93,7 @@ func TestHandler_MaxSlices_Inverse(t *testing.T) {
idx := MustOpenIndex()
defer idx.Close()
f0, err := idx.MustCreateDBIfNotExists("d0", pilosa.DBOptions{}).CreateFrame("f0", pilosa.FrameOptions{})
f0, err := idx.MustCreateDBIfNotExists("d0", pilosa.DBOptions{}).CreateFrame("f0", pilosa.FrameOptions{InverseEnabled: true})
if err != nil {
t.Fatal(err)
}
@ -105,7 +105,7 @@ func TestHandler_MaxSlices_Inverse(t *testing.T) {
t.Fatal(err)
}
f1, err := idx.MustCreateDBIfNotExists("d1", pilosa.DBOptions{}).CreateFrame("f1", pilosa.FrameOptions{})
f1, err := idx.MustCreateDBIfNotExists("d1", pilosa.DBOptions{}).CreateFrame("f1", pilosa.FrameOptions{InverseEnabled: true})
if err != nil {
t.Fatal(err)
}

View file

@ -57,8 +57,9 @@ func (*DB) ProtoMessage() {}
func (*DB) Descriptor() ([]byte, []int) { return fileDescriptorInternal, []int{0} }
type Frame struct {
TimeQuantum string `protobuf:"bytes,1,opt,name=TimeQuantum,proto3" json:"TimeQuantum,omitempty"`
RowLabel string `protobuf:"bytes,2,opt,name=RowLabel,proto3" json:"RowLabel,omitempty"`
TimeQuantum string `protobuf:"bytes,1,opt,name=TimeQuantum,proto3" json:"TimeQuantum,omitempty"`
RowLabel string `protobuf:"bytes,2,opt,name=RowLabel,proto3" json:"RowLabel,omitempty"`
InverseEnabled bool `protobuf:"varint,3,opt,name=InverseEnabled,proto3" json:"InverseEnabled,omitempty"`
}
func (m *Frame) Reset() { *m = Frame{} }
@ -363,6 +364,16 @@ func (m *Frame) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintInternal(dAtA, i, uint64(len(m.RowLabel)))
i += copy(dAtA[i:], m.RowLabel)
}
if m.InverseEnabled {
dAtA[i] = 0x18
i++
if m.InverseEnabled {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i++
}
return i, nil
}
@ -1100,6 +1111,9 @@ func (m *Frame) Size() (n int) {
if l > 0 {
n += 1 + l + sovInternal(uint64(l))
}
if m.InverseEnabled {
n += 2
}
return n
}
@ -1604,6 +1618,26 @@ func (m *Frame) Unmarshal(dAtA []byte) error {
}
m.RowLabel = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field InverseEnabled", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowInternal
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
m.InverseEnabled = bool(v != 0)
default:
iNdEx = preIndex
skippy, err := skipInternal(dAtA[iNdEx:])
@ -3978,52 +4012,53 @@ var (
func init() { proto.RegisterFile("internal.proto", fileDescriptorInternal) }
var fileDescriptorInternal = []byte{
// 746 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xdd, 0x6a, 0x14, 0x4b,
0x10, 0x3e, 0xbd, 0x33, 0xb3, 0x3f, 0xb5, 0xc9, 0xb2, 0x69, 0x72, 0x0e, 0x43, 0x38, 0x2c, 0x43,
0x73, 0x0e, 0x0c, 0x82, 0x09, 0xc4, 0x1b, 0x11, 0x41, 0x9c, 0xdd, 0x0d, 0x59, 0x34, 0x21, 0xe9,
0xc4, 0xdc, 0x79, 0xd1, 0x89, 0x6d, 0x32, 0x64, 0x7e, 0xd6, 0x99, 0x1e, 0x93, 0xbd, 0xf4, 0xc2,
0x77, 0x10, 0x7d, 0x02, 0x7d, 0x12, 0x2f, 0x7d, 0x04, 0x89, 0x2f, 0x22, 0xfd, 0x33, 0x3f, 0x51,
0x8c, 0xf1, 0x6e, 0xea, 0xab, 0xae, 0xea, 0xfa, 0xea, 0xab, 0xea, 0x81, 0x41, 0x98, 0x08, 0x9e,
0x25, 0x2c, 0x5a, 0x9f, 0x67, 0xa9, 0x48, 0x71, 0xb7, 0xb4, 0xc9, 0x36, 0xb4, 0x26, 0x01, 0xf6,
0xa0, 0x7f, 0x18, 0xc6, 0x7c, 0xbf, 0x60, 0x89, 0x28, 0x62, 0x17, 0x79, 0xc8, 0xef, 0xd1, 0x26,
0x24, 0x4f, 0x8c, 0xd3, 0xa8, 0x88, 0x93, 0xa7, 0xec, 0x98, 0x47, 0x6e, 0x4b, 0x9f, 0x68, 0x40,
0x64, 0x0a, 0xce, 0x56, 0xc6, 0x62, 0x7e, 0x8b, 0x64, 0x6b, 0xd0, 0xa5, 0xe9, 0x45, 0x33, 0x53,
0x65, 0x93, 0x00, 0xda, 0x41, 0x28, 0x62, 0x36, 0xc7, 0x18, 0xec, 0x20, 0x14, 0xb9, 0x8b, 0x3c,
0xcb, 0xb7, 0xa9, 0xfa, 0xc6, 0xff, 0x81, 0xf3, 0x58, 0x88, 0x2c, 0x77, 0x5b, 0x9e, 0xe5, 0xf7,
0x37, 0x07, 0xeb, 0x15, 0x31, 0x09, 0x53, 0xed, 0x24, 0xeb, 0x60, 0xef, 0xb1, 0x30, 0xc3, 0x43,
0xb0, 0x9e, 0xf0, 0x85, 0xaa, 0xc0, 0xa6, 0xf2, 0x13, 0xaf, 0x82, 0x33, 0x4e, 0x8b, 0x44, 0xa8,
0x6b, 0x6d, 0xaa, 0x0d, 0xf2, 0x1c, 0xac, 0x20, 0x14, 0xb2, 0x2c, 0x7d, 0xf5, 0x6c, 0x62, 0x62,
0x2a, 0x1b, 0xff, 0x0b, 0xbd, 0xbd, 0x2c, 0x7d, 0x19, 0x46, 0x7c, 0x36, 0x31, 0xc1, 0x35, 0x20,
0xbd, 0x92, 0x5f, 0x2e, 0x58, 0x3c, 0x77, 0x2d, 0x0f, 0xf9, 0x16, 0xad, 0x01, 0xf2, 0x08, 0x3a,
0xe6, 0x28, 0x1e, 0x40, 0xab, 0x4a, 0xde, 0x9a, 0x4d, 0x6e, 0xc9, 0xe7, 0x13, 0x02, 0x5b, 0x7e,
0x35, 0x09, 0xf5, 0x34, 0x21, 0x0c, 0xf6, 0xe1, 0x62, 0xce, 0x4d, 0x49, 0xea, 0x5b, 0x0a, 0x70,
0x20, 0xb2, 0x30, 0x39, 0x3d, 0x62, 0x51, 0xc1, 0x55, 0x3d, 0x3d, 0xda, 0x84, 0x64, 0xbd, 0xcf,
0xc2, 0x44, 0x68, 0xbf, 0xad, 0xd9, 0x54, 0x80, 0xf4, 0x06, 0x69, 0x1a, 0x69, 0xaf, 0xe3, 0x21,
0xbf, 0x4b, 0x6b, 0x00, 0x8f, 0x00, 0xb6, 0xa2, 0x94, 0x99, 0xe0, 0xb6, 0x87, 0x7c, 0x44, 0x1b,
0x08, 0xd9, 0x80, 0x8e, 0xac, 0x75, 0x87, 0xcd, 0x6b, 0x76, 0xe8, 0x26, 0x76, 0xef, 0x11, 0x2c,
0xed, 0x17, 0x3c, 0x5b, 0x50, 0xfe, 0xaa, 0xe0, 0xb9, 0x90, 0x4d, 0x9a, 0x04, 0x86, 0xa4, 0x9c,
0xce, 0x55, 0x70, 0x94, 0xdf, 0xcc, 0x8a, 0x36, 0xf0, 0x3f, 0xd0, 0x3e, 0x88, 0xc2, 0x13, 0x9e,
0xbb, 0x96, 0x1a, 0x10, 0x63, 0x49, 0x15, 0x4d, 0xb7, 0x73, 0x45, 0xad, 0x4b, 0x2b, 0x1b, 0xbb,
0xd0, 0x29, 0xc7, 0xd2, 0x51, 0xb9, 0x4a, 0x53, 0x66, 0xa3, 0x3c, 0x4e, 0x85, 0x66, 0xd4, 0xa5,
0xc6, 0x22, 0x6f, 0x10, 0x2c, 0x9b, 0xe2, 0xf2, 0x79, 0x9a, 0xe4, 0x5c, 0x6a, 0x30, 0xcd, 0xb2,
0x52, 0x83, 0x69, 0x96, 0xe1, 0x0d, 0xe8, 0x50, 0x9e, 0x17, 0x91, 0x28, 0x65, 0xfc, 0xbb, 0x26,
0x5a, 0xc6, 0x16, 0x91, 0xa0, 0xe5, 0x29, 0x7c, 0xb7, 0x51, 0xa2, 0xa5, 0x22, 0x56, 0xea, 0x08,
0xe3, 0xa9, 0xab, 0x26, 0x6f, 0x11, 0xf4, 0x1b, 0x79, 0xb0, 0x5f, 0xae, 0x88, 0x2a, 0xa2, 0xbf,
0x39, 0xac, 0x83, 0x35, 0x4e, 0xcb, 0x15, 0x5a, 0x02, 0xb4, 0x6b, 0x46, 0x03, 0xed, 0x4a, 0x39,
0xe4, 0x5a, 0x94, 0x77, 0x36, 0xe4, 0x90, 0x30, 0xd5, 0x4e, 0xd9, 0xa3, 0xf1, 0x19, 0x4b, 0x4e,
0xf9, 0x0b, 0xd3, 0xbe, 0xd2, 0x24, 0x1f, 0x11, 0x2c, 0xcf, 0xe2, 0x79, 0x9a, 0x89, 0x1b, 0x94,
0x52, 0x6f, 0x40, 0xa9, 0x94, 0x7e, 0x10, 0x56, 0xc1, 0x51, 0xda, 0xa8, 0x49, 0xb4, 0xa9, 0x36,
0xd4, 0x94, 0x99, 0xed, 0x92, 0x42, 0x49, 0x09, 0x6b, 0x40, 0x4e, 0x59, 0xb5, 0x5e, 0xb9, 0xeb,
0x28, 0x77, 0x03, 0x91, 0xfe, 0x6a, 0xc1, 0x72, 0xb7, 0xed, 0x59, 0xbe, 0x45, 0x1b, 0x08, 0x21,
0x30, 0x28, 0x4b, 0xfd, 0x95, 0x6e, 0xe4, 0x12, 0x86, 0x41, 0x94, 0x9e, 0x9c, 0x4f, 0x98, 0x60,
0x7f, 0xcc, 0x48, 0x45, 0x96, 0x8c, 0x94, 0x51, 0xf3, 0xb4, 0x9b, 0x3c, 0x31, 0xd8, 0x47, 0x21,
0xbf, 0x30, 0x03, 0xa7, 0xbe, 0xc9, 0x3e, 0xac, 0x34, 0x6e, 0x36, 0x05, 0x5e, 0x6b, 0x08, 0xba,
0xb9, 0x21, 0xad, 0x1f, 0x1b, 0x42, 0xfe, 0x07, 0x67, 0xcc, 0x4e, 0xce, 0x7e, 0x93, 0x86, 0x7c,
0x40, 0xb0, 0xb2, 0xc3, 0x2e, 0xf5, 0xae, 0x54, 0x57, 0x6f, 0x43, 0xaf, 0x02, 0xcd, 0xb2, 0xde,
0xa9, 0xa7, 0xe3, 0xa7, 0xf3, 0x35, 0x32, 0x4d, 0x44, 0xb6, 0xa0, 0x75, 0xf0, 0xda, 0x43, 0x18,
0x5c, 0x77, 0xca, 0xbe, 0x9f, 0xd7, 0x6f, 0xd6, 0xb9, 0x7e, 0x84, 0x5f, 0xab, 0xc7, 0xc3, 0x3c,
0xc2, 0xca, 0x78, 0xd0, 0xba, 0x8f, 0x82, 0xe1, 0xe7, 0xab, 0x11, 0xfa, 0x72, 0x35, 0x42, 0x5f,
0xaf, 0x46, 0xe8, 0xdd, 0xb7, 0xd1, 0x5f, 0xc7, 0x6d, 0xf5, 0xc3, 0xba, 0xf7, 0x3d, 0x00, 0x00,
0xff, 0xff, 0x1c, 0xb1, 0xe1, 0x29, 0xc2, 0x06, 0x00, 0x00,
// 766 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xcd, 0x4e, 0x1c, 0x47,
0x10, 0x4e, 0xef, 0xcc, 0xec, 0x4f, 0x2d, 0xac, 0x96, 0x16, 0x89, 0x46, 0x28, 0x5a, 0xad, 0x5a,
0x49, 0xb4, 0x8a, 0x14, 0x90, 0xc8, 0x25, 0x8a, 0x22, 0x45, 0x9e, 0xdd, 0x45, 0xac, 0x6c, 0x10,
0x34, 0x98, 0x9b, 0x0f, 0x0d, 0xb4, 0x61, 0xc4, 0xfc, 0xac, 0x7b, 0x7a, 0x80, 0x3d, 0xfa, 0xe0,
0x77, 0xb0, 0xec, 0x27, 0xb0, 0x9f, 0xc4, 0x47, 0x3f, 0x82, 0x85, 0x5f, 0xc4, 0xea, 0x9f, 0xf9,
0x01, 0xcb, 0x18, 0xdf, 0xba, 0xbe, 0xea, 0xaa, 0xa9, 0xaf, 0xbe, 0xaa, 0x1e, 0xe8, 0x85, 0x89,
0xe4, 0x22, 0x61, 0xd1, 0xfa, 0x5c, 0xa4, 0x32, 0xc5, 0xed, 0xc2, 0x26, 0xdb, 0xd0, 0x98, 0x04,
0x78, 0x08, 0xdd, 0xc3, 0x30, 0xe6, 0xfb, 0x39, 0x4b, 0x64, 0x1e, 0xfb, 0x68, 0x88, 0x46, 0x1d,
0x5a, 0x87, 0xd4, 0x8d, 0x71, 0x1a, 0xe5, 0x71, 0xf2, 0x84, 0x1d, 0xf3, 0xc8, 0x6f, 0x98, 0x1b,
0x35, 0x88, 0xc4, 0xe0, 0x6d, 0x09, 0x16, 0xf3, 0x07, 0x24, 0x5b, 0x83, 0x36, 0x4d, 0xaf, 0xea,
0x99, 0x4a, 0x1b, 0xff, 0x01, 0xbd, 0x59, 0x72, 0xc9, 0x45, 0xc6, 0xa7, 0x09, 0x3b, 0x8e, 0xf8,
0xa9, 0xef, 0x0c, 0xd1, 0xa8, 0x4d, 0xef, 0xa0, 0x24, 0x80, 0x66, 0x10, 0xca, 0x98, 0xcd, 0x31,
0x06, 0x37, 0x08, 0x65, 0xe6, 0xa3, 0xa1, 0x33, 0x72, 0xa9, 0x3e, 0xe3, 0xdf, 0xc0, 0x7b, 0x24,
0xa5, 0xc8, 0xfc, 0xc6, 0xd0, 0x19, 0x75, 0x37, 0x7b, 0xeb, 0x65, 0x03, 0x14, 0x4c, 0x8d, 0x93,
0xac, 0x83, 0xbb, 0xc7, 0x42, 0x81, 0xfb, 0xe0, 0x3c, 0xe6, 0x0b, 0x5d, 0xa9, 0x4b, 0xd5, 0x11,
0xaf, 0x82, 0x37, 0x4e, 0xf3, 0x44, 0xea, 0xf2, 0x5c, 0x6a, 0x0c, 0xf2, 0x0c, 0x9c, 0x20, 0x94,
0xaa, 0x7c, 0xf3, 0xe9, 0xd9, 0xc4, 0xc6, 0x94, 0x36, 0xfe, 0x15, 0x3a, 0x7b, 0x22, 0x7d, 0x1e,
0x46, 0x7c, 0x36, 0xb1, 0xc1, 0x15, 0xa0, 0xbc, 0xaa, 0x0f, 0x99, 0x64, 0xf1, 0x5c, 0xf3, 0x72,
0x68, 0x05, 0x90, 0xff, 0xa1, 0x65, 0xaf, 0xe2, 0x1e, 0x34, 0xca, 0xe4, 0x8d, 0xd9, 0xe4, 0x81,
0x7c, 0xde, 0x23, 0x70, 0xd5, 0xa9, 0x4e, 0xa8, 0x63, 0x08, 0x61, 0x70, 0x0f, 0x17, 0x73, 0x6e,
0x4b, 0xd2, 0x67, 0x25, 0xd4, 0x81, 0x14, 0x61, 0x72, 0x76, 0xc4, 0xa2, 0x9c, 0xeb, 0x7a, 0x3a,
0xb4, 0x0e, 0xa9, 0x7a, 0x9f, 0x86, 0x89, 0x34, 0x7e, 0xd7, 0xb0, 0x29, 0x01, 0xe5, 0x0d, 0xd2,
0x34, 0x32, 0x5e, 0x4f, 0xab, 0x54, 0x01, 0x78, 0x00, 0xb0, 0x15, 0xa5, 0xcc, 0x06, 0x37, 0x87,
0x68, 0x84, 0x68, 0x0d, 0x21, 0x1b, 0xd0, 0x52, 0xb5, 0xee, 0xb0, 0x79, 0xc5, 0x0e, 0xdd, 0xc7,
0xee, 0x0d, 0x82, 0xa5, 0xfd, 0x9c, 0x8b, 0x05, 0xe5, 0x2f, 0x72, 0x9e, 0x49, 0xd5, 0xa4, 0x49,
0x60, 0x49, 0xaa, 0x29, 0x5e, 0x05, 0x4f, 0xfb, 0xed, 0x4c, 0x19, 0x03, 0xff, 0x02, 0xcd, 0x83,
0x28, 0x3c, 0xe1, 0x99, 0xef, 0xe8, 0x01, 0xb1, 0x96, 0x52, 0xd1, 0x76, 0x3b, 0xd3, 0xd4, 0xda,
0xb4, 0xb4, 0xb1, 0x0f, 0xad, 0x62, 0x7c, 0x3d, 0x9d, 0xab, 0x30, 0x55, 0x36, 0xca, 0xe3, 0x54,
0x1a, 0x46, 0x6d, 0x6a, 0x2d, 0xf2, 0x12, 0xc1, 0xb2, 0x2d, 0x2e, 0x9b, 0xa7, 0x49, 0xc6, 0x95,
0x06, 0x53, 0x21, 0x0a, 0x0d, 0xa6, 0x42, 0xe0, 0x0d, 0x68, 0x51, 0x9e, 0xe5, 0x91, 0x2c, 0x64,
0xfc, 0xb9, 0x22, 0x5a, 0xc4, 0xe6, 0x91, 0xa4, 0xc5, 0x2d, 0xfc, 0x57, 0xad, 0x44, 0x47, 0x47,
0xac, 0x54, 0x11, 0xd6, 0x53, 0x55, 0x4d, 0x5e, 0x21, 0xe8, 0xd6, 0xf2, 0xe0, 0x51, 0xb1, 0x22,
0xba, 0x88, 0xee, 0x66, 0xbf, 0x0a, 0x36, 0x38, 0x2d, 0x56, 0x68, 0x09, 0xd0, 0xae, 0x1d, 0x0d,
0xb4, 0xab, 0xe4, 0x50, 0x6b, 0x51, 0x7c, 0xb3, 0x26, 0x87, 0x82, 0xa9, 0x71, 0xaa, 0x1e, 0x8d,
0xcf, 0x59, 0x72, 0xc6, 0x4f, 0x6d, 0xfb, 0x0a, 0x93, 0xbc, 0x43, 0xb0, 0x3c, 0x8b, 0xe7, 0xa9,
0x90, 0xf7, 0x28, 0xa5, 0xdf, 0x8a, 0x42, 0x29, 0xf3, 0x70, 0xac, 0x82, 0xa7, 0xb5, 0xd1, 0x93,
0xe8, 0x52, 0x63, 0xe8, 0x29, 0xb3, 0xdb, 0xa5, 0x84, 0x52, 0x12, 0x56, 0x80, 0x9a, 0xb2, 0x72,
0xbd, 0x32, 0xdf, 0xd3, 0xee, 0x1a, 0xa2, 0xfc, 0xe5, 0x82, 0x65, 0x7e, 0x73, 0xe8, 0x8c, 0x1c,
0x5a, 0x43, 0x08, 0x81, 0x5e, 0x51, 0xea, 0xb7, 0x74, 0x23, 0xd7, 0xd0, 0x0f, 0xa2, 0xf4, 0xe4,
0x62, 0xc2, 0x24, 0xfb, 0x61, 0x46, 0x3a, 0xb2, 0x60, 0xa4, 0x8d, 0x8a, 0xa7, 0x5b, 0xe7, 0x89,
0xc1, 0x3d, 0x0a, 0xf9, 0x95, 0x1d, 0x38, 0x7d, 0x26, 0xfb, 0xb0, 0x52, 0xfb, 0xb2, 0x2d, 0xf0,
0x56, 0x43, 0xd0, 0xfd, 0x0d, 0x69, 0xdc, 0x6d, 0x08, 0xf9, 0x1d, 0xbc, 0x31, 0x3b, 0x39, 0xff,
0x4e, 0x1a, 0xf2, 0x16, 0xc1, 0xca, 0x0e, 0xbb, 0x36, 0xbb, 0x52, 0x7e, 0x7a, 0x1b, 0x3a, 0x25,
0x68, 0x97, 0xf5, 0xcf, 0x6a, 0x3a, 0xbe, 0xba, 0x5f, 0x21, 0xd3, 0x44, 0x8a, 0x05, 0xad, 0x82,
0xd7, 0xfe, 0x83, 0xde, 0x6d, 0xa7, 0xea, 0xfb, 0x45, 0xf5, 0x66, 0x5d, 0x98, 0x47, 0xf8, 0x52,
0x3f, 0x1e, 0xf6, 0x11, 0xd6, 0xc6, 0xbf, 0x8d, 0x7f, 0x50, 0xd0, 0xff, 0x70, 0x33, 0x40, 0x1f,
0x6f, 0x06, 0xe8, 0xd3, 0xcd, 0x00, 0xbd, 0xfe, 0x3c, 0xf8, 0xe9, 0xb8, 0xa9, 0x7f, 0x6c, 0x7f,
0x7f, 0x09, 0x00, 0x00, 0xff, 0xff, 0xba, 0xb0, 0xaa, 0x97, 0xea, 0x06, 0x00, 0x00,
}

View file

@ -10,6 +10,7 @@ message DB {
message Frame {
string TimeQuantum = 1;
string RowLabel = 2;
bool InverseEnabled = 3;
}
message Bitmap {

View file

@ -16,11 +16,12 @@ var (
ErrDatabaseNotFound = errors.New("database not found")
// ErrFrameRequired is returned when no frame is specified.
ErrFrameRequired = errors.New("frame required")
ErrFrameExists = errors.New("frame already exists")
ErrFrameNotFound = errors.New("frame not found")
ErrFrameRequired = errors.New("frame required")
ErrFrameExists = errors.New("frame already exists")
ErrFrameNotFound = errors.New("frame not found")
ErrFrameInverseDisabled = errors.New("frame inverse disabled")
ErrInvalidView = errors.New("invalid veiw")
ErrInvalidView = errors.New("invalid view")
ErrName = errors.New("invalid database or frame's name, must match [a-z0-9_-]")

View file

@ -237,8 +237,8 @@ func (v *View) ClearBit(bitmapID, profileID uint64) (changed bool, err error) {
return frag.ClearBit(bitmapID, profileID)
}
// IsViewInverted returns true if the view is used for storing an inverted representation.
func IsViewInverted(name string) bool {
// IsInverseView returns true if the view is used for storing an inverted representation.
func IsInverseView(name string) bool {
return strings.HasPrefix(name, ViewInverse)
}