From 9902a56132fd7aa264a82229de2ce5188fcca08a Mon Sep 17 00:00:00 2001 From: Daito Akimura <> Date: Thu, 14 Nov 2019 10:31:53 +0900 Subject: [PATCH] select columns feature --- frontend/query.go | 12 +++++++++++- utils/io/columnseries.go | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/frontend/query.go b/frontend/query.go index 8b55c46a6..3ecd89020 100644 --- a/frontend/query.go +++ b/frontend/query.go @@ -34,6 +34,8 @@ type QueryRequest struct { LimitRecordCount *int `msgpack:"limit_record_count,omitempty"` // Set to true if LimitRecordCount should be from the lower LimitFromStart *bool `msgpack:"limit_from_start,omitempty"` + // Array of column names to be returned + Columns []string `msgpack:"columns,omitempty"` // Support for functions is experimental and subject to change Functions []string `msgpack:"functions,omitempty"` @@ -162,6 +164,10 @@ func (s *DataService) Query(r *http.Request, reqs *MultiQueryRequest, response * if req.LimitFromStart != nil { limitFromStart = *req.LimitFromStart } + columns := make([]string, 0) + if req.Columns != nil { + columns = req.Columns + } start := io.ToSystemTimezone(time.Unix(epochStart, 0)) stop := io.ToSystemTimezone(time.Unix(epochEnd, 0)) @@ -169,6 +175,7 @@ func (s *DataService) Query(r *http.Request, reqs *MultiQueryRequest, response * dest, start, stop, limitRecordCount, limitFromStart, + columns, ) if err != nil { return err @@ -241,7 +248,7 @@ Utility functions */ func executeQuery(tbk *io.TimeBucketKey, start, end time.Time, LimitRecordCount int, - LimitFromStart bool) (io.ColumnSeriesMap, error) { + LimitFromStart bool, columns []string) (io.ColumnSeriesMap, error) { query := planner.NewQuery(executor.ThisInstance.CatalogDir) @@ -291,6 +298,9 @@ func executeQuery(tbk *io.TimeBucketKey, start, end time.Time, LimitRecordCount log.Error("Error returned from query scanner: %s\n", err) return nil, err } + + csm.FilterColumns(columns) + return csm, err } diff --git a/utils/io/columnseries.go b/utils/io/columnseries.go index 550f46c98..1dec89dc3 100644 --- a/utils/io/columnseries.go +++ b/utils/io/columnseries.go @@ -2,6 +2,7 @@ package io import ( "fmt" + "github.com/alpacahq/marketstore/utils/log" "reflect" "sort" "strconv" @@ -423,6 +424,26 @@ func (csm ColumnSeriesMap) ToRowSeriesMap(dataShapesMap map[TimeBucketKey][]Data return rsMap } +// FilterColumns removes columns other than the specified columns from all ColumnSeries in a ColumnSeriesMap. +func (csm *ColumnSeriesMap) FilterColumns(columns []string) { + if len(columns) == 0 { + return + } + + // index columns (=Epoch and Nanoseconds) are always necessary and Epoch should be the first column + keepColumns := []string{"Epoch"} + keepColumns = append(keepColumns, columns...) + keepColumns = append(keepColumns, "Nanoseconds") + + for _, cs := range *csm { + // filter out unnecessary columns + err := cs.Project(keepColumns) + if err != nil { + log.Error("failed to filter out columns", keepColumns) + } + } +} + func GetNamesFromDSV(dataShapes []DataShape) (out []string) { for _, shape := range dataShapes { out = append(out, shape.Name)