Merge pull request #5995 from influxdata/jl-type-switch

Change type-switch a few places to reduce allocations.
pull/5985/merge
joelegasse 2016-03-11 17:49:56 -05:00
commit 3d544a9136
5 changed files with 68 additions and 64 deletions

View File

@ -85,14 +85,14 @@ func (a Values) Encode(buf []byte) ([]byte, error) {
panic("unable to encode block type")
}
switch a[0].Value().(type) {
case float64:
switch a[0].(type) {
case *FloatValue:
return encodeFloatBlock(buf, a)
case int64:
case *IntegerValue:
return encodeIntegerBlock(buf, a)
case bool:
case *BooleanValue:
return encodeBooleanBlock(buf, a)
case string:
case *StringValue:
return encodeStringBlock(buf, a)
}
@ -105,14 +105,14 @@ func (a Values) InfluxQLType() (influxql.DataType, error) {
return influxql.Unknown, fmt.Errorf("no values to infer type")
}
switch a[0].Value().(type) {
case float64:
switch a[0].(type) {
case *FloatValue:
return influxql.Float, nil
case int64:
case *IntegerValue:
return influxql.Integer, nil
case bool:
case *BooleanValue:
return influxql.Boolean, nil
case string:
case *StringValue:
return influxql.String, nil
}
@ -237,7 +237,7 @@ func (f *FloatValue) Size() int {
}
func (f *FloatValue) String() string {
return fmt.Sprintf("%v %v", time.Unix(0, f.unixnano), f.Value())
return fmt.Sprintf("%v %v", time.Unix(0, f.unixnano), f.value)
}
func encodeFloatBlock(buf []byte, values []Value) ([]byte, error) {
@ -257,7 +257,7 @@ func encodeFloatBlock(buf []byte, values []Value) ([]byte, error) {
for _, v := range values {
tsenc.Write(time.Unix(0, v.UnixNano()))
venc.Push(v.Value().(float64))
venc.Push(v.(*FloatValue).value)
}
venc.Finish()
@ -384,7 +384,7 @@ func encodeBooleanBlock(buf []byte, values []Value) ([]byte, error) {
for _, v := range values {
tsenc.Write(time.Unix(0, v.UnixNano()))
venc.Write(v.Value().(bool))
venc.Write(v.(*BooleanValue).value)
}
// Encoded timestamp values
@ -496,7 +496,7 @@ func encodeIntegerBlock(buf []byte, values []Value) ([]byte, error) {
vEnc := NewIntegerEncoder()
for _, v := range values {
tsEnc.Write(time.Unix(0, v.UnixNano()))
vEnc.Write(v.Value().(int64))
vEnc.Write(v.(*IntegerValue).value)
}
// Encoded timestamp values
@ -607,7 +607,7 @@ func encodeStringBlock(buf []byte, values []Value) ([]byte, error) {
vEnc := NewStringEncoder()
for _, v := range values {
tsEnc.Write(time.Unix(0, v.UnixNano()))
vEnc.Write(v.Value().(string))
vEnc.Write(v.(*StringValue).value)
}
// Encoded timestamp values

View File

@ -236,7 +236,7 @@ func (c *floatAscendingCursor) peekCache() (t int64, v float64) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(float64)
return item.UnixNano(), item.(*FloatValue).value
}
// peekTSM returns the current time/value from tsm.
@ -246,7 +246,7 @@ func (c *floatAscendingCursor) peekTSM() (t int64, v float64) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(float64)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -346,7 +346,7 @@ func (c *floatDescendingCursor) peekCache() (t int64, v float64) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(float64)
return item.UnixNano(), item.(*FloatValue).value
}
// peekTSM returns the current time/value from tsm.
@ -356,7 +356,7 @@ func (c *floatDescendingCursor) peekTSM() (t int64, v float64) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(float64)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -568,7 +568,7 @@ func (c *integerAscendingCursor) peekCache() (t int64, v int64) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(int64)
return item.UnixNano(), item.(*IntegerValue).value
}
// peekTSM returns the current time/value from tsm.
@ -578,7 +578,7 @@ func (c *integerAscendingCursor) peekTSM() (t int64, v int64) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(int64)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -678,7 +678,7 @@ func (c *integerDescendingCursor) peekCache() (t int64, v int64) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(int64)
return item.UnixNano(), item.(*IntegerValue).value
}
// peekTSM returns the current time/value from tsm.
@ -688,7 +688,7 @@ func (c *integerDescendingCursor) peekTSM() (t int64, v int64) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(int64)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -900,7 +900,7 @@ func (c *stringAscendingCursor) peekCache() (t int64, v string) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(string)
return item.UnixNano(), item.(*StringValue).value
}
// peekTSM returns the current time/value from tsm.
@ -910,7 +910,7 @@ func (c *stringAscendingCursor) peekTSM() (t int64, v string) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(string)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -1010,7 +1010,7 @@ func (c *stringDescendingCursor) peekCache() (t int64, v string) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(string)
return item.UnixNano(), item.(*StringValue).value
}
// peekTSM returns the current time/value from tsm.
@ -1020,7 +1020,7 @@ func (c *stringDescendingCursor) peekTSM() (t int64, v string) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(string)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -1232,7 +1232,7 @@ func (c *booleanAscendingCursor) peekCache() (t int64, v bool) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(bool)
return item.UnixNano(), item.(*BooleanValue).value
}
// peekTSM returns the current time/value from tsm.
@ -1242,7 +1242,7 @@ func (c *booleanAscendingCursor) peekTSM() (t int64, v bool) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(bool)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -1342,7 +1342,7 @@ func (c *booleanDescendingCursor) peekCache() (t int64, v bool) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().(bool)
return item.UnixNano(), item.(*BooleanValue).value
}
// peekTSM returns the current time/value from tsm.
@ -1352,7 +1352,7 @@ func (c *booleanDescendingCursor) peekTSM() (t int64, v bool) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().(bool)
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.

View File

@ -232,7 +232,7 @@ func (c *{{.name}}AscendingCursor) peekCache() (t int64, v {{.Type}}) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().({{.Type}})
return item.UnixNano(), item.({{.ValueType}}).value
}
// peekTSM returns the current time/value from tsm.
@ -242,7 +242,7 @@ func (c *{{.name}}AscendingCursor) peekTSM() (t int64, v {{.Type}}) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().({{.Type}})
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.
@ -342,7 +342,7 @@ func (c *{{.name}}DescendingCursor) peekCache() (t int64, v {{.Type}}) {
}
item := c.cache.values[c.cache.pos]
return item.UnixNano(), item.Value().({{.Type}})
return item.UnixNano(), item.({{.ValueType}}).value
}
// peekTSM returns the current time/value from tsm.
@ -352,7 +352,7 @@ func (c *{{.name}}DescendingCursor) peekTSM() (t int64, v {{.Type}}) {
}
item := c.tsm.values[c.tsm.pos]
return item.UnixNano(), item.Value().({{.Type}})
return item.UnixNano(), item.value
}
// next returns the next key/value for the cursor.

View File

@ -3,24 +3,28 @@
"Name":"Float",
"name":"float",
"Type":"float64",
"ValueType":"*FloatValue",
"Nil":"0"
},
{
"Name":"Integer",
"name":"integer",
"Type":"int64",
"ValueType":"*IntegerValue",
"Nil":"0"
},
{
"Name":"String",
"name":"string",
"Type":"string",
"ValueType":"*StringValue",
"Nil":"\"\""
},
{
"Name":"Boolean",
"name":"boolean",
"Type":"bool",
"ValueType":"*BooleanValue",
"Nil":"false"
}
]

View File

@ -446,21 +446,21 @@ func (w *WriteWALEntry) Encode(dst []byte) ([]byte, error) {
encLen += 8 * len(v) // timestamps (8)
switch v[0].Value().(type) {
case float64, int64:
switch v[0].(type) {
case *FloatValue, *IntegerValue:
encLen += 8 * len(v)
case bool:
case *BooleanValue:
encLen += 1 * len(v)
case string:
case *StringValue:
for _, vv := range v {
str, ok := vv.Value().(string)
str, ok := vv.(*StringValue)
if !ok {
return nil, fmt.Errorf("non-string found in string value slice: %T", vv.Value())
return nil, fmt.Errorf("non-string found in string value slice: %T", vv)
}
encLen += 4 + len(str)
encLen += 4 + len(str.value)
}
default:
return nil, fmt.Errorf("unsupported value type: %T", v[0].Value())
return nil, fmt.Errorf("unsupported value type: %T", v[0])
}
}
@ -476,17 +476,17 @@ func (w *WriteWALEntry) Encode(dst []byte) ([]byte, error) {
var curType byte
for k, v := range w.Values {
switch v[0].Value().(type) {
case float64:
switch v[0].(type) {
case *FloatValue:
curType = float64EntryType
case int64:
case *IntegerValue:
curType = integerEntryType
case bool:
case *BooleanValue:
curType = booleanEntryType
case string:
case *StringValue:
curType = stringEntryType
default:
return nil, fmt.Errorf("unsupported value type: %T", v[0].Value())
return nil, fmt.Errorf("unsupported value type: %T", v[0])
}
dst[n] = curType
n++
@ -502,38 +502,38 @@ func (w *WriteWALEntry) Encode(dst []byte) ([]byte, error) {
binary.BigEndian.PutUint64(dst[n:n+8], uint64(vv.UnixNano()))
n += 8
switch t := vv.Value().(type) {
case float64:
switch vv := vv.(type) {
case *FloatValue:
if curType != float64EntryType {
return nil, fmt.Errorf("incorrect value found in float64 slice: %T", t)
return nil, fmt.Errorf("incorrect value found in %T slice: %T", v[0].Value(), vv)
}
binary.BigEndian.PutUint64(dst[n:n+8], math.Float64bits(t))
binary.BigEndian.PutUint64(dst[n:n+8], math.Float64bits(vv.value))
n += 8
case int64:
case *IntegerValue:
if curType != integerEntryType {
return nil, fmt.Errorf("incorrect value found in int64 slice: %T", t)
return nil, fmt.Errorf("incorrect value found in %T slice: %T", v[0].Value(), vv)
}
binary.BigEndian.PutUint64(dst[n:n+8], uint64(t))
binary.BigEndian.PutUint64(dst[n:n+8], uint64(vv.value))
n += 8
case bool:
case *BooleanValue:
if curType != booleanEntryType {
return nil, fmt.Errorf("incorrect value found in bool slice: %T", t)
return nil, fmt.Errorf("incorrect value found in %T slice: %T", v[0].Value(), vv)
}
if t {
if vv.value {
dst[n] = 1
} else {
dst[n] = 0
}
n++
case string:
case *StringValue:
if curType != stringEntryType {
return nil, fmt.Errorf("incorrect value found in string slice: %T", t)
return nil, fmt.Errorf("incorrect value found in %T slice: %T", v[0].Value(), vv)
}
binary.BigEndian.PutUint32(dst[n:n+4], uint32(len(t)))
binary.BigEndian.PutUint32(dst[n:n+4], uint32(len(vv.value)))
n += 4
n += copy(dst[n:], t)
n += copy(dst[n:], vv.value)
default:
return nil, fmt.Errorf("unsupported value found in value slice: %T", t)
return nil, fmt.Errorf("unsupported value found in %T slice: %T", v[0].Value(), vv)
}
}
}