This is an automated email from the ASF dual-hosted git repository. hanahmily pushed a commit to branch vectorized-query in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit e55a6fa60d2aab8d4db5ca92d0e95c469f2491f4 Author: Hongtao Gao <[email protected]> AuthorDate: Wed May 13 11:51:01 2026 +0000 chore(query/measure): broaden row-path deprecation to all primary plan types Extends d420fa89's narrow deprecation (Analyze, DistributedAnalyze only) to cover the rest of the row-based measure plan surface, per the G8 directive to replace the row plan with a separate vec subsystem. Adds `// Deprecated:` markers to: Exported (lint-actionable via SA1019): - BuildSchema in measure_analyzer.go — vec uses BuildBatchSchema directly - TopElement, NewTopElement, TopQueue, NewTopQueue in measure_top.go — vec uses pkg/query/vectorized/measure.BatchTop Internal (documentation only; intra-package, no SA1019): - limitPlan, unresolvedAggregation, unresolvedDistributed, unresolvedGroup, localIndexScan, unresolvedMerger, unresolvedTop, schema — one tag per row-path file on the primary plan type, each pointing at the vec replacement. Existing production call sites of BuildSchema (banyand/query/processor.go and banyand/dquery/measure.go) gain `//nolint:staticcheck` annotations matching the pattern already used for Analyze and DistributedAnalyze. No behavior change. Tests and lint clean. --- banyand/dquery/measure.go | 1 + banyand/query/processor.go | 1 + pkg/query/logical/measure/measure_analyzer.go | 5 +++++ pkg/query/logical/measure/measure_plan.go | 3 +++ pkg/query/logical/measure/measure_plan_aggregation.go | 4 ++++ pkg/query/logical/measure/measure_plan_distributed.go | 3 +++ pkg/query/logical/measure/measure_plan_groupby.go | 4 ++++ pkg/query/logical/measure/measure_plan_indexscan_local.go | 4 ++++ pkg/query/logical/measure/measure_plan_merge.go | 3 +++ pkg/query/logical/measure/measure_plan_top.go | 3 +++ pkg/query/logical/measure/measure_top.go | 9 +++++++++ pkg/query/logical/measure/schema.go | 4 ++++ 12 files changed, 44 insertions(+) diff --git a/banyand/dquery/measure.go b/banyand/dquery/measure.go index bbca92f24..6993b8562 100644 --- a/banyand/dquery/measure.go +++ b/banyand/dquery/measure.go @@ -66,6 +66,7 @@ func (p *measureQueryProcessor) Rev(ctx context.Context, message bus.Message) (r resp = bus.NewMessage(bus.MessageID(now), common.NewError("fail to get execution context for measure %s: %v", meta.GetName(), err)) return } + // nolint:staticcheck // SA1019 — row-path BuildSchema is the only production path until G8 ships. s, err := logical_measure.BuildSchema(ec.GetSchema(), ec.GetIndexRules()) if err != nil { resp = bus.NewMessage(bus.MessageID(now), common.NewError("fail to build schema for measure %s: %v", meta.GetName(), err)) diff --git a/banyand/query/processor.go b/banyand/query/processor.go index e0d6f7b2e..fe9ad7f1f 100644 --- a/banyand/query/processor.go +++ b/banyand/query/processor.go @@ -185,6 +185,7 @@ func buildMeasureContext(measureService measure.Service, log *logger.Logger, que if ecErr != nil { return nil, fmt.Errorf("fail to get execution context for measure %s: %w", meta.GetName(), ecErr) } + // nolint:staticcheck // SA1019 — row-path BuildSchema is the only production path until G8 ships. s, schemaErr := logical_measure.BuildSchema(ec.GetSchema(), ec.GetIndexRules()) if schemaErr != nil { return nil, fmt.Errorf("fail to build schema for measure %s: %w", meta.GetName(), schemaErr) diff --git a/pkg/query/logical/measure/measure_analyzer.go b/pkg/query/logical/measure/measure_analyzer.go index 224327d2b..3ee58f7c7 100644 --- a/pkg/query/logical/measure/measure_analyzer.go +++ b/pkg/query/logical/measure/measure_analyzer.go @@ -31,6 +31,11 @@ import ( const defaultLimit uint32 = 100 // BuildSchema returns Schema loaded from the metadata repository. +// +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// measure analyzer (pkg/query/vectorized/measure/plan.Analyze) consumes +// *databasev1.Measure directly via measure.BuildBatchSchema and does +// not produce a logical.Schema. func BuildSchema(md *databasev1.Measure, indexRules []*databasev1.IndexRule) (logical.Schema, error) { md.GetEntity() diff --git a/pkg/query/logical/measure/measure_plan.go b/pkg/query/logical/measure/measure_plan.go index b6e6a0a3e..39fd2b134 100644 --- a/pkg/query/logical/measure/measure_plan.go +++ b/pkg/query/logical/measure/measure_plan.go @@ -31,6 +31,9 @@ var ( _ logical.UnresolvedPlan = (*limitPlan)(nil) ) +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem replaces row-path limit/offset paging via plan.Limit at +// pkg/query/vectorized/measure/plan/limit.go. type limitPlan struct { *logical.Parent offset uint32 diff --git a/pkg/query/logical/measure/measure_plan_aggregation.go b/pkg/query/logical/measure/measure_plan_aggregation.go index cd6f75847..cf1f484db 100644 --- a/pkg/query/logical/measure/measure_plan_aggregation.go +++ b/pkg/query/logical/measure/measure_plan_aggregation.go @@ -123,6 +123,10 @@ func (a *reduceAccumulator[N]) Reset() { a.reduceFunc.Reset() } +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem performs aggregation in storage via +// pkg/query/vectorized/measure.BatchAggregation, planned by +// pkg/query/vectorized/measure/plan.GroupByAgg. type unresolvedAggregation struct { unresolvedInput logical.UnresolvedPlan aggregationField *logical.Field diff --git a/pkg/query/logical/measure/measure_plan_distributed.go b/pkg/query/logical/measure/measure_plan_distributed.go index 01d46ee1a..364d75392 100644 --- a/pkg/query/logical/measure/measure_plan_distributed.go +++ b/pkg/query/logical/measure/measure_plan_distributed.go @@ -102,6 +102,9 @@ func (as *pushDownAggSchema) Children() []logical.Schema { return as.originalSchema.Children() } +// Deprecated: row-path measure plan; see .omc/g8-plan.md. Distributed +// vec query is a G8 follow-up; for now the dispatcher continues to use +// this row-path distributed plan even when vec is enabled on standalone. type unresolvedDistributed struct { originalQuery *measurev1.QueryRequest groupByEntity bool diff --git a/pkg/query/logical/measure/measure_plan_groupby.go b/pkg/query/logical/measure/measure_plan_groupby.go index 6a54aeeeb..2e32582fd 100644 --- a/pkg/query/logical/measure/measure_plan_groupby.go +++ b/pkg/query/logical/measure/measure_plan_groupby.go @@ -38,6 +38,10 @@ var ( _ logical.Plan = (*groupBy)(nil) ) +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem fuses GroupBy + Aggregation into one BatchAggregation +// operator (planned by pkg/query/vectorized/measure/plan.GroupByAgg) +// rather than emitting a row-iterator wrapper. type unresolvedGroup struct { unresolvedInput logical.UnresolvedPlan // groupBy should be a subset of tag projection diff --git a/pkg/query/logical/measure/measure_plan_indexscan_local.go b/pkg/query/logical/measure/measure_plan_indexscan_local.go index 7f9da3b83..19a029086 100644 --- a/pkg/query/logical/measure/measure_plan_indexscan_local.go +++ b/pkg/query/logical/measure/measure_plan_indexscan_local.go @@ -185,6 +185,10 @@ var ( _ logical.Sorter = (*localIndexScan)(nil) ) +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem scans via pkg/query/vectorized/measure/plan.Scan and does +// not perform leaf substitution — maybeVectorized will be deleted in +// G8h once top-level dispatch supersedes the row plan entirely. type localIndexScan struct { ec executor.MeasureExecutionContext schema logical.Schema diff --git a/pkg/query/logical/measure/measure_plan_merge.go b/pkg/query/logical/measure/measure_plan_merge.go index 71b8b4809..147d8333c 100644 --- a/pkg/query/logical/measure/measure_plan_merge.go +++ b/pkg/query/logical/measure/measure_plan_merge.go @@ -34,6 +34,9 @@ import ( var _ logical.UnresolvedPlan = (*unresolvedMerger)(nil) +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem composes a single Pipeline rather than merging separate +// per-source row plans. type unresolvedMerger struct { criteria *measurev1.QueryRequest metadata []*commonv1.Metadata diff --git a/pkg/query/logical/measure/measure_plan_top.go b/pkg/query/logical/measure/measure_plan_top.go index 559b635ea..05706c711 100644 --- a/pkg/query/logical/measure/measure_plan_top.go +++ b/pkg/query/logical/measure/measure_plan_top.go @@ -35,6 +35,9 @@ var ( _ logical.Plan = (*groupBy)(nil) ) +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem implements top-N via pkg/query/vectorized/measure.BatchTop, +// planned by pkg/query/vectorized/measure/plan.Top. type unresolvedTop struct { unresolvedInput logical.UnresolvedPlan top *measurev1.QueryRequest_Top diff --git a/pkg/query/logical/measure/measure_top.go b/pkg/query/logical/measure/measure_top.go index f7614e621..7ec2fa21a 100644 --- a/pkg/query/logical/measure/measure_top.go +++ b/pkg/query/logical/measure/measure_top.go @@ -26,12 +26,17 @@ import ( ) // TopElement seals a sortable value and its data point which this value belongs to. +// +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem implements top-N via pkg/query/vectorized/measure.BatchTop. type TopElement struct { idp *measurev1.InternalDataPoint value int64 } // NewTopElement returns a TopElement. +// +// Deprecated: row-path measure plan; see .omc/g8-plan.md. func NewTopElement(idp *measurev1.InternalDataPoint, value int64) TopElement { return TopElement{ idp: idp, @@ -95,12 +100,16 @@ func (h *topHeap) Pop() interface{} { } // TopQueue is a sortable queue only keeps top-n members when pushed new elements. +// +// Deprecated: row-path measure plan; see .omc/g8-plan.md. type TopQueue struct { th topHeap n int } // NewTopQueue returns a new TopQueue. +// +// Deprecated: row-path measure plan; see .omc/g8-plan.md. func NewTopQueue(n int, reverted bool) *TopQueue { return &TopQueue{ n: n, diff --git a/pkg/query/logical/measure/schema.go b/pkg/query/logical/measure/schema.go index 3bdc81cad..2b7fbd86a 100644 --- a/pkg/query/logical/measure/schema.go +++ b/pkg/query/logical/measure/schema.go @@ -29,6 +29,10 @@ import ( // errFieldNotDefined indicated the field is not defined in the measure schema. var errFieldNotDefined = errors.New("field is not defined") +// Deprecated: row-path measure plan; see .omc/g8-plan.md. The vec +// subsystem consumes *databasev1.Measure directly via +// measure.BuildBatchSchema and produces a *vectorized.BatchSchema with +// no intermediate logical.Schema indirection. type schema struct { measure *databasev1.Measure fieldMap map[string]*logical.FieldSpec
