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

Reply via email to