mirror of https://github.com/grafana/grafana.git
				
				
				
			Dependency: sdk's dataframe package renamed to data (#22700)
* use sdk 0.24.0
This commit is contained in:
		
							parent
							
								
									2c6993f18a
								
							
						
					
					
						commit
						73c4bef70f
					
				
							
								
								
									
										2
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										2
									
								
								go.mod
								
								
								
								
							| 
						 | 
					@ -32,7 +32,7 @@ require (
 | 
				
			||||||
	github.com/gorilla/websocket v1.4.1
 | 
						github.com/gorilla/websocket v1.4.1
 | 
				
			||||||
	github.com/gosimple/slug v1.4.2
 | 
						github.com/gosimple/slug v1.4.2
 | 
				
			||||||
	github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4
 | 
						github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4
 | 
				
			||||||
	github.com/grafana/grafana-plugin-sdk-go v0.21.0
 | 
						github.com/grafana/grafana-plugin-sdk-go v0.24.0
 | 
				
			||||||
	github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd
 | 
						github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd
 | 
				
			||||||
	github.com/hashicorp/go-plugin v1.0.1
 | 
						github.com/hashicorp/go-plugin v1.0.1
 | 
				
			||||||
	github.com/hashicorp/go-version v1.1.0
 | 
						github.com/hashicorp/go-version v1.1.0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										4
									
								
								go.sum
								
								
								
								
							| 
						 | 
					@ -135,6 +135,10 @@ github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4 h1:SP
 | 
				
			||||||
github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4/go.mod h1:nc0XxBzjeGcrMltCDw269LoWF9S8ibhgxolCdA1R8To=
 | 
					github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4/go.mod h1:nc0XxBzjeGcrMltCDw269LoWF9S8ibhgxolCdA1R8To=
 | 
				
			||||||
github.com/grafana/grafana-plugin-sdk-go v0.21.0 h1:5en5MdVFgeD9tuHDuJgwHYdIVjPs0PN0a7ZQ2bZNxNk=
 | 
					github.com/grafana/grafana-plugin-sdk-go v0.21.0 h1:5en5MdVFgeD9tuHDuJgwHYdIVjPs0PN0a7ZQ2bZNxNk=
 | 
				
			||||||
github.com/grafana/grafana-plugin-sdk-go v0.21.0/go.mod h1:G6Ov9M+FDOZXNw8eKXINO6XzqdUvTs7huwyQp5jLTBQ=
 | 
					github.com/grafana/grafana-plugin-sdk-go v0.21.0/go.mod h1:G6Ov9M+FDOZXNw8eKXINO6XzqdUvTs7huwyQp5jLTBQ=
 | 
				
			||||||
 | 
					github.com/grafana/grafana-plugin-sdk-go v0.22.1-0.20200310164332-6b4c0d952d70 h1:VQFBaWHlxwjb4VB5HuXtuucMzXJ7xZGGASzbqA3VtVo=
 | 
				
			||||||
 | 
					github.com/grafana/grafana-plugin-sdk-go v0.22.1-0.20200310164332-6b4c0d952d70/go.mod h1:G6Ov9M+FDOZXNw8eKXINO6XzqdUvTs7huwyQp5jLTBQ=
 | 
				
			||||||
 | 
					github.com/grafana/grafana-plugin-sdk-go v0.24.0 h1:sgd9rAQMmB0rAIMd4JVMFM0Gc+CTHoDwN5oxkPjVrGw=
 | 
				
			||||||
 | 
					github.com/grafana/grafana-plugin-sdk-go v0.24.0/go.mod h1:G6Ov9M+FDOZXNw8eKXINO6XzqdUvTs7huwyQp5jLTBQ=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd h1:rNuUHR+CvK1IS89MMtcF0EpcVMZtjKfPRp4MEmt/aTs=
 | 
					github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd h1:rNuUHR+CvK1IS89MMtcF0EpcVMZtjKfPRp4MEmt/aTs=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
 | 
					github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
 | 
				
			||||||
github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE=
 | 
					github.com/hashicorp/go-plugin v1.0.1 h1:4OtAfUGbnKC6yS48p0CtMX2oFYtzFZVv6rok3cRWgnE=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ import (
 | 
				
			||||||
	"path"
 | 
						"path"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/grafana/grafana-plugin-sdk-go/dataframe"
 | 
						"github.com/grafana/grafana-plugin-sdk-go/data"
 | 
				
			||||||
	"github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2"
 | 
						"github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/bus"
 | 
						"github.com/grafana/grafana/pkg/bus"
 | 
				
			||||||
	"github.com/grafana/grafana/pkg/components/simplejson"
 | 
						"github.com/grafana/grafana/pkg/components/simplejson"
 | 
				
			||||||
| 
						 | 
					@ -189,7 +189,7 @@ func (s *transformCallback) QueryData(ctx context.Context, req *pluginv2.QueryDa
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			encFrame, err := dataframe.MarshalArrow(frame)
 | 
								encFrame, err := data.MarshalArrow(frame)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,19 +3,19 @@ package tsdb
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/grafana/grafana-plugin-sdk-go/dataframe"
 | 
						"github.com/grafana/grafana-plugin-sdk-go/data"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SeriesToFrame converts a TimeSeries to a sdk Frame
 | 
					// SeriesToFrame converts a TimeSeries to a sdk Frame
 | 
				
			||||||
func SeriesToFrame(series *TimeSeries) (*dataframe.Frame, error) {
 | 
					func SeriesToFrame(series *TimeSeries) (*data.Frame, error) {
 | 
				
			||||||
	timeVec := make([]*time.Time, len(series.Points))
 | 
						timeVec := make([]*time.Time, len(series.Points))
 | 
				
			||||||
	floatVec := make([]*float64, len(series.Points))
 | 
						floatVec := make([]*float64, len(series.Points))
 | 
				
			||||||
	for idx, point := range series.Points {
 | 
						for idx, point := range series.Points {
 | 
				
			||||||
		timeVec[idx], floatVec[idx] = convertTSDBTimePoint(point)
 | 
							timeVec[idx], floatVec[idx] = convertTSDBTimePoint(point)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	frame := dataframe.New(series.Name,
 | 
						frame := data.NewFrame(series.Name,
 | 
				
			||||||
		dataframe.NewField("time", nil, timeVec),
 | 
							data.NewField("time", nil, timeVec),
 | 
				
			||||||
		dataframe.NewField("value", dataframe.Labels(series.Tags), floatVec),
 | 
							data.NewField("value", data.Labels(series.Tags), floatVec),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return frame, nil
 | 
						return frame, nil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										55
									
								
								vendor/github.com/grafana/grafana-plugin-sdk-go/backend/plugin/setup.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										55
									
								
								vendor/github.com/grafana/grafana-plugin-sdk-go/backend/plugin/setup.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					package plugin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/http/pprof"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hclog "github.com/hashicorp/go-hclog"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetupPluginEnvironment will read the environment variables and apply the
 | 
				
			||||||
 | 
					// standard environment behavior.  As the SDK evolves, this will likely change!
 | 
				
			||||||
 | 
					func SetupPluginEnvironment(pluginID string) hclog.Logger {
 | 
				
			||||||
 | 
						pluginLogger := hclog.New(&hclog.LoggerOptions{
 | 
				
			||||||
 | 
							Name: pluginID,
 | 
				
			||||||
 | 
							// TODO: How to make level configurable?
 | 
				
			||||||
 | 
							Level:      hclog.LevelFromString("DEBUG"),
 | 
				
			||||||
 | 
							JSONFormat: true,
 | 
				
			||||||
 | 
							// Color:      hclog.ColorOff, (when we use 0.12)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Enable profiler
 | 
				
			||||||
 | 
						profilerEnabled := false
 | 
				
			||||||
 | 
						if value, ok := os.LookupEnv("GF_PLUGINS_PROFILER"); ok {
 | 
				
			||||||
 | 
							// compare value to plugin name
 | 
				
			||||||
 | 
							if value == pluginID {
 | 
				
			||||||
 | 
								profilerEnabled = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						pluginLogger.Info("Profiler", "enabled", profilerEnabled)
 | 
				
			||||||
 | 
						if profilerEnabled {
 | 
				
			||||||
 | 
							profilerPort := "6060"
 | 
				
			||||||
 | 
							if value, ok := os.LookupEnv("GF_PLUGINS_PROFILER_PORT"); ok {
 | 
				
			||||||
 | 
								profilerPort = value
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pluginLogger.Info("Profiler", "port", profilerPort)
 | 
				
			||||||
 | 
							portConfig := fmt.Sprintf(":%s", profilerPort)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							r := http.NewServeMux()
 | 
				
			||||||
 | 
							r.HandleFunc("/debug/pprof/", pprof.Index)
 | 
				
			||||||
 | 
							r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
 | 
				
			||||||
 | 
							r.HandleFunc("/debug/pprof/profile", pprof.Profile)
 | 
				
			||||||
 | 
							r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
 | 
				
			||||||
 | 
							r.HandleFunc("/debug/pprof/trace", pprof.Trace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							go func() {
 | 
				
			||||||
 | 
								if err := http.ListenAndServe(portConfig, r); err != nil {
 | 
				
			||||||
 | 
									pluginLogger.Error("Error Running profiler: %s", err.Error())
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return pluginLogger
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
# dataframe
 | 
					# data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Testing
 | 
					## Testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ func MarshalArrow(f *Frame) ([]byte, error) {
 | 
				
			||||||
	return fb.Buff.Bytes(), nil
 | 
						return fb.Buff.Bytes(), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// buildArrowFields builds Arrow field definitions from a DataFrame.
 | 
					// buildArrowFields builds Arrow field definitions from a Frame.
 | 
				
			||||||
func buildArrowFields(f *Frame) ([]arrow.Field, error) {
 | 
					func buildArrowFields(f *Frame) ([]arrow.Field, error) {
 | 
				
			||||||
	arrowFields := make([]arrow.Field, len(f.Fields))
 | 
						arrowFields := make([]arrow.Field, len(f.Fields))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,13 +107,13 @@ func buildArrowFields(f *Frame) ([]arrow.Field, error) {
 | 
				
			||||||
	return arrowFields, nil
 | 
						return arrowFields, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// buildArrowColumns builds Arrow columns from a DataFrame.
 | 
					// buildArrowColumns builds Arrow columns from a Frame.
 | 
				
			||||||
func buildArrowColumns(f *Frame, arrowFields []arrow.Field) ([]array.Column, error) {
 | 
					func buildArrowColumns(f *Frame, arrowFields []arrow.Field) ([]array.Column, error) {
 | 
				
			||||||
	pool := memory.NewGoAllocator()
 | 
						pool := memory.NewGoAllocator()
 | 
				
			||||||
	columns := make([]array.Column, len(f.Fields))
 | 
						columns := make([]array.Column, len(f.Fields))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for fieldIdx, field := range f.Fields {
 | 
						for fieldIdx, field := range f.Fields {
 | 
				
			||||||
		switch v := field.Vector.(type) {
 | 
							switch v := field.vector.(type) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case *int8Vector:
 | 
							case *int8Vector:
 | 
				
			||||||
			columns[fieldIdx] = *buildInt8Column(pool, arrowFields[fieldIdx], v)
 | 
								columns[fieldIdx] = *buildInt8Column(pool, arrowFields[fieldIdx], v)
 | 
				
			||||||
| 
						 | 
					@ -187,7 +187,7 @@ func buildArrowColumns(f *Frame, arrowFields []arrow.Field) ([]array.Column, err
 | 
				
			||||||
	return columns, nil
 | 
						return columns, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// buildArrowSchema builds an Arrow schema for a DataFrame.
 | 
					// buildArrowSchema builds an Arrow schema for a Frame.
 | 
				
			||||||
func buildArrowSchema(f *Frame, fs []arrow.Field) (*arrow.Schema, error) {
 | 
					func buildArrowSchema(f *Frame, fs []arrow.Field) (*arrow.Schema, error) {
 | 
				
			||||||
	tableMetaMap := map[string]string{
 | 
						tableMetaMap := map[string]string{
 | 
				
			||||||
		"name":  f.Name,
 | 
							"name":  f.Name,
 | 
				
			||||||
| 
						 | 
					@ -215,7 +215,7 @@ func buildArrowSchema(f *Frame, fs []arrow.Field) (*arrow.Schema, error) {
 | 
				
			||||||
// fieldToArrow returns the corresponding Arrow primitive type and nullable property to the fields'
 | 
					// fieldToArrow returns the corresponding Arrow primitive type and nullable property to the fields'
 | 
				
			||||||
// Vector primitives.
 | 
					// Vector primitives.
 | 
				
			||||||
func fieldToArrow(f *Field) (arrow.DataType, bool, error) {
 | 
					func fieldToArrow(f *Field) (arrow.DataType, bool, error) {
 | 
				
			||||||
	switch f.Vector.(type) {
 | 
						switch f.vector.(type) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case *stringVector:
 | 
						case *stringVector:
 | 
				
			||||||
		return &arrow.StringType{}, false, nil
 | 
							return &arrow.StringType{}, false, nil
 | 
				
			||||||
| 
						 | 
					@ -285,7 +285,7 @@ func fieldToArrow(f *Field) (arrow.DataType, bool, error) {
 | 
				
			||||||
		return &arrow.TimestampType{}, true, nil
 | 
							return &arrow.TimestampType{}, true, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return nil, false, fmt.Errorf("unsupported type for conversion to arrow: %T", f.Vector)
 | 
							return nil, false, fmt.Errorf("unsupported type for conversion to arrow: %T", f.vector)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -317,82 +317,82 @@ func initializeFrameFields(schema *arrow.Schema, frame *Frame) ([]bool, error) {
 | 
				
			||||||
		switch field.Type.ID() {
 | 
							switch field.Type.ID() {
 | 
				
			||||||
		case arrow.STRING:
 | 
							case arrow.STRING:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableStringVector(0)
 | 
									sdkField.vector = newNullableStringVector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newStringVector(0)
 | 
								sdkField.vector = newStringVector(0)
 | 
				
			||||||
		case arrow.INT8:
 | 
							case arrow.INT8:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableInt8Vector(0)
 | 
									sdkField.vector = newNullableInt8Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newInt8Vector(0)
 | 
								sdkField.vector = newInt8Vector(0)
 | 
				
			||||||
		case arrow.INT16:
 | 
							case arrow.INT16:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableInt16Vector(0)
 | 
									sdkField.vector = newNullableInt16Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newInt16Vector(0)
 | 
								sdkField.vector = newInt16Vector(0)
 | 
				
			||||||
		case arrow.INT32:
 | 
							case arrow.INT32:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableInt32Vector(0)
 | 
									sdkField.vector = newNullableInt32Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newInt32Vector(0)
 | 
								sdkField.vector = newInt32Vector(0)
 | 
				
			||||||
		case arrow.INT64:
 | 
							case arrow.INT64:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableInt64Vector(0)
 | 
									sdkField.vector = newNullableInt64Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newInt64Vector(0)
 | 
								sdkField.vector = newInt64Vector(0)
 | 
				
			||||||
		case arrow.UINT8:
 | 
							case arrow.UINT8:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableUint8Vector(0)
 | 
									sdkField.vector = newNullableUint8Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newUint8Vector(0)
 | 
								sdkField.vector = newUint8Vector(0)
 | 
				
			||||||
		case arrow.UINT16:
 | 
							case arrow.UINT16:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableUint16Vector(0)
 | 
									sdkField.vector = newNullableUint16Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newUint16Vector(0)
 | 
								sdkField.vector = newUint16Vector(0)
 | 
				
			||||||
		case arrow.UINT32:
 | 
							case arrow.UINT32:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableUint32Vector(0)
 | 
									sdkField.vector = newNullableUint32Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newUint32Vector(0)
 | 
								sdkField.vector = newUint32Vector(0)
 | 
				
			||||||
		case arrow.UINT64:
 | 
							case arrow.UINT64:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableUint64Vector(0)
 | 
									sdkField.vector = newNullableUint64Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newUint64Vector(0)
 | 
								sdkField.vector = newUint64Vector(0)
 | 
				
			||||||
		case arrow.FLOAT32:
 | 
							case arrow.FLOAT32:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableFloat32Vector(0)
 | 
									sdkField.vector = newNullableFloat32Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newFloat32Vector(0)
 | 
								sdkField.vector = newFloat32Vector(0)
 | 
				
			||||||
		case arrow.FLOAT64:
 | 
							case arrow.FLOAT64:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableFloat64Vector(0)
 | 
									sdkField.vector = newNullableFloat64Vector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newFloat64Vector(0)
 | 
								sdkField.vector = newFloat64Vector(0)
 | 
				
			||||||
		case arrow.BOOL:
 | 
							case arrow.BOOL:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableBoolVector(0)
 | 
									sdkField.vector = newNullableBoolVector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newBoolVector(0)
 | 
								sdkField.vector = newBoolVector(0)
 | 
				
			||||||
		case arrow.TIMESTAMP:
 | 
							case arrow.TIMESTAMP:
 | 
				
			||||||
			if nullable[idx] {
 | 
								if nullable[idx] {
 | 
				
			||||||
				sdkField.Vector = newNullableTimeTimeVector(0)
 | 
									sdkField.vector = newNullableTimeTimeVector(0)
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			sdkField.Vector = newTimeTimeVector(0)
 | 
								sdkField.vector = newTimeTimeVector(0)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return nullable, fmt.Errorf("unsupported conversion from arrow to sdk type for arrow type %v", field.Type.ID().String())
 | 
								return nullable, fmt.Errorf("unsupported conversion from arrow to sdk type for arrow type %v", field.Type.ID().String())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -420,14 +420,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *string
 | 
												var ns *string
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.INT8:
 | 
								case arrow.INT8:
 | 
				
			||||||
				v := array.NewInt8Data(col.Data())
 | 
									v := array.NewInt8Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -435,14 +435,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *int8
 | 
												var ns *int8
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.INT16:
 | 
								case arrow.INT16:
 | 
				
			||||||
				v := array.NewInt16Data(col.Data())
 | 
									v := array.NewInt16Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -450,14 +450,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *int16
 | 
												var ns *int16
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.INT32:
 | 
								case arrow.INT32:
 | 
				
			||||||
				v := array.NewInt32Data(col.Data())
 | 
									v := array.NewInt32Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -465,14 +465,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *int32
 | 
												var ns *int32
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.INT64:
 | 
								case arrow.INT64:
 | 
				
			||||||
				v := array.NewInt64Data(col.Data())
 | 
									v := array.NewInt64Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -480,14 +480,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *int64
 | 
												var ns *int64
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.UINT8:
 | 
								case arrow.UINT8:
 | 
				
			||||||
				v := array.NewUint8Data(col.Data())
 | 
									v := array.NewUint8Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -495,14 +495,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *uint8
 | 
												var ns *uint8
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.UINT32:
 | 
								case arrow.UINT32:
 | 
				
			||||||
				v := array.NewUint32Data(col.Data())
 | 
									v := array.NewUint32Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -510,14 +510,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *uint32
 | 
												var ns *uint32
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.UINT64:
 | 
								case arrow.UINT64:
 | 
				
			||||||
				v := array.NewUint64Data(col.Data())
 | 
									v := array.NewUint64Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -525,14 +525,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *uint64
 | 
												var ns *uint64
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.UINT16:
 | 
								case arrow.UINT16:
 | 
				
			||||||
				v := array.NewUint16Data(col.Data())
 | 
									v := array.NewUint16Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -540,14 +540,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(rIdx) {
 | 
											if v.IsNull(rIdx) {
 | 
				
			||||||
							var ns *uint16
 | 
												var ns *uint16
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						rv := v.Value(rIdx)
 | 
											rv := v.Value(rIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&rv)
 | 
											frame.Fields[i].vector.Append(&rv)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(rIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(rIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.FLOAT32:
 | 
								case arrow.FLOAT32:
 | 
				
			||||||
				v := array.NewFloat32Data(col.Data())
 | 
									v := array.NewFloat32Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -555,14 +555,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(vIdx) {
 | 
											if v.IsNull(vIdx) {
 | 
				
			||||||
							var nf *float32
 | 
												var nf *float32
 | 
				
			||||||
							frame.Fields[i].Vector.Append(nf)
 | 
												frame.Fields[i].vector.Append(nf)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						vF := f
 | 
											vF := f
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&vF)
 | 
											frame.Fields[i].vector.Append(&vF)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(f)
 | 
										frame.Fields[i].vector.Append(f)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.FLOAT64:
 | 
								case arrow.FLOAT64:
 | 
				
			||||||
				v := array.NewFloat64Data(col.Data())
 | 
									v := array.NewFloat64Data(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -570,14 +570,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(vIdx) {
 | 
											if v.IsNull(vIdx) {
 | 
				
			||||||
							var nf *float64
 | 
												var nf *float64
 | 
				
			||||||
							frame.Fields[i].Vector.Append(nf)
 | 
												frame.Fields[i].vector.Append(nf)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						vF := f
 | 
											vF := f
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&vF)
 | 
											frame.Fields[i].vector.Append(&vF)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(f)
 | 
										frame.Fields[i].vector.Append(f)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.BOOL:
 | 
								case arrow.BOOL:
 | 
				
			||||||
				v := array.NewBooleanData(col.Data())
 | 
									v := array.NewBooleanData(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -585,14 +585,14 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(sIdx) {
 | 
											if v.IsNull(sIdx) {
 | 
				
			||||||
							var ns *bool
 | 
												var ns *bool
 | 
				
			||||||
							frame.Fields[i].Vector.Append(ns)
 | 
												frame.Fields[i].vector.Append(ns)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						vB := v.Value(sIdx)
 | 
											vB := v.Value(sIdx)
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&vB)
 | 
											frame.Fields[i].vector.Append(&vB)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(v.Value(sIdx))
 | 
										frame.Fields[i].vector.Append(v.Value(sIdx))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			case arrow.TIMESTAMP:
 | 
								case arrow.TIMESTAMP:
 | 
				
			||||||
				v := array.NewTimestampData(col.Data())
 | 
									v := array.NewTimestampData(col.Data())
 | 
				
			||||||
| 
						 | 
					@ -601,13 +601,13 @@ func populateFrameFields(fR *ipc.FileReader, nullable []bool, frame *Frame) erro
 | 
				
			||||||
					if nullable[i] {
 | 
										if nullable[i] {
 | 
				
			||||||
						if v.IsNull(vIdx) {
 | 
											if v.IsNull(vIdx) {
 | 
				
			||||||
							var nt *time.Time
 | 
												var nt *time.Time
 | 
				
			||||||
							frame.Fields[i].Vector.Append(nt)
 | 
												frame.Fields[i].vector.Append(nt)
 | 
				
			||||||
							continue
 | 
												continue
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						frame.Fields[i].Vector.Append(&t)
 | 
											frame.Fields[i].vector.Append(&t)
 | 
				
			||||||
						continue
 | 
											continue
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					frame.Fields[i].Vector.Append(t)
 | 
										frame.Fields[i].vector.Append(t)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				return fmt.Errorf("unsupported arrow type %s for conversion", col.DataType().ID())
 | 
									return fmt.Errorf("unsupported arrow type %s for conversion", col.DataType().ID())
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/apache/arrow/go/arrow"
 | 
						"github.com/apache/arrow/go/arrow"
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,8 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "encoding/json"
 | 
					import "encoding/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Warning contains information about problems in a dataframe.
 | 
					// Warning contains information about problems in a data.
 | 
				
			||||||
type Warning struct {
 | 
					type Warning struct {
 | 
				
			||||||
	// Short message (typically shown in the header)
 | 
						// Short message (typically shown in the header)
 | 
				
			||||||
	Message string `json:"message,omitempty"`
 | 
						Message string `json:"message,omitempty"`
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,16 @@
 | 
				
			||||||
package dataframe
 | 
					// Package data provides data structures that Grafana recognizes. The Frame
 | 
				
			||||||
 | 
					// object represents a Grafana Dataframe which can represent data such as tables
 | 
				
			||||||
 | 
					// and time series.
 | 
				
			||||||
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"math"
 | 
				
			||||||
	"sort"
 | 
						"sort"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/google/go-cmp/cmp"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Frame represents a columnar storage with optional labels.
 | 
					// Frame represents a columnar storage with optional labels.
 | 
				
			||||||
| 
						 | 
					@ -21,7 +27,7 @@ type Frame struct {
 | 
				
			||||||
type Field struct {
 | 
					type Field struct {
 | 
				
			||||||
	Name   string
 | 
						Name   string
 | 
				
			||||||
	Config *FieldConfig
 | 
						Config *FieldConfig
 | 
				
			||||||
	Vector Vector // TODO? in the frontend, the variable is called "Values"
 | 
						vector vector // TODO? in the frontend, the variable is called "Values"
 | 
				
			||||||
	Labels Labels
 | 
						Labels Labels
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,13 +35,13 @@ type Field struct {
 | 
				
			||||||
type Fields []*Field
 | 
					type Fields []*Field
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AppendRow adds a new row to the Frame by appending to each element of vals to
 | 
					// AppendRow adds a new row to the Frame by appending to each element of vals to
 | 
				
			||||||
// the corresponding Field in the dataframe.
 | 
					// the corresponding Field in the data.
 | 
				
			||||||
// The dataframe's Fields and the Fields' Vectors must be initalized or AppendRow will panic.
 | 
					// The Frame's Fields must be initalized or AppendRow will panic.
 | 
				
			||||||
// The number of arguments must match the number of Fields in the Frame and each type must coorespond
 | 
					// The number of arguments must match the number of Fields in the Frame and each type must coorespond
 | 
				
			||||||
// to the Field type or AppendRow will panic.
 | 
					// to the Field type or AppendRow will panic.
 | 
				
			||||||
func (f *Frame) AppendRow(vals ...interface{}) {
 | 
					func (f *Frame) AppendRow(vals ...interface{}) {
 | 
				
			||||||
	for i, v := range vals {
 | 
						for i, v := range vals {
 | 
				
			||||||
		f.Fields[i].Vector.Append(v)
 | 
							f.Fields[i].vector.Append(v)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +51,7 @@ func (f *Frame) AppendWarning(message string, details string) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AppendRowSafe adds a new row to the Frame by appending to each each element of vals to
 | 
					// AppendRowSafe adds a new row to the Frame by appending to each each element of vals to
 | 
				
			||||||
// the corresponding Field in the dataframe. It has the some constraints as AppendRow but will
 | 
					// the corresponding Field in the data. It has the some constraints as AppendRow but will
 | 
				
			||||||
// return an error under those conditions instead of panicing.
 | 
					// return an error under those conditions instead of panicing.
 | 
				
			||||||
func (f *Frame) AppendRowSafe(vals ...interface{}) error {
 | 
					func (f *Frame) AppendRowSafe(vals ...interface{}) error {
 | 
				
			||||||
	if len(vals) != len(f.Fields) {
 | 
						if len(vals) != len(f.Fields) {
 | 
				
			||||||
| 
						 | 
					@ -53,29 +59,44 @@ func (f *Frame) AppendRowSafe(vals ...interface{}) error {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// check validity before any modification
 | 
						// check validity before any modification
 | 
				
			||||||
	for i, v := range vals {
 | 
						for i, v := range vals {
 | 
				
			||||||
		if f.Fields[i] == nil {
 | 
							if f.Fields[i] == nil || f.Fields[i].vector == nil {
 | 
				
			||||||
			return fmt.Errorf("can not append to uninitalized Field at field index %v", i)
 | 
								return fmt.Errorf("can not append to uninitalized Field at field index %v", i)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if f.Fields[i].Vector == nil {
 | 
							dfPType := f.Fields[i].Type()
 | 
				
			||||||
			return fmt.Errorf("can not append to uninitalized Field Vector at field index %v", i)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		dfPType := f.Fields[i].Vector.PrimitiveType()
 | 
					 | 
				
			||||||
		if v == nil {
 | 
							if v == nil {
 | 
				
			||||||
			if !dfPType.Nullable() {
 | 
								if !dfPType.Nullable() {
 | 
				
			||||||
				return fmt.Errorf("can not append nil to non-nullable vector with underlying type %s at field index %v", dfPType, i)
 | 
									return fmt.Errorf("can not append nil to non-nullable vector with underlying type %s at field index %v", dfPType, i)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if v != nil && pTypeFromVal(v) != dfPType {
 | 
							if v != nil && fieldTypeFromVal(v) != dfPType {
 | 
				
			||||||
			return fmt.Errorf("invalid type appending row at index %v, got %T want %v", i, v, dfPType.ItemTypeString())
 | 
								return fmt.Errorf("invalid type appending row at index %v, got %T want %v", i, v, dfPType.ItemTypeString())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		f.Fields[i].Vector.Append(v)
 | 
							f.Fields[i].vector.Append(v)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TypeIndices returns a slice of Field index positions for the given pTypes.
 | 
				
			||||||
 | 
					func (f *Frame) TypeIndices(pTypes ...FieldType) []int {
 | 
				
			||||||
 | 
						indices := []int{}
 | 
				
			||||||
 | 
						if f.Fields == nil {
 | 
				
			||||||
 | 
							return indices
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for fieldIdx, f := range f.Fields {
 | 
				
			||||||
 | 
							vecType := f.Type()
 | 
				
			||||||
 | 
							for _, pType := range pTypes {
 | 
				
			||||||
 | 
								if pType == vecType {
 | 
				
			||||||
 | 
									indices = append(indices, fieldIdx)
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return indices
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewField returns a new instance of Field.
 | 
					// NewField returns a new instance of Field.
 | 
				
			||||||
func NewField(name string, labels Labels, values interface{}) *Field {
 | 
					func NewField(name string, labels Labels, values interface{}) *Field {
 | 
				
			||||||
	var vec Vector
 | 
						var vec vector
 | 
				
			||||||
	switch v := values.(type) {
 | 
						switch v := values.(type) {
 | 
				
			||||||
	case []int8:
 | 
						case []int8:
 | 
				
			||||||
		vec = newVector(v, len(v))
 | 
							vec = newVector(v, len(v))
 | 
				
			||||||
| 
						 | 
					@ -213,14 +234,66 @@ func NewField(name string, labels Labels, values interface{}) *Field {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &Field{
 | 
						return &Field{
 | 
				
			||||||
		Name:   name,
 | 
							Name:   name,
 | 
				
			||||||
		Vector: vec,
 | 
							vector: vec,
 | 
				
			||||||
		Labels: labels,
 | 
							Labels: labels,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Len returns the number of elements in the field.
 | 
					// Set sets the Field's value at index idx to val.
 | 
				
			||||||
 | 
					// It will panic if idx is out of range.
 | 
				
			||||||
 | 
					func (f *Field) Set(idx int, val interface{}) {
 | 
				
			||||||
 | 
						f.vector.Set(idx, val)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Append appends element i to the Field.
 | 
				
			||||||
 | 
					func (f *Field) Append(i interface{}) {
 | 
				
			||||||
 | 
						f.vector.Append(i)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Extend extends the Field length by i.
 | 
				
			||||||
 | 
					func (f *Field) Extend(i int) {
 | 
				
			||||||
 | 
						f.vector.Extend(i)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// At returns the the element at index idx of the Field.
 | 
				
			||||||
 | 
					// It will panic if idx is out of range.
 | 
				
			||||||
 | 
					func (f *Field) At(idx int) interface{} {
 | 
				
			||||||
 | 
						return f.vector.At(idx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Len returns the number of elements in the Field.
 | 
				
			||||||
func (f *Field) Len() int {
 | 
					func (f *Field) Len() int {
 | 
				
			||||||
	return f.Vector.Len()
 | 
						return f.vector.Len()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Type returns the underlying primitive type of the Field.
 | 
				
			||||||
 | 
					func (f *Field) Type() FieldType {
 | 
				
			||||||
 | 
						return f.vector.Type()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PointerAt returns a pointer to the value at idx of the Field.
 | 
				
			||||||
 | 
					// It will panic if idx is out of range.
 | 
				
			||||||
 | 
					func (f *Field) PointerAt(idx int) interface{} {
 | 
				
			||||||
 | 
						return f.vector.PointerAt(idx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CopyAt returns a copy of the value of the specified index idx.
 | 
				
			||||||
 | 
					// It will panic if idx is out of range.
 | 
				
			||||||
 | 
					func (f *Field) CopyAt(idx int) interface{} {
 | 
				
			||||||
 | 
						return f.vector.CopyAt(idx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ConcreteAt returns the concrete value at the specified index idx.
 | 
				
			||||||
 | 
					// A non-pointer type is returned regardless if the underlying vector is a pointer
 | 
				
			||||||
 | 
					// type or not. If the value is a pointer type, and is nil, then the zero value
 | 
				
			||||||
 | 
					// is returned and ok will be false.
 | 
				
			||||||
 | 
					func (f *Field) ConcreteAt(idx int) (val interface{}, ok bool) {
 | 
				
			||||||
 | 
						return f.vector.ConcreteAt(idx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Nullable returns if the the Field's elements are nullable.
 | 
				
			||||||
 | 
					func (f *Field) Nullable() bool {
 | 
				
			||||||
 | 
						return f.Type().Nullable()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetConfig modifies the Field's Config property to
 | 
					// SetConfig modifies the Field's Config property to
 | 
				
			||||||
| 
						 | 
					@ -303,8 +376,8 @@ func LabelsFromString(s string) (Labels, error) {
 | 
				
			||||||
	return labels, nil
 | 
						return labels, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// New returns a new instance of a Frame.
 | 
					// NewFrame returns a new instance of a Frame.
 | 
				
			||||||
func New(name string, fields ...*Field) *Frame {
 | 
					func NewFrame(name string, fields ...*Field) *Frame {
 | 
				
			||||||
	return &Frame{
 | 
						return &Frame{
 | 
				
			||||||
		Name:   name,
 | 
							Name:   name,
 | 
				
			||||||
		Fields: fields,
 | 
							Fields: fields,
 | 
				
			||||||
| 
						 | 
					@ -318,3 +391,97 @@ func (f *Frame) Rows() int {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// At returns the value of the specified fieldIdx and rowIdx.
 | 
				
			||||||
 | 
					// It will panic if either the fieldIdx or rowIdx are out of range.
 | 
				
			||||||
 | 
					func (f *Frame) At(fieldIdx int, rowIdx int) interface{} {
 | 
				
			||||||
 | 
						return f.Fields[fieldIdx].vector.At(rowIdx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CopyAt returns a copy of the value of the specified fieldIdx and rowIdx.
 | 
				
			||||||
 | 
					// It will panic if either the fieldIdx or rowIdx are out of range.
 | 
				
			||||||
 | 
					func (f *Frame) CopyAt(fieldIdx int, rowIdx int) interface{} {
 | 
				
			||||||
 | 
						return f.Fields[fieldIdx].vector.CopyAt(rowIdx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Set set the val to the specified fieldIdx and rowIdx.
 | 
				
			||||||
 | 
					// It will panic if either the fieldIdx or rowIdx are out of range.
 | 
				
			||||||
 | 
					func (f *Frame) Set(fieldIdx int, rowIdx int, val interface{}) {
 | 
				
			||||||
 | 
						f.Fields[fieldIdx].vector.Set(rowIdx, val)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Extend extends all the Fields by length by i.
 | 
				
			||||||
 | 
					func (f *Frame) Extend(i int) {
 | 
				
			||||||
 | 
						for _, f := range f.Fields {
 | 
				
			||||||
 | 
							f.vector.Extend(i)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ConcreteAt returns the concrete value at the specified fieldIdx and rowIdx.
 | 
				
			||||||
 | 
					// A non-pointer type is returned regardless if the underlying type is a pointer
 | 
				
			||||||
 | 
					// type or not. If the value is a pointer type, and is nil, then the zero value
 | 
				
			||||||
 | 
					// is returned and ok will be false.
 | 
				
			||||||
 | 
					func (f *Frame) ConcreteAt(fieldIdx int, rowIdx int) (val interface{}, ok bool) {
 | 
				
			||||||
 | 
						return f.Fields[fieldIdx].vector.ConcreteAt(rowIdx)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RowLen returns the the length of the Frame Fields.
 | 
				
			||||||
 | 
					// If the Length of all the Fields is not the same then error is returned.
 | 
				
			||||||
 | 
					// If the Frame's Fields are nil an error is returned.
 | 
				
			||||||
 | 
					func (f *Frame) RowLen() (int, error) {
 | 
				
			||||||
 | 
						if f.Fields == nil || len(f.Fields) == 0 {
 | 
				
			||||||
 | 
							return 0, fmt.Errorf("frame's fields are nil or of zero length")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var l int
 | 
				
			||||||
 | 
						for i := 0; i < len(f.Fields); i++ {
 | 
				
			||||||
 | 
							if f.Fields[i].vector == nil {
 | 
				
			||||||
 | 
								return 0, fmt.Errorf("frame's field at index %v is nil", i)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if i == 0 {
 | 
				
			||||||
 | 
								l = f.Fields[i].Len()
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if l != f.Fields[i].Len() {
 | 
				
			||||||
 | 
								return 0, fmt.Errorf("frame has different field lengths, field 0 is len %v but field %v is len %v", l, i, f.Fields[i].vector.Len())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return l, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FrameTestCompareOptions returns go-cmp testing options to allow testing of Frame equivelnce.
 | 
				
			||||||
 | 
					// The intent is to only use this for testing.
 | 
				
			||||||
 | 
					func FrameTestCompareOptions() []cmp.Option {
 | 
				
			||||||
 | 
						confFloats := cmp.Comparer(func(x, y *ConfFloat64) bool {
 | 
				
			||||||
 | 
							if x == nil && y == nil {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if y == nil {
 | 
				
			||||||
 | 
								if math.IsNaN(float64(*x)) {
 | 
				
			||||||
 | 
									return true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if math.IsInf(float64(*x), 1) {
 | 
				
			||||||
 | 
									return true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if math.IsInf(float64(*x), -1) {
 | 
				
			||||||
 | 
									return true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if x == nil {
 | 
				
			||||||
 | 
								if math.IsNaN(float64(*y)) {
 | 
				
			||||||
 | 
									return true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if math.IsInf(float64(*y), 1) {
 | 
				
			||||||
 | 
									return true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if math.IsInf(float64(*y), -1) {
 | 
				
			||||||
 | 
									return true
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return *x == *y
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unexportedField := cmp.AllowUnexported(Field{})
 | 
				
			||||||
 | 
						return []cmp.Option{confFloats, unexportedField}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:generate genny -in=$GOFILE -out=nullable_vector.gen.go gen "gen=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time"
 | 
					//go:generate genny -in=$GOFILE -out=nullable_vector.gen.go gen "gen=uint8,uint16,uint32,uint64,int8,int16,int32,int64,float32,float64,string,bool,time.Time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,26 @@ func (v *nullablegenVector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullablegenVector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *gen
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g gen
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullablegenVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g gen
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullablegenVector) PointerAt(i int) interface{} {
 | 
					func (v *nullablegenVector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -33,8 +53,8 @@ func (v *nullablegenVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullablegenVector) PrimitiveType() VectorPType {
 | 
					func (v *nullablegenVector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullablegenVector) Extend(i int) {
 | 
					func (v *nullablegenVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"github.com/cheekybits/genny/generic"
 | 
						"github.com/cheekybits/genny/generic"
 | 
				
			||||||
| 
						 | 
					@ -35,8 +35,18 @@ func (v *genVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *genVector) PrimitiveType() VectorPType {
 | 
					func (v *genVector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g gen
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *genVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *genVector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *genVector) Extend(i int) {
 | 
					func (v *genVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
// Any changes will be lost if this file is regenerated.
 | 
					// Any changes will be lost if this file is regenerated.
 | 
				
			||||||
// see https://github.com/cheekybits/genny
 | 
					// see https://github.com/cheekybits/genny
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "time"
 | 
					import "time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,26 @@ func (v *nullableUint8Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint8Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *uint8
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g uint8
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint8Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g uint8
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint8Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableUint8Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -39,8 +59,8 @@ func (v *nullableUint8Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint8Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableUint8Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint8Vector) Extend(i int) {
 | 
					func (v *nullableUint8Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -72,6 +92,26 @@ func (v *nullableUint16Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint16Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *uint16
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g uint16
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint16Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g uint16
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint16Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableUint16Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -80,8 +120,8 @@ func (v *nullableUint16Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint16Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableUint16Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint16Vector) Extend(i int) {
 | 
					func (v *nullableUint16Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -113,6 +153,26 @@ func (v *nullableUint32Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint32Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *uint32
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g uint32
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint32Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g uint32
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint32Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableUint32Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -121,8 +181,8 @@ func (v *nullableUint32Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint32Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableUint32Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint32Vector) Extend(i int) {
 | 
					func (v *nullableUint32Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -154,6 +214,26 @@ func (v *nullableUint64Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint64Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *uint64
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g uint64
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableUint64Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g uint64
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint64Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableUint64Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -162,8 +242,8 @@ func (v *nullableUint64Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint64Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableUint64Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableUint64Vector) Extend(i int) {
 | 
					func (v *nullableUint64Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -195,6 +275,26 @@ func (v *nullableInt8Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt8Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *int8
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g int8
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt8Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g int8
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt8Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableInt8Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -203,8 +303,8 @@ func (v *nullableInt8Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt8Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableInt8Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt8Vector) Extend(i int) {
 | 
					func (v *nullableInt8Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -236,6 +336,26 @@ func (v *nullableInt16Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt16Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *int16
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g int16
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt16Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g int16
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt16Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableInt16Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -244,8 +364,8 @@ func (v *nullableInt16Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt16Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableInt16Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt16Vector) Extend(i int) {
 | 
					func (v *nullableInt16Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -277,6 +397,26 @@ func (v *nullableInt32Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt32Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *int32
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g int32
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt32Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g int32
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt32Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableInt32Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -285,8 +425,8 @@ func (v *nullableInt32Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt32Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableInt32Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt32Vector) Extend(i int) {
 | 
					func (v *nullableInt32Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -318,6 +458,26 @@ func (v *nullableInt64Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt64Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *int64
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g int64
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableInt64Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g int64
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt64Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableInt64Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -326,8 +486,8 @@ func (v *nullableInt64Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt64Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableInt64Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableInt64Vector) Extend(i int) {
 | 
					func (v *nullableInt64Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -359,6 +519,26 @@ func (v *nullableFloat32Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableFloat32Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *float32
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g float32
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableFloat32Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g float32
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableFloat32Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableFloat32Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -367,8 +547,8 @@ func (v *nullableFloat32Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableFloat32Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableFloat32Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableFloat32Vector) Extend(i int) {
 | 
					func (v *nullableFloat32Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -400,6 +580,26 @@ func (v *nullableFloat64Vector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableFloat64Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *float64
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g float64
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableFloat64Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g float64
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableFloat64Vector) PointerAt(i int) interface{} {
 | 
					func (v *nullableFloat64Vector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -408,8 +608,8 @@ func (v *nullableFloat64Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableFloat64Vector) PrimitiveType() VectorPType {
 | 
					func (v *nullableFloat64Vector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableFloat64Vector) Extend(i int) {
 | 
					func (v *nullableFloat64Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -441,6 +641,26 @@ func (v *nullableStringVector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableStringVector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *string
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g string
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableStringVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g string
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableStringVector) PointerAt(i int) interface{} {
 | 
					func (v *nullableStringVector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -449,8 +669,8 @@ func (v *nullableStringVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableStringVector) PrimitiveType() VectorPType {
 | 
					func (v *nullableStringVector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableStringVector) Extend(i int) {
 | 
					func (v *nullableStringVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -482,6 +702,26 @@ func (v *nullableBoolVector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableBoolVector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *bool
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g bool
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableBoolVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g bool
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableBoolVector) PointerAt(i int) interface{} {
 | 
					func (v *nullableBoolVector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -490,8 +730,8 @@ func (v *nullableBoolVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableBoolVector) PrimitiveType() VectorPType {
 | 
					func (v *nullableBoolVector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableBoolVector) Extend(i int) {
 | 
					func (v *nullableBoolVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -523,6 +763,26 @@ func (v *nullableTimeTimeVector) At(i int) interface{} {
 | 
				
			||||||
	return (*v)[i]
 | 
						return (*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableTimeTimeVector) CopyAt(i int) interface{} {
 | 
				
			||||||
 | 
						if (*v)[i] == nil {
 | 
				
			||||||
 | 
							var g *time.Time
 | 
				
			||||||
 | 
							return g
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var g time.Time
 | 
				
			||||||
 | 
						g = *(*v)[i]
 | 
				
			||||||
 | 
						return &g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *nullableTimeTimeVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						var g time.Time
 | 
				
			||||||
 | 
						val := (*v)[i]
 | 
				
			||||||
 | 
						if val == nil {
 | 
				
			||||||
 | 
							return g, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						g = *val
 | 
				
			||||||
 | 
						return g, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableTimeTimeVector) PointerAt(i int) interface{} {
 | 
					func (v *nullableTimeTimeVector) PointerAt(i int) interface{} {
 | 
				
			||||||
	return &(*v)[i]
 | 
						return &(*v)[i]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -531,8 +791,8 @@ func (v *nullableTimeTimeVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableTimeTimeVector) PrimitiveType() VectorPType {
 | 
					func (v *nullableTimeTimeVector) Type() FieldType {
 | 
				
			||||||
	return vectorPType(v)
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *nullableTimeTimeVector) Extend(i int) {
 | 
					func (v *nullableTimeTimeVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "encoding/json"
 | 
					import "encoding/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"database/sql"
 | 
						"database/sql"
 | 
				
			||||||
| 
						 | 
					@ -6,13 +6,13 @@ import (
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewFromSQLRows returns a new dataframe populated with the data from rows. The Field Vector types
 | 
					// NewFromSQLRows returns a new Frame populated with the data from rows. The Field Vector types
 | 
				
			||||||
// will be Vectors of pointer types, []*T, if the SQL column is nullable or if the nullable property is unknown.
 | 
					// will be Vectors of pointer types, []*T, if the SQL column is nullable or if the nullable property is unknown.
 | 
				
			||||||
// Otherwise, they will be []T types.
 | 
					// Otherwise, they will be []T types.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Fields will be named to match name of the SQL columns and the SQL column names must be unique (https://github.com/grafana/grafana-plugin-sdk-go/issues/59).
 | 
					// Fields will be named to match name of the SQL columns and the SQL column names must be unique (https://github.com/grafana/grafana-plugin-sdk-go/issues/59).
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// All the types must be supported by the dataframe or a SQLStringConverter will be created and
 | 
					// All the types must be supported by the Frame or a SQLStringConverter will be created and
 | 
				
			||||||
// the resulting Field Vector type will be of type []*string.
 | 
					// the resulting Field Vector type will be of type []*string.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// The SQLStringConverter's ConversionFunc will be applied to matching rows if it is not nil.
 | 
					// The SQLStringConverter's ConversionFunc will be applied to matching rows if it is not nil.
 | 
				
			||||||
| 
						 | 
					@ -39,11 +39,11 @@ func NewFromSQLRows(rows *sql.Rows, converters ...SQLStringConverter) (*Frame, m
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		vec := frame.Fields[fieldIdx]
 | 
							vec := frame.Fields[fieldIdx]
 | 
				
			||||||
		for i := 0; i < vec.Len(); i++ {
 | 
							for i := 0; i < vec.Len(); i++ {
 | 
				
			||||||
			v, err := mapper.ConversionFunc(vec.Vector.At(i).(*string))
 | 
								v, err := mapper.ConversionFunc(vec.vector.At(i).(*string))
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, nil, err
 | 
									return nil, nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			vec.Vector.Set(i, v)
 | 
								vec.vector.Set(i, v)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if mapper.Replacer == nil {
 | 
							if mapper.Replacer == nil {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ func newForSQLRows(rows *sql.Rows, converters ...SQLStringConverter) (*Frame, ma
 | 
				
			||||||
			// Nullabe types get passed to scan as a pointer to a pointer
 | 
								// Nullabe types get passed to scan as a pointer to a pointer
 | 
				
			||||||
			vec = reflect.MakeSlice(reflect.SliceOf(ptrType), 0, 0).Interface()
 | 
								vec = reflect.MakeSlice(reflect.SliceOf(ptrType), 0, 0).Interface()
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if !ValidVectorType(vec) {
 | 
							if !ValidFieldType(vec) {
 | 
				
			||||||
			// Automatically create string mapper if we end up with an unsupported type
 | 
								// Automatically create string mapper if we end up with an unsupported type
 | 
				
			||||||
			mapping[i] = SQLStringConverter{
 | 
								mapping[i] = SQLStringConverter{
 | 
				
			||||||
				Name:          fmt.Sprintf("Autogenerated for column %v", i),
 | 
									Name:          fmt.Sprintf("Autogenerated for column %v", i),
 | 
				
			||||||
| 
						 | 
					@ -115,13 +115,13 @@ func newForSQLRows(rows *sql.Rows, converters ...SQLStringConverter) (*Frame, ma
 | 
				
			||||||
	return frame, mapping, nil
 | 
						return frame, mapping, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// newScannableRow adds a row to the dataframe by extending each Field's Vector. It returns
 | 
					// newScannableRow adds a row to the Frame by extending each Field's Vector. It returns
 | 
				
			||||||
// a slice of references that can be passed to the database/sql rows.Scan() to scan directly into
 | 
					// a slice of references that can be passed to the database/sql rows.Scan() to scan directly into
 | 
				
			||||||
// the extended Vectors of the dataframe.
 | 
					// the extended Vectors of the data.
 | 
				
			||||||
func (f *Frame) newScannableRow() []interface{} {
 | 
					func (f *Frame) newScannableRow() []interface{} {
 | 
				
			||||||
	row := make([]interface{}, len(f.Fields))
 | 
						row := make([]interface{}, len(f.Fields))
 | 
				
			||||||
	for i, field := range f.Fields {
 | 
						for i, field := range f.Fields {
 | 
				
			||||||
		vec := field.Vector
 | 
							vec := field.vector
 | 
				
			||||||
		vec.Extend(1)
 | 
							vec.Extend(1)
 | 
				
			||||||
		// non-nullable fields will be *T, and nullable fields will be **T
 | 
							// non-nullable fields will be *T, and nullable fields will be **T
 | 
				
			||||||
		vecItemPointer := vec.PointerAt(vec.Len() - 1)
 | 
							vecItemPointer := vec.PointerAt(vec.Len() - 1)
 | 
				
			||||||
| 
						 | 
					@ -131,7 +131,7 @@ func (f *Frame) newScannableRow() []interface{} {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SQLStringConverter can be used to store types not supported by
 | 
					// SQLStringConverter can be used to store types not supported by
 | 
				
			||||||
// a dataframe into a *string. When scanning, if a SQL's row's InputScanType's Kind
 | 
					// a Frame into a *string. When scanning, if a SQL's row's InputScanType's Kind
 | 
				
			||||||
// and InputScanKind match that returned by the sql response, then the
 | 
					// and InputScanKind match that returned by the sql response, then the
 | 
				
			||||||
// conversion func will be run on the row.
 | 
					// conversion func will be run on the row.
 | 
				
			||||||
type SQLStringConverter struct {
 | 
					type SQLStringConverter struct {
 | 
				
			||||||
| 
						 | 
					@ -150,7 +150,7 @@ type SQLStringConverter struct {
 | 
				
			||||||
// Note: SQLStringConverter is perhaps better understood as []byte. However, currently
 | 
					// Note: SQLStringConverter is perhaps better understood as []byte. However, currently
 | 
				
			||||||
// the Vector type ([][]byte) is not supported. https://github.com/grafana/grafana-plugin-sdk-go/issues/57
 | 
					// the Vector type ([][]byte) is not supported. https://github.com/grafana/grafana-plugin-sdk-go/issues/57
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StringFieldReplacer is used to replace a *string Field in a dataframe. The type
 | 
					// StringFieldReplacer is used to replace a *string Field in a data. The type
 | 
				
			||||||
// returned by the ReplaceFunc must match the type of elements of VectorType.
 | 
					// returned by the ReplaceFunc must match the type of elements of VectorType.
 | 
				
			||||||
// Both properties must be non-nil.
 | 
					// Both properties must be non-nil.
 | 
				
			||||||
type StringFieldReplacer struct {
 | 
					type StringFieldReplacer struct {
 | 
				
			||||||
| 
						 | 
					@ -165,22 +165,22 @@ func Replace(frame *Frame, fieldIdx int, replacer *StringFieldReplacer) error {
 | 
				
			||||||
		return fmt.Errorf("fieldIdx is out of bounds, field len: %v", len(frame.Fields))
 | 
							return fmt.Errorf("fieldIdx is out of bounds, field len: %v", len(frame.Fields))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	field := frame.Fields[fieldIdx]
 | 
						field := frame.Fields[fieldIdx]
 | 
				
			||||||
	if field.Vector.PrimitiveType() != VectorPTypeNullableString {
 | 
						if field.Type() != FieldTypeNullableString {
 | 
				
			||||||
		return fmt.Errorf("can only replace []*string vectors, vector is of type %s", field.Vector.PrimitiveType())
 | 
							return fmt.Errorf("can only replace []*string vectors, vector is of type %s", field.Type())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !ValidVectorType(replacer.VectorType) {
 | 
						if !ValidFieldType(replacer.VectorType) {
 | 
				
			||||||
		return fmt.Errorf("can not replace column with unsupported type %T", replacer.VectorType)
 | 
							return fmt.Errorf("can not replace column with unsupported type %T", replacer.VectorType)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	newVector := newVector(replacer.VectorType, field.Vector.Len())
 | 
						newVector := newVector(replacer.VectorType, field.vector.Len())
 | 
				
			||||||
	for i := 0; i < newVector.Len(); i++ {
 | 
						for i := 0; i < newVector.Len(); i++ {
 | 
				
			||||||
		oldVal := field.Vector.At(i).(*string) // Vector type is checked earlier above
 | 
							oldVal := field.vector.At(i).(*string) // Vector type is checked earlier above
 | 
				
			||||||
		newVal, err := replacer.ReplaceFunc(oldVal)
 | 
							newVal, err := replacer.ReplaceFunc(oldVal)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		newVector.Set(i, newVal)
 | 
							newVector.Set(i, newVal)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	field.Vector = newVector
 | 
						field.vector = newVector
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										386
									
								
								vendor/github.com/grafana/grafana-plugin-sdk-go/data/time_series.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							
							
						
						
									
										386
									
								
								vendor/github.com/grafana/grafana-plugin-sdk-go/data/time_series.go
								
								
									generated
								
								
									vendored
								
								
									Normal file
								
							| 
						 | 
					@ -0,0 +1,386 @@
 | 
				
			||||||
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TimeSeriesType represents the type of time series the schema can be treated as (if any).
 | 
				
			||||||
 | 
					type TimeSeriesType int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: Create and link to Grafana documentation on Long vs Wide
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// TimeSeriesTypeNot means this Frame is not a valid time series. This means it lacks at least
 | 
				
			||||||
 | 
						// one of a time Field and another (value) Field.
 | 
				
			||||||
 | 
						TimeSeriesTypeNot TimeSeriesType = iota
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TimeSeriesTypeLong means this Frame can be treated as a "Long" time series.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// A Long series has one or more string Fields, disregards Labels on Fields, and generally
 | 
				
			||||||
 | 
						// repeated time values in the time index.
 | 
				
			||||||
 | 
						TimeSeriesTypeLong
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TimeSeriesTypeWide means this Frame can be treated as a "Wide" time series.
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// A Wide series has no string fields, should not have repeated time values, and generally
 | 
				
			||||||
 | 
						// uses labels.
 | 
				
			||||||
 | 
						TimeSeriesTypeWide
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (t TimeSeriesType) String() string {
 | 
				
			||||||
 | 
						switch t {
 | 
				
			||||||
 | 
						case TimeSeriesTypeLong:
 | 
				
			||||||
 | 
							return "long"
 | 
				
			||||||
 | 
						case TimeSeriesTypeWide:
 | 
				
			||||||
 | 
							return "wide"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return "not"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TimeSeriesSchema returns the TimeSeriesSchema of the frame. The TimeSeriesSchema's Type
 | 
				
			||||||
 | 
					// value will be TimeSeriesNot if it is not a time series.
 | 
				
			||||||
 | 
					func (f *Frame) TimeSeriesSchema() (tsSchema TimeSeriesSchema) {
 | 
				
			||||||
 | 
						tsSchema.Type = TimeSeriesTypeNot
 | 
				
			||||||
 | 
						if f.Fields == nil || len(f.Fields) == 0 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nonValueIndices := make(map[int]struct{})
 | 
				
			||||||
 | 
						timeIndices := f.TypeIndices(FieldTypeTime, FieldTypeNullableTime)
 | 
				
			||||||
 | 
						if len(timeIndices) == 0 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						tsSchema.TimeIndex = timeIndices[0]
 | 
				
			||||||
 | 
						nonValueIndices[tsSchema.TimeIndex] = struct{}{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tsSchema.TimeIsNullable = f.Fields[tsSchema.TimeIndex].Nullable()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						tsSchema.FactorIndices = f.TypeIndices(FieldTypeString, FieldTypeNullableString)
 | 
				
			||||||
 | 
						for _, factorIdx := range tsSchema.FactorIndices {
 | 
				
			||||||
 | 
							nonValueIndices[factorIdx] = struct{}{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := range f.Fields {
 | 
				
			||||||
 | 
							if _, ok := nonValueIndices[i]; ok {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							tsSchema.ValueIndices = append(tsSchema.ValueIndices, i)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(tsSchema.ValueIndices) == 0 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(tsSchema.FactorIndices) == 0 {
 | 
				
			||||||
 | 
							tsSchema.Type = TimeSeriesTypeWide
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						tsSchema.Type = TimeSeriesTypeLong
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LongToWide converts a Long formated time series Frame to a Wide format (see TimeSeriesType for descriptions).
 | 
				
			||||||
 | 
					// The first Field of type time.Time or *time.Time will be the time index for the series,
 | 
				
			||||||
 | 
					// and will be the first field of the outputted longFrame.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// During conversion: String Fields in the longFrame become Labels on the Fields of wideFrame. The name of each string Field becomes a label key, and the values of that Field become label values.
 | 
				
			||||||
 | 
					// Each unique combination of value Fields and set of Label key/values become a Field of longFrame.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Additionally, if the time index is a *time.Time field, it will become time.Time Field. If a *string Field has nil values, they are equivalent to "" when converted into labels.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// An error is returned if any of the following are true:
 | 
				
			||||||
 | 
					// The input frame is not a long formated time series frame.
 | 
				
			||||||
 | 
					// The input frame's Fields are of length 0.
 | 
				
			||||||
 | 
					// The time index is not sorted ascending by time.
 | 
				
			||||||
 | 
					// The time index has null values.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// With a conversion of Long to Wide, and then back to Long via WideToLong(), the outputted Long Frame
 | 
				
			||||||
 | 
					// may not match the original inputted Long frame.
 | 
				
			||||||
 | 
					func LongToWide(longFrame *Frame) (*Frame, error) {
 | 
				
			||||||
 | 
						tsSchema := longFrame.TimeSeriesSchema()
 | 
				
			||||||
 | 
						if tsSchema.Type != TimeSeriesTypeLong {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("can not convert to wide series, expected long format series input but got %s series", tsSchema.Type)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						longLen, err := longFrame.RowLen()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						} else if longLen == 0 {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("can not convert to wide series, input fields have no rows")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wideFrame := NewFrame(longFrame.Name, NewField(longFrame.Fields[tsSchema.TimeIndex].Name, nil, []time.Time{}))
 | 
				
			||||||
 | 
						wideFrameRowCounter := 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						seenFactors := map[string]struct{}{}                      // seen factor combinations
 | 
				
			||||||
 | 
						valueFactorToWideFieldIdx := make(map[int]map[string]int) // value field idx and factors key -> fieldIdx of longFrame (for insertion)
 | 
				
			||||||
 | 
						for _, i := range tsSchema.ValueIndices {                 // initialize nested maps
 | 
				
			||||||
 | 
							valueFactorToWideFieldIdx[i] = make(map[string]int)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						timeAt := func(idx int) (time.Time, error) { // get time.Time regardless if pointer
 | 
				
			||||||
 | 
							val, ok := longFrame.ConcreteAt(tsSchema.TimeIndex, idx)
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return time.Time{}, fmt.Errorf("can not convert to wide series, input has null time values")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return val.(time.Time), nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						lastTime, err := timeAt(0) // set initial time value
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						wideFrame.Fields[0].Append(lastTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for longRowIdx := 0; longRowIdx < longLen; longRowIdx++ { // loop over each row of longFrame
 | 
				
			||||||
 | 
							currentTime, err := timeAt(longRowIdx)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if currentTime.After(lastTime) { // time advance means new row in wideFrame
 | 
				
			||||||
 | 
								wideFrameRowCounter++
 | 
				
			||||||
 | 
								lastTime = currentTime
 | 
				
			||||||
 | 
								for _, field := range wideFrame.Fields {
 | 
				
			||||||
 | 
									// extend all wideFrame Field Vectors for new row. If no value found, it will have zero value
 | 
				
			||||||
 | 
									field.Extend(1)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								wideFrame.Set(0, wideFrameRowCounter, currentTime)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if currentTime.Before(lastTime) {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("long series must be sorted ascending by time to be converted")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sliceKey := make(tupleLabels, len(tsSchema.FactorIndices)) // factor columns idx:value tuples (used for lookup)
 | 
				
			||||||
 | 
							namedKey := make(tupleLabels, len(tsSchema.FactorIndices)) // factor columns name:value tuples (used for labels)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// build labels
 | 
				
			||||||
 | 
							for i, factorLongFieldIdx := range tsSchema.FactorIndices {
 | 
				
			||||||
 | 
								val, _ := longFrame.ConcreteAt(factorLongFieldIdx, longRowIdx)
 | 
				
			||||||
 | 
								sliceKey[i] = tupleLabel{strconv.FormatInt(int64(factorLongFieldIdx), 10), val.(string)}
 | 
				
			||||||
 | 
								namedKey[i] = tupleLabel{longFrame.Fields[factorLongFieldIdx].Name, val.(string)}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							factorKey, err := sliceKey.MapKey()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// make new Fields as new factor combinations are found
 | 
				
			||||||
 | 
							if _, ok := seenFactors[factorKey]; !ok {
 | 
				
			||||||
 | 
								currentFieldLen := len(wideFrame.Fields) // first index for the set of factors.
 | 
				
			||||||
 | 
								seenFactors[factorKey] = struct{}{}
 | 
				
			||||||
 | 
								for offset, longFieldIdx := range tsSchema.ValueIndices {
 | 
				
			||||||
 | 
									// a new Field is created for each value Field from inFrame
 | 
				
			||||||
 | 
									labels, err := tupleLablesToLabels(namedKey)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										return nil, err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									longField := longFrame.Fields[tsSchema.ValueIndices[offset]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									newWideField := NewFieldFromFieldType(longField.Type(), wideFrameRowCounter+1)
 | 
				
			||||||
 | 
									newWideField.Name, newWideField.Labels = longField.Name, labels
 | 
				
			||||||
 | 
									wideFrame.Fields = append(wideFrame.Fields, newWideField)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									valueFactorToWideFieldIdx[longFieldIdx][factorKey] = currentFieldLen + offset
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, longFieldIdx := range tsSchema.ValueIndices {
 | 
				
			||||||
 | 
								wideFieldIdx := valueFactorToWideFieldIdx[longFieldIdx][factorKey]
 | 
				
			||||||
 | 
								wideFrame.Set(wideFieldIdx, wideFrameRowCounter, longFrame.CopyAt(longFieldIdx, longRowIdx))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return wideFrame, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WideToLong converts a Wide formated time series Frame to a Long formated time series Frame (see TimeSeriesType for descriptions). The first Field of type time.Time or *time.Time in wideFrame will be the time index for the series, and will be the first field of the outputted wideFrame.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// During conversion: All the unique keys in all of the Labels across the Fields of wideFrame become string
 | 
				
			||||||
 | 
					// Fields with the corresponding name in longFrame. The corresponding Labels values become values in those Fields of longFrame.
 | 
				
			||||||
 | 
					// For each unique non-timeIndex Field across the Fields of wideFrame (value fields), a Field of the same type is created in longFrame.
 | 
				
			||||||
 | 
					// For each unique set of Labels across the Fields of wideFrame, a row is added to longFrame, and then
 | 
				
			||||||
 | 
					// for each unique value Field, the corresponding value Field of longFrame is set.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// An error is returned if any of the following are true:
 | 
				
			||||||
 | 
					// The input frame is not a wide formated time series frame.
 | 
				
			||||||
 | 
					// The input row has no rows.
 | 
				
			||||||
 | 
					// The time index not sorted ascending by time.
 | 
				
			||||||
 | 
					// The time index has null values.
 | 
				
			||||||
 | 
					// Two numeric Fields have the same name but different types.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// With a conversion of Wide to Long, and then back to Wide via LongToWide(), the outputted Wide Frame
 | 
				
			||||||
 | 
					// may not match the original inputted Wide frame.
 | 
				
			||||||
 | 
					func WideToLong(wideFrame *Frame) (*Frame, error) {
 | 
				
			||||||
 | 
						tsSchema := wideFrame.TimeSeriesSchema()
 | 
				
			||||||
 | 
						if tsSchema.Type != TimeSeriesTypeWide {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("can not convert to long series, expected wide format series input but got %s series", tsSchema.Type)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wideLen, err := wideFrame.RowLen()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						} else if wideLen == 0 {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("can not convert to long series, input fields have no rows")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uniqueValueNames := []string{}                       // unique names of Fields that are value types
 | 
				
			||||||
 | 
						uniqueValueNamesToType := make(map[string]FieldType) // unique value Field names to Field type
 | 
				
			||||||
 | 
						uniqueLabelKeys := make(map[string]struct{})         // unique Label keys, used to build schema
 | 
				
			||||||
 | 
						labelKeyToWideIndices := make(map[string][]int)      // unique label sets to corresponding Field indices of wideFrame
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Gather schema information from wideFrame required to build longFrame
 | 
				
			||||||
 | 
						for _, vIdx := range tsSchema.ValueIndices {
 | 
				
			||||||
 | 
							wideField := wideFrame.Fields[vIdx]
 | 
				
			||||||
 | 
							if pType, ok := uniqueValueNamesToType[wideField.Name]; ok {
 | 
				
			||||||
 | 
								if wideField.Type() != pType {
 | 
				
			||||||
 | 
									return nil, fmt.Errorf("two fields in input frame may not have the same name but different types, field name %s has type %s but also type %s and field idx %v", wideField.Name, pType, wideField.Type(), vIdx)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								uniqueValueNamesToType[wideField.Name] = wideField.Type()
 | 
				
			||||||
 | 
								uniqueValueNames = append(uniqueValueNames, wideField.Name)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							tKey, err := labelsTupleKey(wideField.Labels) // labels to a string, so it can be a map key
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							labelKeyToWideIndices[tKey] = append(labelKeyToWideIndices[tKey], vIdx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for k := range wideField.Labels {
 | 
				
			||||||
 | 
								uniqueLabelKeys[k] = struct{}{}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Sort things for more deterministic output
 | 
				
			||||||
 | 
						sort.Strings(uniqueValueNames)
 | 
				
			||||||
 | 
						sortedUniqueLabelKeys := []string{}
 | 
				
			||||||
 | 
						for k := range labelKeyToWideIndices {
 | 
				
			||||||
 | 
							sortedUniqueLabelKeys = append(sortedUniqueLabelKeys, k)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sort.Strings(sortedUniqueLabelKeys)
 | 
				
			||||||
 | 
						uniqueFactorNames := make([]string, 0, len(uniqueLabelKeys))
 | 
				
			||||||
 | 
						for k := range uniqueLabelKeys {
 | 
				
			||||||
 | 
							uniqueFactorNames = append(uniqueFactorNames, k)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sort.Strings(uniqueFactorNames)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// build new Frame with new schema
 | 
				
			||||||
 | 
						longFrame := NewFrame(wideFrame.Name, // time, value fields..., factor fields (strings)...
 | 
				
			||||||
 | 
							NewField(wideFrame.Fields[tsSchema.TimeIndex].Name, nil, []time.Time{})) // time field is first field
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i := 1
 | 
				
			||||||
 | 
						valueNameToLongFieldIdx := map[string]int{} // valueName -> field index of longFrame
 | 
				
			||||||
 | 
						for _, name := range uniqueValueNames {
 | 
				
			||||||
 | 
							newWideField := NewFieldFromFieldType(uniqueValueNamesToType[name], 0) // create value Fields
 | 
				
			||||||
 | 
							newWideField.Name = name
 | 
				
			||||||
 | 
							longFrame.Fields = append(longFrame.Fields, newWideField)
 | 
				
			||||||
 | 
							valueNameToLongFieldIdx[name] = i
 | 
				
			||||||
 | 
							i++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						factorNameToLongFieldIdx := map[string]int{} // label Key -> field index for label value of longFrame
 | 
				
			||||||
 | 
						for _, name := range uniqueFactorNames {
 | 
				
			||||||
 | 
							longFrame.Fields = append(longFrame.Fields, NewField(name, nil, []string{})) // create factor fields
 | 
				
			||||||
 | 
							factorNameToLongFieldIdx[name] = i
 | 
				
			||||||
 | 
							i++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Populate data of longFrame from wideframe
 | 
				
			||||||
 | 
						longFrameCounter := 0
 | 
				
			||||||
 | 
						for wideRowIdx := 0; wideRowIdx < wideLen; wideRowIdx++ { // loop over each row of wideFrame
 | 
				
			||||||
 | 
							time, ok := wideFrame.ConcreteAt(tsSchema.TimeIndex, wideRowIdx)
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("time may not have nil values")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, labelKey := range sortedUniqueLabelKeys {
 | 
				
			||||||
 | 
								longFrame.Extend(1) // grow each Fields's vector by 1
 | 
				
			||||||
 | 
								longFrame.Set(0, longFrameCounter, time)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for i, wideFieldIdx := range labelKeyToWideIndices[labelKey] {
 | 
				
			||||||
 | 
									wideField := wideFrame.Fields[wideFieldIdx]
 | 
				
			||||||
 | 
									if i == 0 {
 | 
				
			||||||
 | 
										for k, v := range wideField.Labels {
 | 
				
			||||||
 | 
											longFrame.Set(factorNameToLongFieldIdx[k], longFrameCounter, v)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									longValueFieldIdx := valueNameToLongFieldIdx[wideField.Name]
 | 
				
			||||||
 | 
									longFrame.Set(longValueFieldIdx, longFrameCounter, wideFrame.CopyAt(wideFieldIdx, wideRowIdx))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								longFrameCounter++
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return longFrame, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TimeSeriesSchema is information about a Frame's schema. It is populated from
 | 
				
			||||||
 | 
					// the Frame's TimeSeriesSchema() method.
 | 
				
			||||||
 | 
					type TimeSeriesSchema struct {
 | 
				
			||||||
 | 
						Type           TimeSeriesType // the type of series, as determinted by frame.TimeSeriesSchema()
 | 
				
			||||||
 | 
						TimeIndex      int            // Field index of the time series index
 | 
				
			||||||
 | 
						TimeIsNullable bool           // true if the time index is nullable (of *time.Time)
 | 
				
			||||||
 | 
						ValueIndices   []int          // Field indices of value columns (All fields excluding string fields and the time index)
 | 
				
			||||||
 | 
						FactorIndices  []int          // Field indices of string or *string Fields
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// tupleLables is an alternative representation of Labels (map[string]string) that can be sorted
 | 
				
			||||||
 | 
					// and then marshalled into a consistent string that can be used a map key. All tupleLabel objects
 | 
				
			||||||
 | 
					// in tupleLabels should have unique first elements (keys).
 | 
				
			||||||
 | 
					type tupleLabels []tupleLabel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// tupleLabel is an element of tupleLabels and should be in the form of [2]{"key", "value"}.
 | 
				
			||||||
 | 
					type tupleLabel [2]string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// tupleLabelsToLabels converts tupleLabels to Labels (map[string]string), erroring if there are duplicate keys.
 | 
				
			||||||
 | 
					func tupleLablesToLabels(tuples tupleLabels) (Labels, error) {
 | 
				
			||||||
 | 
						labels := make(map[string]string)
 | 
				
			||||||
 | 
						for _, tuple := range tuples {
 | 
				
			||||||
 | 
							if key, ok := labels[tuple[0]]; ok {
 | 
				
			||||||
 | 
								return nil, fmt.Errorf("duplicate key '%v' in lables: %v", key, tuples)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							labels[tuple[0]] = tuple[1]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return labels, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MapKey gets a string key that can be used as a map key.
 | 
				
			||||||
 | 
					func (t *tupleLabels) MapKey() (string, error) {
 | 
				
			||||||
 | 
						t.SortBtKey()
 | 
				
			||||||
 | 
						b, err := json.Marshal(t)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return string(b), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sort tupleLabels by each elements first property (key).
 | 
				
			||||||
 | 
					func (t *tupleLabels) SortBtKey() {
 | 
				
			||||||
 | 
						if t == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sort.Slice((*t)[:], func(i, j int) bool {
 | 
				
			||||||
 | 
							return (*t)[i][0] < (*t)[j][0]
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// labelsToTupleLabels converts Labels (map[string]string) to tupleLabels.
 | 
				
			||||||
 | 
					func labelsToTupleLabels(l Labels) tupleLabels {
 | 
				
			||||||
 | 
						t := make(tupleLabels, 0, len(l))
 | 
				
			||||||
 | 
						for k, v := range l {
 | 
				
			||||||
 | 
							t = append(t, tupleLabel{k, v})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						t.SortBtKey()
 | 
				
			||||||
 | 
						return t
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// labelsTupleKey gets a string key from Labels.
 | 
				
			||||||
 | 
					func labelsTupleKey(l Labels) (string, error) {
 | 
				
			||||||
 | 
						// sorts twice, meh.
 | 
				
			||||||
 | 
						t := labelsToTupleLabels(l)
 | 
				
			||||||
 | 
						return t.MapKey()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
// Any changes will be lost if this file is regenerated.
 | 
					// Any changes will be lost if this file is regenerated.
 | 
				
			||||||
// see https://github.com/cheekybits/genny
 | 
					// see https://github.com/cheekybits/genny
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package dataframe
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "time"
 | 
					import "time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,8 +35,18 @@ func (v *uint8Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint8Vector) PrimitiveType() VectorPType {
 | 
					func (v *uint8Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g uint8
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint8Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint8Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint8Vector) Extend(i int) {
 | 
					func (v *uint8Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -72,8 +82,18 @@ func (v *uint16Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint16Vector) PrimitiveType() VectorPType {
 | 
					func (v *uint16Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g uint16
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint16Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint16Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint16Vector) Extend(i int) {
 | 
					func (v *uint16Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -109,8 +129,18 @@ func (v *uint32Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint32Vector) PrimitiveType() VectorPType {
 | 
					func (v *uint32Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g uint32
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint32Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint32Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint32Vector) Extend(i int) {
 | 
					func (v *uint32Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -146,8 +176,18 @@ func (v *uint64Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint64Vector) PrimitiveType() VectorPType {
 | 
					func (v *uint64Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g uint64
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint64Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *uint64Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *uint64Vector) Extend(i int) {
 | 
					func (v *uint64Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -183,8 +223,18 @@ func (v *int8Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int8Vector) PrimitiveType() VectorPType {
 | 
					func (v *int8Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g int8
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int8Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int8Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int8Vector) Extend(i int) {
 | 
					func (v *int8Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -220,8 +270,18 @@ func (v *int16Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int16Vector) PrimitiveType() VectorPType {
 | 
					func (v *int16Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g int16
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int16Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int16Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int16Vector) Extend(i int) {
 | 
					func (v *int16Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -257,8 +317,18 @@ func (v *int32Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int32Vector) PrimitiveType() VectorPType {
 | 
					func (v *int32Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g int32
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int32Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int32Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int32Vector) Extend(i int) {
 | 
					func (v *int32Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -294,8 +364,18 @@ func (v *int64Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int64Vector) PrimitiveType() VectorPType {
 | 
					func (v *int64Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g int64
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int64Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *int64Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *int64Vector) Extend(i int) {
 | 
					func (v *int64Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -331,8 +411,18 @@ func (v *float32Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *float32Vector) PrimitiveType() VectorPType {
 | 
					func (v *float32Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g float32
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *float32Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *float32Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *float32Vector) Extend(i int) {
 | 
					func (v *float32Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -368,8 +458,18 @@ func (v *float64Vector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *float64Vector) PrimitiveType() VectorPType {
 | 
					func (v *float64Vector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g float64
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *float64Vector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *float64Vector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *float64Vector) Extend(i int) {
 | 
					func (v *float64Vector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -405,8 +505,18 @@ func (v *stringVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *stringVector) PrimitiveType() VectorPType {
 | 
					func (v *stringVector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g string
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *stringVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *stringVector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *stringVector) Extend(i int) {
 | 
					func (v *stringVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -442,8 +552,18 @@ func (v *boolVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *boolVector) PrimitiveType() VectorPType {
 | 
					func (v *boolVector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g bool
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *boolVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *boolVector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *boolVector) Extend(i int) {
 | 
					func (v *boolVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -479,8 +599,18 @@ func (v *timeTimeVector) Len() int {
 | 
				
			||||||
	return len((*v))
 | 
						return len((*v))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *timeTimeVector) PrimitiveType() VectorPType {
 | 
					func (v *timeTimeVector) CopyAt(i int) interface{} {
 | 
				
			||||||
	return vectorPType(v)
 | 
						var g time.Time
 | 
				
			||||||
 | 
						g = (*v)[i]
 | 
				
			||||||
 | 
						return g
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *timeTimeVector) ConcreteAt(i int) (interface{}, bool) {
 | 
				
			||||||
 | 
						return v.At(i), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (v *timeTimeVector) Type() FieldType {
 | 
				
			||||||
 | 
						return vectorFieldType(v)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *timeTimeVector) Extend(i int) {
 | 
					func (v *timeTimeVector) Extend(i int) {
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,559 @@
 | 
				
			||||||
 | 
					package data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// vector represents a Field's collection of Elements.
 | 
				
			||||||
 | 
					type vector interface {
 | 
				
			||||||
 | 
						Set(idx int, i interface{})
 | 
				
			||||||
 | 
						Append(i interface{})
 | 
				
			||||||
 | 
						Extend(i int)
 | 
				
			||||||
 | 
						At(i int) interface{}
 | 
				
			||||||
 | 
						Len() int
 | 
				
			||||||
 | 
						Type() FieldType
 | 
				
			||||||
 | 
						PointerAt(i int) interface{}
 | 
				
			||||||
 | 
						CopyAt(i int) interface{}
 | 
				
			||||||
 | 
						ConcreteAt(i int) (val interface{}, ok bool)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newVector(t interface{}, n int) (v vector) {
 | 
				
			||||||
 | 
						switch t.(type) {
 | 
				
			||||||
 | 
						// ints
 | 
				
			||||||
 | 
						case []int8:
 | 
				
			||||||
 | 
							v = newInt8Vector(n)
 | 
				
			||||||
 | 
						case []*int8:
 | 
				
			||||||
 | 
							v = newNullableInt8Vector(n)
 | 
				
			||||||
 | 
						case []int16:
 | 
				
			||||||
 | 
							v = newInt16Vector(n)
 | 
				
			||||||
 | 
						case []*int16:
 | 
				
			||||||
 | 
							v = newNullableInt16Vector(n)
 | 
				
			||||||
 | 
						case []int32:
 | 
				
			||||||
 | 
							v = newInt32Vector(n)
 | 
				
			||||||
 | 
						case []*int32:
 | 
				
			||||||
 | 
							v = newNullableInt32Vector(n)
 | 
				
			||||||
 | 
						case []int64:
 | 
				
			||||||
 | 
							v = newInt64Vector(n)
 | 
				
			||||||
 | 
						case []*int64:
 | 
				
			||||||
 | 
							v = newNullableInt64Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// uints
 | 
				
			||||||
 | 
						case []uint8:
 | 
				
			||||||
 | 
							v = newUint8Vector(n)
 | 
				
			||||||
 | 
						case []*uint8:
 | 
				
			||||||
 | 
							v = newNullableUint8Vector(n)
 | 
				
			||||||
 | 
						case []uint16:
 | 
				
			||||||
 | 
							v = newUint16Vector(n)
 | 
				
			||||||
 | 
						case []*uint16:
 | 
				
			||||||
 | 
							v = newNullableUint16Vector(n)
 | 
				
			||||||
 | 
						case []uint32:
 | 
				
			||||||
 | 
							v = newUint32Vector(n)
 | 
				
			||||||
 | 
						case []*uint32:
 | 
				
			||||||
 | 
							v = newNullableUint32Vector(n)
 | 
				
			||||||
 | 
						case []uint64:
 | 
				
			||||||
 | 
							v = newUint64Vector(n)
 | 
				
			||||||
 | 
						case []*uint64:
 | 
				
			||||||
 | 
							v = newNullableUint64Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// floats
 | 
				
			||||||
 | 
						case []float32:
 | 
				
			||||||
 | 
							v = newFloat32Vector(n)
 | 
				
			||||||
 | 
						case []*float32:
 | 
				
			||||||
 | 
							v = newNullableFloat32Vector(n)
 | 
				
			||||||
 | 
						case []float64:
 | 
				
			||||||
 | 
							v = newFloat64Vector(n)
 | 
				
			||||||
 | 
						case []*float64:
 | 
				
			||||||
 | 
							v = newNullableFloat64Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case []string:
 | 
				
			||||||
 | 
							v = newStringVector(n)
 | 
				
			||||||
 | 
						case []*string:
 | 
				
			||||||
 | 
							v = newNullableStringVector(n)
 | 
				
			||||||
 | 
						case []bool:
 | 
				
			||||||
 | 
							v = newBoolVector(n)
 | 
				
			||||||
 | 
						case []*bool:
 | 
				
			||||||
 | 
							v = newNullableBoolVector(n)
 | 
				
			||||||
 | 
						case []time.Time:
 | 
				
			||||||
 | 
							v = newTimeTimeVector(n)
 | 
				
			||||||
 | 
						case []*time.Time:
 | 
				
			||||||
 | 
							v = newNullableTimeTimeVector(n)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic(fmt.Sprintf("unsupported vector type of %T", t))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidFieldType returns if a primitive slice is a valid supported Field type.
 | 
				
			||||||
 | 
					func ValidFieldType(t interface{}) bool {
 | 
				
			||||||
 | 
						switch t.(type) {
 | 
				
			||||||
 | 
						// ints
 | 
				
			||||||
 | 
						case []int8:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*int8:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []int16:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*int16:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []int32:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*int32:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []int64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*int64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// uints
 | 
				
			||||||
 | 
						case []uint8:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*uint8:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []uint16:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*uint16:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []uint32:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*uint32:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []uint64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*uint64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// floats
 | 
				
			||||||
 | 
						case []float32:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*float32:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []float64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*float64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case []string:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*string:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []bool:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*bool:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []time.Time:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						case []*time.Time:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FieldType indicates the Go type underlying the Field.
 | 
				
			||||||
 | 
					type FieldType int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// FieldTypeInt8 indicates the underlying primitive is a []int8.
 | 
				
			||||||
 | 
						FieldTypeInt8 FieldType = iota
 | 
				
			||||||
 | 
						// FieldTypeNullableInt8 indicates the underlying primitive is a []*int8.
 | 
				
			||||||
 | 
						FieldTypeNullableInt8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeInt16 indicates the underlying primitive is a []Int16.
 | 
				
			||||||
 | 
						FieldTypeInt16
 | 
				
			||||||
 | 
						// FieldTypeNullableInt16 indicates the underlying primitive is a []*Int16.
 | 
				
			||||||
 | 
						FieldTypeNullableInt16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeInt32 indicates the underlying primitive is a []int32.
 | 
				
			||||||
 | 
						FieldTypeInt32
 | 
				
			||||||
 | 
						// FieldTypeNullableInt32 indicates the underlying primitive is a []*int32.
 | 
				
			||||||
 | 
						FieldTypeNullableInt32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeInt64 indicates the underlying primitive is a []int64.
 | 
				
			||||||
 | 
						FieldTypeInt64
 | 
				
			||||||
 | 
						// FieldTypeNullableInt64 indicates the underlying primitive is a []*int64.
 | 
				
			||||||
 | 
						FieldTypeNullableInt64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeUint8 indicates the underlying primitive is a []int8.
 | 
				
			||||||
 | 
						FieldTypeUint8
 | 
				
			||||||
 | 
						// FieldTypeNullableUint8 indicates the underlying primitive is a []*int8.
 | 
				
			||||||
 | 
						FieldTypeNullableUint8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeUint16 indicates the underlying primitive is a []uint16.
 | 
				
			||||||
 | 
						FieldTypeUint16
 | 
				
			||||||
 | 
						// FieldTypeNullableUint16 indicates the underlying primitive is a []*uint16.
 | 
				
			||||||
 | 
						FieldTypeNullableUint16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeUint32 indicates the underlying primitive is a []uint32.
 | 
				
			||||||
 | 
						FieldTypeUint32
 | 
				
			||||||
 | 
						// FieldTypeNullableUint32 indicates the underlying primitive is a []*uint32.
 | 
				
			||||||
 | 
						FieldTypeNullableUint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeUint64 indicates the underlying primitive is a []uint64.
 | 
				
			||||||
 | 
						FieldTypeUint64
 | 
				
			||||||
 | 
						// FieldTypeNullableUint64 indicates the underlying primitive is a []*uint64.
 | 
				
			||||||
 | 
						FieldTypeNullableUint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeFloat32 indicates the underlying primitive is a []float32.
 | 
				
			||||||
 | 
						FieldTypeFloat32
 | 
				
			||||||
 | 
						// FieldTypeNullableFloat32 indicates the underlying primitive is a []*float32.
 | 
				
			||||||
 | 
						FieldTypeNullableFloat32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeFloat64 indicates the underlying primitive is a []float64.
 | 
				
			||||||
 | 
						FieldTypeFloat64
 | 
				
			||||||
 | 
						// FieldTypeNullableFloat64 indicates the underlying primitive is a []*float64.
 | 
				
			||||||
 | 
						FieldTypeNullableFloat64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeString indicates the underlying primitive is a []string.
 | 
				
			||||||
 | 
						FieldTypeString
 | 
				
			||||||
 | 
						// FieldTypeNullableString indicates the underlying primitive is a []*string.
 | 
				
			||||||
 | 
						FieldTypeNullableString
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeBool indicates the underlying primitive is a []bool.
 | 
				
			||||||
 | 
						FieldTypeBool
 | 
				
			||||||
 | 
						// FieldTypeNullableBool indicates the underlying primitive is a []*bool.
 | 
				
			||||||
 | 
						FieldTypeNullableBool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FieldTypeTime indicates the underlying primitive is a []time.Time.
 | 
				
			||||||
 | 
						FieldTypeTime
 | 
				
			||||||
 | 
						// FieldTypeNullableTime indicates the underlying primitive is a []*time.Time.
 | 
				
			||||||
 | 
						FieldTypeNullableTime
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func vectorFieldType(v vector) FieldType {
 | 
				
			||||||
 | 
						switch v.(type) {
 | 
				
			||||||
 | 
						case *int8Vector:
 | 
				
			||||||
 | 
							return FieldTypeInt8
 | 
				
			||||||
 | 
						case *nullableInt8Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *int16Vector:
 | 
				
			||||||
 | 
							return FieldTypeInt16
 | 
				
			||||||
 | 
						case *nullableInt16Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *int32Vector:
 | 
				
			||||||
 | 
							return FieldTypeInt32
 | 
				
			||||||
 | 
						case *nullableInt32Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *int64Vector:
 | 
				
			||||||
 | 
							return FieldTypeInt64
 | 
				
			||||||
 | 
						case *nullableInt64Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *uint8Vector:
 | 
				
			||||||
 | 
							return FieldTypeUint8
 | 
				
			||||||
 | 
						case *nullableUint8Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *uint16Vector:
 | 
				
			||||||
 | 
							return FieldTypeUint16
 | 
				
			||||||
 | 
						case *nullableUint16Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *uint32Vector:
 | 
				
			||||||
 | 
							return FieldTypeUint32
 | 
				
			||||||
 | 
						case *nullableUint32Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *uint64Vector:
 | 
				
			||||||
 | 
							return FieldTypeUint64
 | 
				
			||||||
 | 
						case *nullableUint64Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *float32Vector:
 | 
				
			||||||
 | 
							return FieldTypeFloat32
 | 
				
			||||||
 | 
						case *nullableFloat32Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableFloat32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *float64Vector:
 | 
				
			||||||
 | 
							return FieldTypeFloat64
 | 
				
			||||||
 | 
						case *nullableFloat64Vector:
 | 
				
			||||||
 | 
							return FieldTypeNullableFloat64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *stringVector:
 | 
				
			||||||
 | 
							return FieldTypeString
 | 
				
			||||||
 | 
						case *nullableStringVector:
 | 
				
			||||||
 | 
							return FieldTypeNullableString
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *boolVector:
 | 
				
			||||||
 | 
							return FieldTypeBool
 | 
				
			||||||
 | 
						case *nullableBoolVector:
 | 
				
			||||||
 | 
							return FieldTypeNullableBool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case *timeTimeVector:
 | 
				
			||||||
 | 
							return FieldTypeTime
 | 
				
			||||||
 | 
						case *nullableTimeTimeVector:
 | 
				
			||||||
 | 
							return FieldTypeNullableTime
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return FieldType(-1)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func fieldTypeFromVal(v interface{}) FieldType {
 | 
				
			||||||
 | 
						switch v.(type) {
 | 
				
			||||||
 | 
						case int8:
 | 
				
			||||||
 | 
							return FieldTypeInt8
 | 
				
			||||||
 | 
						case *int8:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case int16:
 | 
				
			||||||
 | 
							return FieldTypeInt16
 | 
				
			||||||
 | 
						case *int16:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case int32:
 | 
				
			||||||
 | 
							return FieldTypeInt32
 | 
				
			||||||
 | 
						case *int32:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case int64:
 | 
				
			||||||
 | 
							return FieldTypeInt64
 | 
				
			||||||
 | 
						case *int64:
 | 
				
			||||||
 | 
							return FieldTypeNullableInt64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case uint8:
 | 
				
			||||||
 | 
							return FieldTypeUint8
 | 
				
			||||||
 | 
						case *uint8:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case uint16:
 | 
				
			||||||
 | 
							return FieldTypeUint16
 | 
				
			||||||
 | 
						case *uint16:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case uint32:
 | 
				
			||||||
 | 
							return FieldTypeUint32
 | 
				
			||||||
 | 
						case *uint32:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case uint64:
 | 
				
			||||||
 | 
							return FieldTypeUint64
 | 
				
			||||||
 | 
						case *uint64:
 | 
				
			||||||
 | 
							return FieldTypeNullableUint64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case float32:
 | 
				
			||||||
 | 
							return FieldTypeFloat32
 | 
				
			||||||
 | 
						case *float32:
 | 
				
			||||||
 | 
							return FieldTypeNullableFloat32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case float64:
 | 
				
			||||||
 | 
							return FieldTypeFloat64
 | 
				
			||||||
 | 
						case *float64:
 | 
				
			||||||
 | 
							return FieldTypeNullableFloat64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case string:
 | 
				
			||||||
 | 
							return FieldTypeString
 | 
				
			||||||
 | 
						case *string:
 | 
				
			||||||
 | 
							return FieldTypeNullableString
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case bool:
 | 
				
			||||||
 | 
							return FieldTypeBool
 | 
				
			||||||
 | 
						case *bool:
 | 
				
			||||||
 | 
							return FieldTypeNullableBool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case time.Time:
 | 
				
			||||||
 | 
							return FieldTypeTime
 | 
				
			||||||
 | 
						case *time.Time:
 | 
				
			||||||
 | 
							return FieldTypeNullableTime
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return FieldType(-1)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (p FieldType) String() string {
 | 
				
			||||||
 | 
						if p < 0 {
 | 
				
			||||||
 | 
							return "invalid/unsupported"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fmt.Sprintf("[]%v", p.ItemTypeString())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewFieldFromFieldType creates a new Field of the given pType of length n.
 | 
				
			||||||
 | 
					func NewFieldFromFieldType(p FieldType, n int) *Field {
 | 
				
			||||||
 | 
						f := &Field{}
 | 
				
			||||||
 | 
						switch p {
 | 
				
			||||||
 | 
						// ints
 | 
				
			||||||
 | 
						case FieldTypeInt8:
 | 
				
			||||||
 | 
							f.vector = newInt8Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableInt8:
 | 
				
			||||||
 | 
							f.vector = newNullableInt8Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeInt16:
 | 
				
			||||||
 | 
							f.vector = newInt16Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableInt16:
 | 
				
			||||||
 | 
							f.vector = newNullableInt16Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeInt32:
 | 
				
			||||||
 | 
							f.vector = newInt32Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableInt32:
 | 
				
			||||||
 | 
							f.vector = newNullableInt32Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeInt64:
 | 
				
			||||||
 | 
							f.vector = newInt64Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableInt64:
 | 
				
			||||||
 | 
							f.vector = newNullableInt64Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// uints
 | 
				
			||||||
 | 
						case FieldTypeUint8:
 | 
				
			||||||
 | 
							f.vector = newUint8Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableUint8:
 | 
				
			||||||
 | 
							f.vector = newNullableUint8Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint16:
 | 
				
			||||||
 | 
							f.vector = newUint16Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableUint16:
 | 
				
			||||||
 | 
							f.vector = newNullableUint16Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint32:
 | 
				
			||||||
 | 
							f.vector = newUint32Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableUint32:
 | 
				
			||||||
 | 
							f.vector = newNullableUint32Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint64:
 | 
				
			||||||
 | 
							f.vector = newUint64Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableUint64:
 | 
				
			||||||
 | 
							f.vector = newNullableUint64Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// floats
 | 
				
			||||||
 | 
						case FieldTypeFloat32:
 | 
				
			||||||
 | 
							f.vector = newFloat32Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableFloat32:
 | 
				
			||||||
 | 
							f.vector = newNullableFloat32Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeFloat64:
 | 
				
			||||||
 | 
							f.vector = newFloat64Vector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableFloat64:
 | 
				
			||||||
 | 
							f.vector = newNullableFloat64Vector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// other
 | 
				
			||||||
 | 
						case FieldTypeString:
 | 
				
			||||||
 | 
							f.vector = newStringVector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableString:
 | 
				
			||||||
 | 
							f.vector = newNullableStringVector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeBool:
 | 
				
			||||||
 | 
							f.vector = newBoolVector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableBool:
 | 
				
			||||||
 | 
							f.vector = newNullableBoolVector(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeTime:
 | 
				
			||||||
 | 
							f.vector = newTimeTimeVector(n)
 | 
				
			||||||
 | 
						case FieldTypeNullableTime:
 | 
				
			||||||
 | 
							f.vector = newNullableTimeTimeVector(n)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic(fmt.Sprint("unsupported vector ptype"))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return f
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ItemTypeString returns the string representation of the type of element within in the vector
 | 
				
			||||||
 | 
					func (p FieldType) ItemTypeString() string {
 | 
				
			||||||
 | 
						switch p {
 | 
				
			||||||
 | 
						case FieldTypeInt8:
 | 
				
			||||||
 | 
							return "int8"
 | 
				
			||||||
 | 
						case FieldTypeNullableInt8:
 | 
				
			||||||
 | 
							return "*int8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeInt16:
 | 
				
			||||||
 | 
							return "int16"
 | 
				
			||||||
 | 
						case FieldTypeNullableInt16:
 | 
				
			||||||
 | 
							return "*int16"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeInt32:
 | 
				
			||||||
 | 
							return "int32"
 | 
				
			||||||
 | 
						case FieldTypeNullableInt32:
 | 
				
			||||||
 | 
							return "*int32"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeInt64:
 | 
				
			||||||
 | 
							return "int64"
 | 
				
			||||||
 | 
						case FieldTypeNullableInt64:
 | 
				
			||||||
 | 
							return "*int64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint8:
 | 
				
			||||||
 | 
							return "unit8"
 | 
				
			||||||
 | 
						case FieldTypeNullableUint8:
 | 
				
			||||||
 | 
							return "*uint8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint16:
 | 
				
			||||||
 | 
							return "uint16"
 | 
				
			||||||
 | 
						case FieldTypeNullableUint16:
 | 
				
			||||||
 | 
							return "*uint16"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint32:
 | 
				
			||||||
 | 
							return "uint32"
 | 
				
			||||||
 | 
						case FieldTypeNullableUint32:
 | 
				
			||||||
 | 
							return "*uint32"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeUint64:
 | 
				
			||||||
 | 
							return "uint64"
 | 
				
			||||||
 | 
						case FieldTypeNullableUint64:
 | 
				
			||||||
 | 
							return "*uint64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeFloat32:
 | 
				
			||||||
 | 
							return "float32"
 | 
				
			||||||
 | 
						case FieldTypeNullableFloat32:
 | 
				
			||||||
 | 
							return "*float32"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeFloat64:
 | 
				
			||||||
 | 
							return "float64"
 | 
				
			||||||
 | 
						case FieldTypeNullableFloat64:
 | 
				
			||||||
 | 
							return "*float64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeString:
 | 
				
			||||||
 | 
							return "string"
 | 
				
			||||||
 | 
						case FieldTypeNullableString:
 | 
				
			||||||
 | 
							return "*string"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeBool:
 | 
				
			||||||
 | 
							return "bool"
 | 
				
			||||||
 | 
						case FieldTypeNullableBool:
 | 
				
			||||||
 | 
							return "*bool"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeTime:
 | 
				
			||||||
 | 
							return "time.Time"
 | 
				
			||||||
 | 
						case FieldTypeNullableTime:
 | 
				
			||||||
 | 
							return "*time.Time"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return "invalid/unsupported type"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Nullable returns if Field type is a nullable type
 | 
				
			||||||
 | 
					func (p FieldType) Nullable() bool {
 | 
				
			||||||
 | 
						switch p {
 | 
				
			||||||
 | 
						case FieldTypeNullableInt8, FieldTypeNullableInt16, FieldTypeNullableInt32, FieldTypeNullableInt64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeNullableUint8, FieldTypeNullableUint16, FieldTypeNullableUint32, FieldTypeNullableUint64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeNullableFloat32, FieldTypeNullableFloat64:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeNullableString:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeNullableBool:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case FieldTypeNullableTime:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// numericFieldTypes is an array of FieldTypes that are numeric.
 | 
				
			||||||
 | 
					var numericFieldTypes = [...]FieldType{
 | 
				
			||||||
 | 
						FieldTypeInt8, FieldTypeInt16, FieldTypeInt32, FieldTypeInt64,
 | 
				
			||||||
 | 
						FieldTypeNullableInt8, FieldTypeNullableInt16, FieldTypeNullableInt32, FieldTypeNullableInt64,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FieldTypeUint8, FieldTypeUint16, FieldTypeUint32, FieldTypeUint64,
 | 
				
			||||||
 | 
						FieldTypeNullableUint8, FieldTypeNullableUint16, FieldTypeNullableUint32, FieldTypeNullableUint64,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						FieldTypeFloat32, FieldTypeFloat64,
 | 
				
			||||||
 | 
						FieldTypeNullableFloat32, FieldTypeNullableFloat64}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NumericFieldTypes returns a slice of FieldTypes that are numeric.
 | 
				
			||||||
 | 
					func NumericFieldTypes() []FieldType {
 | 
				
			||||||
 | 
						return numericFieldTypes[:]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,465 +0,0 @@
 | 
				
			||||||
package dataframe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Vector represents a collection of Elements.
 | 
					 | 
				
			||||||
type Vector interface {
 | 
					 | 
				
			||||||
	Set(idx int, i interface{})
 | 
					 | 
				
			||||||
	Append(i interface{})
 | 
					 | 
				
			||||||
	Extend(i int)
 | 
					 | 
				
			||||||
	At(i int) interface{}
 | 
					 | 
				
			||||||
	Len() int
 | 
					 | 
				
			||||||
	PrimitiveType() VectorPType
 | 
					 | 
				
			||||||
	PointerAt(i int) interface{}
 | 
					 | 
				
			||||||
	//buildArrowColumn(pool memory.Allocator, field arrow.Field) *array.Column
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newVector(t interface{}, n int) (v Vector) {
 | 
					 | 
				
			||||||
	switch t.(type) {
 | 
					 | 
				
			||||||
	// ints
 | 
					 | 
				
			||||||
	case []int8:
 | 
					 | 
				
			||||||
		v = newInt8Vector(n)
 | 
					 | 
				
			||||||
	case []*int8:
 | 
					 | 
				
			||||||
		v = newNullableInt8Vector(n)
 | 
					 | 
				
			||||||
	case []int16:
 | 
					 | 
				
			||||||
		v = newInt16Vector(n)
 | 
					 | 
				
			||||||
	case []*int16:
 | 
					 | 
				
			||||||
		v = newNullableInt16Vector(n)
 | 
					 | 
				
			||||||
	case []int32:
 | 
					 | 
				
			||||||
		v = newInt32Vector(n)
 | 
					 | 
				
			||||||
	case []*int32:
 | 
					 | 
				
			||||||
		v = newNullableInt32Vector(n)
 | 
					 | 
				
			||||||
	case []int64:
 | 
					 | 
				
			||||||
		v = newInt64Vector(n)
 | 
					 | 
				
			||||||
	case []*int64:
 | 
					 | 
				
			||||||
		v = newNullableInt64Vector(n)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// uints
 | 
					 | 
				
			||||||
	case []uint8:
 | 
					 | 
				
			||||||
		v = newUint8Vector(n)
 | 
					 | 
				
			||||||
	case []*uint8:
 | 
					 | 
				
			||||||
		v = newNullableUint8Vector(n)
 | 
					 | 
				
			||||||
	case []uint16:
 | 
					 | 
				
			||||||
		v = newUint16Vector(n)
 | 
					 | 
				
			||||||
	case []*uint16:
 | 
					 | 
				
			||||||
		v = newNullableUint16Vector(n)
 | 
					 | 
				
			||||||
	case []uint32:
 | 
					 | 
				
			||||||
		v = newUint32Vector(n)
 | 
					 | 
				
			||||||
	case []*uint32:
 | 
					 | 
				
			||||||
		v = newNullableUint32Vector(n)
 | 
					 | 
				
			||||||
	case []uint64:
 | 
					 | 
				
			||||||
		v = newUint64Vector(n)
 | 
					 | 
				
			||||||
	case []*uint64:
 | 
					 | 
				
			||||||
		v = newNullableUint64Vector(n)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// floats
 | 
					 | 
				
			||||||
	case []float32:
 | 
					 | 
				
			||||||
		v = newFloat32Vector(n)
 | 
					 | 
				
			||||||
	case []*float32:
 | 
					 | 
				
			||||||
		v = newNullableFloat32Vector(n)
 | 
					 | 
				
			||||||
	case []float64:
 | 
					 | 
				
			||||||
		v = newFloat64Vector(n)
 | 
					 | 
				
			||||||
	case []*float64:
 | 
					 | 
				
			||||||
		v = newNullableFloat64Vector(n)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case []string:
 | 
					 | 
				
			||||||
		v = newStringVector(n)
 | 
					 | 
				
			||||||
	case []*string:
 | 
					 | 
				
			||||||
		v = newNullableStringVector(n)
 | 
					 | 
				
			||||||
	case []bool:
 | 
					 | 
				
			||||||
		v = newBoolVector(n)
 | 
					 | 
				
			||||||
	case []*bool:
 | 
					 | 
				
			||||||
		v = newNullableBoolVector(n)
 | 
					 | 
				
			||||||
	case []time.Time:
 | 
					 | 
				
			||||||
		v = newTimeTimeVector(n)
 | 
					 | 
				
			||||||
	case []*time.Time:
 | 
					 | 
				
			||||||
		v = newNullableTimeTimeVector(n)
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("unsupported vector type of %T", t))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ValidVectorType returns if a primitive slice is a valid / supported Vector type
 | 
					 | 
				
			||||||
func ValidVectorType(t interface{}) bool {
 | 
					 | 
				
			||||||
	switch t.(type) {
 | 
					 | 
				
			||||||
	// ints
 | 
					 | 
				
			||||||
	case []int8:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*int8:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []int16:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*int16:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []int32:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*int32:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []int64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*int64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// uints
 | 
					 | 
				
			||||||
	case []uint8:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*uint8:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []uint16:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*uint16:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []uint32:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*uint32:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []uint64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*uint64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// floats
 | 
					 | 
				
			||||||
	case []float32:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*float32:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []float64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*float64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case []string:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*string:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []bool:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*bool:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []time.Time:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case []*time.Time:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// VectorPType indicates the go type underlying the Vector.
 | 
					 | 
				
			||||||
type VectorPType int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	// VectorPTypeInt8 indicates the underlying primitive is a []int8.
 | 
					 | 
				
			||||||
	VectorPTypeInt8 VectorPType = iota
 | 
					 | 
				
			||||||
	// VectorPTypeNullableInt8 indicates the underlying primitive is a []*int8.
 | 
					 | 
				
			||||||
	VectorPTypeNullableInt8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeInt16 indicates the underlying primitive is a []Int16.
 | 
					 | 
				
			||||||
	VectorPTypeInt16
 | 
					 | 
				
			||||||
	// VectorPTypeNullableInt16 indicates the underlying primitive is a []*Int16.
 | 
					 | 
				
			||||||
	VectorPTypeNullableInt16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeInt32 indicates the underlying primitive is a []int32.
 | 
					 | 
				
			||||||
	VectorPTypeInt32
 | 
					 | 
				
			||||||
	// VectorPTypeNullableInt32 indicates the underlying primitive is a []*int32.
 | 
					 | 
				
			||||||
	VectorPTypeNullableInt32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeInt64 indicates the underlying primitive is a []int64.
 | 
					 | 
				
			||||||
	VectorPTypeInt64
 | 
					 | 
				
			||||||
	// VectorPTypeNullableInt64 indicates the underlying primitive is a []*int64.
 | 
					 | 
				
			||||||
	VectorPTypeNullableInt64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeUint8 indicates the underlying primitive is a []int8.
 | 
					 | 
				
			||||||
	VectorPTypeUint8
 | 
					 | 
				
			||||||
	// VectorPTypeNullableUint8 indicates the underlying primitive is a []*int8.
 | 
					 | 
				
			||||||
	VectorPTypeNullableUint8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeUint16 indicates the underlying primitive is a []uint16.
 | 
					 | 
				
			||||||
	VectorPTypeUint16
 | 
					 | 
				
			||||||
	// VectorPTypeNullableUint16 indicates the underlying primitive is a []*uint16.
 | 
					 | 
				
			||||||
	VectorPTypeNullableUint16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeUint32 indicates the underlying primitive is a []uint32.
 | 
					 | 
				
			||||||
	VectorPTypeUint32
 | 
					 | 
				
			||||||
	// VectorPTypeNullableUint32 indicates the underlying primitive is a []*uint32.
 | 
					 | 
				
			||||||
	VectorPTypeNullableUint32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeUint64 indicates the underlying primitive is a []uint64.
 | 
					 | 
				
			||||||
	VectorPTypeUint64
 | 
					 | 
				
			||||||
	// VectorPTypeNullableUint64 indicates the underlying primitive is a []*uint64.
 | 
					 | 
				
			||||||
	VectorPTypeNullableUint64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeFloat32 indicates the underlying primitive is a []float32.
 | 
					 | 
				
			||||||
	VectorPTypeFloat32
 | 
					 | 
				
			||||||
	// VectorPTypeNullableFloat32 indicates the underlying primitive is a []*float32.
 | 
					 | 
				
			||||||
	VectorPTypeNullableFloat32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeFloat64 indicates the underlying primitive is a []float64.
 | 
					 | 
				
			||||||
	VectorPTypeFloat64
 | 
					 | 
				
			||||||
	// VectorPTypeNullableFloat64 indicates the underlying primitive is a []*float64.
 | 
					 | 
				
			||||||
	VectorPTypeNullableFloat64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeString indicates the underlying primitive is a []string.
 | 
					 | 
				
			||||||
	VectorPTypeString
 | 
					 | 
				
			||||||
	// VectorPTypeNullableString indicates the underlying primitive is a []*string.
 | 
					 | 
				
			||||||
	VectorPTypeNullableString
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeBool indicates the underlying primitive is a []bool.
 | 
					 | 
				
			||||||
	VectorPTypeBool
 | 
					 | 
				
			||||||
	// VectorPTypeNullableBool indicates the underlying primitive is a []*bool.
 | 
					 | 
				
			||||||
	VectorPTypeNullableBool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// VectorPTypeTime indicates the underlying primitive is a []time.Time.
 | 
					 | 
				
			||||||
	VectorPTypeTime
 | 
					 | 
				
			||||||
	// VectorPTypeNullableTime indicates the underlying primitive is a []*time.Time.
 | 
					 | 
				
			||||||
	VectorPTypeNullableTime
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func vectorPType(v Vector) VectorPType {
 | 
					 | 
				
			||||||
	switch v.(type) {
 | 
					 | 
				
			||||||
	case *int8Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeInt8
 | 
					 | 
				
			||||||
	case *nullableInt8Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *int16Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeInt16
 | 
					 | 
				
			||||||
	case *nullableInt16Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *int32Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeInt32
 | 
					 | 
				
			||||||
	case *nullableInt32Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *int64Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeInt64
 | 
					 | 
				
			||||||
	case *nullableInt64Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *uint8Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeUint8
 | 
					 | 
				
			||||||
	case *nullableUint8Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *uint16Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeUint16
 | 
					 | 
				
			||||||
	case *nullableUint16Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *uint32Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeUint32
 | 
					 | 
				
			||||||
	case *nullableUint32Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *uint64Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeUint64
 | 
					 | 
				
			||||||
	case *nullableUint64Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *float32Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeFloat32
 | 
					 | 
				
			||||||
	case *nullableFloat32Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableFloat32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *float64Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeFloat64
 | 
					 | 
				
			||||||
	case *nullableFloat64Vector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableFloat64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *stringVector:
 | 
					 | 
				
			||||||
		return VectorPTypeString
 | 
					 | 
				
			||||||
	case *nullableStringVector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableString
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *boolVector:
 | 
					 | 
				
			||||||
		return VectorPTypeBool
 | 
					 | 
				
			||||||
	case *nullableBoolVector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableBool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case *timeTimeVector:
 | 
					 | 
				
			||||||
		return VectorPTypeTime
 | 
					 | 
				
			||||||
	case *nullableTimeTimeVector:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableTime
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return VectorPType(-1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func pTypeFromVal(v interface{}) VectorPType {
 | 
					 | 
				
			||||||
	switch v.(type) {
 | 
					 | 
				
			||||||
	case int8:
 | 
					 | 
				
			||||||
		return VectorPTypeInt8
 | 
					 | 
				
			||||||
	case *int8:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case int16:
 | 
					 | 
				
			||||||
		return VectorPTypeInt16
 | 
					 | 
				
			||||||
	case *int16:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case int32:
 | 
					 | 
				
			||||||
		return VectorPTypeInt32
 | 
					 | 
				
			||||||
	case *int32:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case int64:
 | 
					 | 
				
			||||||
		return VectorPTypeInt64
 | 
					 | 
				
			||||||
	case *int64:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableInt64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case uint8:
 | 
					 | 
				
			||||||
		return VectorPTypeUint8
 | 
					 | 
				
			||||||
	case *uint8:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case uint16:
 | 
					 | 
				
			||||||
		return VectorPTypeUint16
 | 
					 | 
				
			||||||
	case *uint16:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case uint32:
 | 
					 | 
				
			||||||
		return VectorPTypeUint32
 | 
					 | 
				
			||||||
	case *uint32:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case uint64:
 | 
					 | 
				
			||||||
		return VectorPTypeUint64
 | 
					 | 
				
			||||||
	case *uint64:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableUint64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case float32:
 | 
					 | 
				
			||||||
		return VectorPTypeFloat32
 | 
					 | 
				
			||||||
	case *float32:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableFloat32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case float64:
 | 
					 | 
				
			||||||
		return VectorPTypeFloat64
 | 
					 | 
				
			||||||
	case *float64:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableFloat64
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case string:
 | 
					 | 
				
			||||||
		return VectorPTypeString
 | 
					 | 
				
			||||||
	case *string:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableString
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case bool:
 | 
					 | 
				
			||||||
		return VectorPTypeBool
 | 
					 | 
				
			||||||
	case *bool:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableBool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case time.Time:
 | 
					 | 
				
			||||||
		return VectorPTypeTime
 | 
					 | 
				
			||||||
	case *time.Time:
 | 
					 | 
				
			||||||
		return VectorPTypeNullableTime
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return VectorPType(-1)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p VectorPType) String() string {
 | 
					 | 
				
			||||||
	if p < 0 {
 | 
					 | 
				
			||||||
		return "invalid/unsupported"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fmt.Sprintf("[]%v", p.ItemTypeString())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ItemTypeString returns the string representation of the type of element within in the vector
 | 
					 | 
				
			||||||
func (p VectorPType) ItemTypeString() string {
 | 
					 | 
				
			||||||
	switch p {
 | 
					 | 
				
			||||||
	case VectorPTypeInt8:
 | 
					 | 
				
			||||||
		return "int8"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableInt8:
 | 
					 | 
				
			||||||
		return "*int8"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeInt16:
 | 
					 | 
				
			||||||
		return "int16"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableInt16:
 | 
					 | 
				
			||||||
		return "*int16"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeInt32:
 | 
					 | 
				
			||||||
		return "int32"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableInt32:
 | 
					 | 
				
			||||||
		return "*int32"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeInt64:
 | 
					 | 
				
			||||||
		return "int64"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableInt64:
 | 
					 | 
				
			||||||
		return "*int64"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeUint8:
 | 
					 | 
				
			||||||
		return "unit8"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableUint8:
 | 
					 | 
				
			||||||
		return "*uint8"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeUint16:
 | 
					 | 
				
			||||||
		return "uint16"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableUint16:
 | 
					 | 
				
			||||||
		return "*uint16"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeUint32:
 | 
					 | 
				
			||||||
		return "uint32"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableUint32:
 | 
					 | 
				
			||||||
		return "*uint32"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeUint64:
 | 
					 | 
				
			||||||
		return "uint64"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableUint64:
 | 
					 | 
				
			||||||
		return "*uint64"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeFloat32:
 | 
					 | 
				
			||||||
		return "float32"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableFloat32:
 | 
					 | 
				
			||||||
		return "*float32"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeFloat64:
 | 
					 | 
				
			||||||
		return "float64"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableFloat64:
 | 
					 | 
				
			||||||
		return "*float64"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeString:
 | 
					 | 
				
			||||||
		return "string"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableString:
 | 
					 | 
				
			||||||
		return "*string"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeBool:
 | 
					 | 
				
			||||||
		return "bool"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableBool:
 | 
					 | 
				
			||||||
		return "*bool"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeTime:
 | 
					 | 
				
			||||||
		return "time.Time"
 | 
					 | 
				
			||||||
	case VectorPTypeNullableTime:
 | 
					 | 
				
			||||||
		return "*time.Time"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return "invalid/unsupported type"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Nullable returns if type is a nullable type
 | 
					 | 
				
			||||||
func (p VectorPType) Nullable() bool {
 | 
					 | 
				
			||||||
	switch p {
 | 
					 | 
				
			||||||
	case VectorPTypeNullableInt8, VectorPTypeNullableInt16, VectorPTypeNullableInt32, VectorPTypeNullableInt64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeNullableUint8, VectorPTypeNullableUint16, VectorPTypeNullableUint32, VectorPTypeNullableUint64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeNullableFloat32, VectorPTypeNullableFloat64:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeNullableString:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeNullableBool:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	case VectorPTypeNullableTime:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -147,9 +147,9 @@ github.com/gosimple/slug
 | 
				
			||||||
# github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4
 | 
					# github.com/grafana/grafana-plugin-model v0.0.0-20190930120109-1fc953a61fb4
 | 
				
			||||||
github.com/grafana/grafana-plugin-model/go/datasource
 | 
					github.com/grafana/grafana-plugin-model/go/datasource
 | 
				
			||||||
github.com/grafana/grafana-plugin-model/go/renderer
 | 
					github.com/grafana/grafana-plugin-model/go/renderer
 | 
				
			||||||
# github.com/grafana/grafana-plugin-sdk-go v0.21.0
 | 
					# github.com/grafana/grafana-plugin-sdk-go v0.24.0
 | 
				
			||||||
github.com/grafana/grafana-plugin-sdk-go/backend/plugin
 | 
					github.com/grafana/grafana-plugin-sdk-go/backend/plugin
 | 
				
			||||||
github.com/grafana/grafana-plugin-sdk-go/dataframe
 | 
					github.com/grafana/grafana-plugin-sdk-go/data
 | 
				
			||||||
github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2
 | 
					github.com/grafana/grafana-plugin-sdk-go/genproto/pluginv2
 | 
				
			||||||
# github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd
 | 
					# github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd
 | 
				
			||||||
github.com/hashicorp/go-hclog
 | 
					github.com/hashicorp/go-hclog
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue