61 lines
1.6 KiB
Go
61 lines
1.6 KiB
Go
package tsdb
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"strings"
|
|
|
|
"github.com/influxdata/influxdb/cmd/influx_tsm/tsdb/internal"
|
|
"github.com/influxdata/influxdb/influxql"
|
|
|
|
"github.com/gogo/protobuf/proto"
|
|
)
|
|
|
|
// Field represents an encoded field.
|
|
type Field struct {
|
|
ID uint8 `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
Type influxql.DataType `json:"type,omitempty"`
|
|
}
|
|
|
|
// MeasurementFields is a mapping from measurements to its fields.
|
|
type MeasurementFields struct {
|
|
Fields map[string]*Field `json:"fields"`
|
|
Codec *FieldCodec
|
|
}
|
|
|
|
// UnmarshalBinary decodes the object from a binary format.
|
|
func (m *MeasurementFields) UnmarshalBinary(buf []byte) error {
|
|
var pb internal.MeasurementFields
|
|
if err := proto.Unmarshal(buf, &pb); err != nil {
|
|
return err
|
|
}
|
|
m.Fields = make(map[string]*Field)
|
|
for _, f := range pb.Fields {
|
|
m.Fields[f.GetName()] = &Field{ID: uint8(f.GetID()), Name: f.GetName(), Type: influxql.DataType(f.GetType())}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Series represents a series in the shard.
|
|
type Series struct {
|
|
Key string
|
|
Tags map[string]string
|
|
}
|
|
|
|
// MeasurementFromSeriesKey returns the Measurement name for a given series.
|
|
func MeasurementFromSeriesKey(key string) string {
|
|
return strings.SplitN(key, ",", 2)[0]
|
|
}
|
|
|
|
// DecodeKeyValue decodes the key and value from bytes.
|
|
func DecodeKeyValue(field string, dec *FieldCodec, k, v []byte) (int64, interface{}) {
|
|
// Convert key to a timestamp.
|
|
key := int64(binary.BigEndian.Uint64(k[0:8]))
|
|
|
|
decValue, err := dec.DecodeByName(field, v)
|
|
if err != nil {
|
|
return key, nil
|
|
}
|
|
return key, decValue
|
|
}
|