diff --git a/enterprise/internal/insights/resolvers/insight_series_resolver_test.go b/enterprise/internal/insights/resolvers/insight_series_resolver_test.go index 2c143b9be85b..b8100f9cfafe 100644 --- a/enterprise/internal/insights/resolvers/insight_series_resolver_test.go +++ b/enterprise/internal/insights/resolvers/insight_series_resolver_test.go @@ -110,6 +110,6 @@ func TestResolver_InsightSeries(t *testing.T) { if err != nil { t.Fatal(err) } - autogold.Want("insights[0][0].Points mocked", "[{p:{Time:{wall:0 ext:63271811045 loc:} Value:1}} {p:{Time:{wall:0 ext:63271811045 loc:} Value:2}} {p:{Time:{wall:0 ext:63271811045 loc:} Value:3}}]").Equal(t, fmt.Sprintf("%+v", points)) + autogold.Want("insights[0][0].Points mocked", "[{p:{Time:{wall:0 ext:63271811045 loc:} Value:1 Metadata:[]}} {p:{Time:{wall:0 ext:63271811045 loc:} Value:2 Metadata:[]}} {p:{Time:{wall:0 ext:63271811045 loc:} Value:3 Metadata:[]}}]").Equal(t, fmt.Sprintf("%+v", points)) }) } diff --git a/enterprise/internal/insights/store/store.go b/enterprise/internal/insights/store/store.go index 6662d77c0e61..fbfc395d8248 100644 --- a/enterprise/internal/insights/store/store.go +++ b/enterprise/internal/insights/store/store.go @@ -55,15 +55,27 @@ func (s *Store) With(other basestore.ShareableStore) *Store { var _ Interface = &Store{} // SeriesPoint describes a single insights' series data point. +// +// Some fields that could be queried (series ID, repo ID/names) are omitted as they are primarily +// only useful for filtering the data you get back, and would inflate the data size considerably +// otherwise. type SeriesPoint struct { - Time time.Time - Value float64 + Time time.Time + Value float64 + Metadata []byte +} + +func (s *SeriesPoint) String() string { + return fmt.Sprintf("SeriesPoint{Time: %q, Value: %v, Metadata: %s}", s.Time, s.Value, s.Metadata) } // SeriesPointsOpts describes options for querying insights' series data points. type SeriesPointsOpts struct { // SeriesID is the unique series ID to query, if non-nil. - SeriesID *int32 + SeriesID *string + + // TODO(slimsag): Add ability to filter based on repo ID, name, original name. + // TODO(slimsag): Add ability to do limited filtering based on metadata. // Time ranges to query from/to, if non-nil. From, To *time.Time @@ -80,6 +92,7 @@ func (s *Store) SeriesPoints(ctx context.Context, opts SeriesPointsOpts) ([]Seri err := sc.Scan( &point.Time, &point.Value, + &point.Metadata, ) if err != nil { return err @@ -91,8 +104,12 @@ func (s *Store) SeriesPoints(ctx context.Context, opts SeriesPointsOpts) ([]Seri } var seriesPointsQueryFmtstr = ` --- source: enterprise/internal/insights/store/series_points.go -SELECT time, value FROM series_points +-- source: enterprise/internal/insights/store/store.go:SeriesPoints +SELECT time, + value, + m.metadata +FROM series_points p +INNER JOIN metadata m ON p.metadata_id = m.id WHERE %s ORDER BY time DESC ` diff --git a/enterprise/internal/insights/store/store_test.go b/enterprise/internal/insights/store/store_test.go index bff028c047cb..814d7b1cad24 100644 --- a/enterprise/internal/insights/store/store_test.go +++ b/enterprise/internal/insights/store/store_test.go @@ -2,7 +2,6 @@ package store import ( "context" - "fmt" "testing" "time" @@ -73,8 +72,8 @@ SELECT time, t.Fatal(err) } autogold.Want("SeriesPoints(2).len", int(913)).Equal(t, len(points)) - autogold.Want("SeriesPoints(2)[len()-1]", "{Time:2020-01-01 00:00:00 +0000 UTC Value:-20.00716650672132}").Equal(t, fmt.Sprintf("%+v", points[len(points)-1])) - autogold.Want("SeriesPoints(2)[0]", "{Time:2020-06-01 00:00:00 +0000 UTC Value:-37.8750440811433}").Equal(t, fmt.Sprintf("%+v", points[0])) + autogold.Want("SeriesPoints(2)[len()-1].String()", `SeriesPoint{Time: "2020-01-01 00:00:00 +0000 UTC", Value: -20.00716650672132, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[len(points)-1].String()) + autogold.Want("SeriesPoints(2)[0].String()", `SeriesPoint{Time: "2020-06-01 00:00:00 +0000 UTC", Value: -37.8750440811433, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[0].String()) }) t.Run("subset of data", func(t *testing.T) { @@ -87,8 +86,8 @@ SELECT time, t.Fatal(err) } autogold.Want("SeriesPoints(3).len", int(551)).Equal(t, len(points)) - autogold.Want("SeriesPoints(3)[0]", "{Time:2020-05-31 20:00:00 +0000 UTC Value:-11.269436460802638}").Equal(t, fmt.Sprintf("%+v", points[0])) - autogold.Want("SeriesPoints(3)[len()-1]", "{Time:2020-03-01 04:00:00 +0000 UTC Value:35.85710033014749}").Equal(t, fmt.Sprintf("%+v", points[len(points)-1])) + autogold.Want("SeriesPoints(3)[0].String()", `SeriesPoint{Time: "2020-05-31 20:00:00 +0000 UTC", Value: -11.269436460802638, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[0].String()) + autogold.Want("SeriesPoints(3)[len()-1].String()", `SeriesPoint{Time: "2020-03-01 04:00:00 +0000 UTC", Value: 35.85710033014749, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[len(points)-1].String()) }) t.Run("latest 3 points", func(t *testing.T) { @@ -100,9 +99,9 @@ SELECT time, t.Fatal(err) } autogold.Want("SeriesPoints(4).len", int(3)).Equal(t, len(points)) - autogold.Want("SeriesPoints(4)[0]", "{Time:2020-06-01 00:00:00 +0000 UTC Value:-37.8750440811433}").Equal(t, fmt.Sprintf("%+v", points[0])) - autogold.Want("SeriesPoints(4)[1]", "{Time:2020-05-31 20:00:00 +0000 UTC Value:-11.269436460802638}").Equal(t, fmt.Sprintf("%+v", points[1])) - autogold.Want("SeriesPoints(4)[2]", "{Time:2020-05-31 16:00:00 +0000 UTC Value:17.838503552871998}").Equal(t, fmt.Sprintf("%+v", points[2])) + autogold.Want("SeriesPoints(4)[0].String()", `SeriesPoint{Time: "2020-06-01 00:00:00 +0000 UTC", Value: -37.8750440811433, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[0].String()) + autogold.Want("SeriesPoints(4)[1].String()", `SeriesPoint{Time: "2020-05-31 20:00:00 +0000 UTC", Value: -11.269436460802638, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[1].String()) + autogold.Want("SeriesPoints(4)[2].String()", `SeriesPoint{Time: "2020-05-31 16:00:00 +0000 UTC", Value: 17.838503552871998, Metadata: {"hello": "world", "languages": ["Go", "Python", "Java"]}}`).Equal(t, points[2].String()) }) }