| // Licensed to Apache Software Foundation (ASF) under one or more contributor |
| // license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright |
| // ownership. Apache Software Foundation (ASF) licenses this file to you under |
| // the Apache License, Version 2.0 (the "License"); you may |
| // not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| package logical |
| |
| import ( |
| "fmt" |
| |
| "github.com/google/go-cmp/cmp" |
| "github.com/pkg/errors" |
| |
| "github.com/apache/skywalking-banyandb/api/common" |
| "github.com/apache/skywalking-banyandb/api/data" |
| "github.com/apache/skywalking-banyandb/banyand/series" |
| "github.com/apache/skywalking-banyandb/pkg/query/executor" |
| ) |
| |
| var _ Plan = (*tableScan)(nil) |
| var _ UnresolvedPlan = (*unresolvedTableScan)(nil) |
| |
| type unresolvedTableScan struct { |
| startTime int64 |
| endTime int64 |
| projectionFields []string |
| traceMetadata *common.Metadata |
| traceState series.TraceState |
| } |
| |
| func (u *unresolvedTableScan) Type() PlanType { |
| return PlanTableScan |
| } |
| |
| func (u *unresolvedTableScan) Analyze(schema Schema) (Plan, error) { |
| if u.projectionFields == nil || len(u.projectionFields) == 0 { |
| return &tableScan{ |
| startTime: u.startTime, |
| endTime: u.endTime, |
| schema: schema, |
| traceMetadata: u.traceMetadata, |
| }, nil |
| } |
| |
| if schema == nil { |
| return nil, errors.Wrap(ErrInvalidSchema, "nil") |
| } |
| |
| fieldRefs, err := schema.CreateRef(u.projectionFields...) |
| if err != nil { |
| return nil, err |
| } |
| return &tableScan{ |
| startTime: u.startTime, |
| endTime: u.endTime, |
| projectionFields: u.projectionFields, |
| projectionFieldRefs: fieldRefs, |
| schema: schema, |
| traceMetadata: u.traceMetadata, |
| traceState: u.traceState, |
| }, nil |
| } |
| |
| type tableScan struct { |
| startTime int64 |
| endTime int64 |
| traceState series.TraceState |
| projectionFields []string |
| projectionFieldRefs []*FieldRef |
| schema Schema |
| traceMetadata *common.Metadata |
| } |
| |
| func (s *tableScan) Execute(ec executor.ExecutionContext) ([]data.Entity, error) { |
| return ec.ScanEntity(*s.traceMetadata, uint64(s.startTime), uint64(s.endTime), series.ScanOptions{ |
| Projection: s.projectionFields, |
| State: s.traceState, |
| }) |
| } |
| |
| func (s *tableScan) Equal(plan Plan) bool { |
| if plan.Type() != PlanTableScan { |
| return false |
| } |
| other := plan.(*tableScan) |
| return s.startTime == other.startTime && s.endTime == other.endTime && |
| cmp.Equal(s.projectionFieldRefs, other.projectionFieldRefs) && |
| cmp.Equal(s.schema, other.schema) && |
| cmp.Equal(s.traceMetadata, other.traceMetadata) |
| } |
| |
| func (s *tableScan) Schema() Schema { |
| if s.projectionFieldRefs == nil || len(s.projectionFieldRefs) == 0 { |
| return s.schema |
| } |
| return s.schema.Map(s.projectionFieldRefs...) |
| } |
| |
| func (s *tableScan) String() string { |
| if len(s.projectionFieldRefs) == 0 { |
| return fmt.Sprintf("TableScan: startTime=%d,endTime=%d,Metadata{group=%s,name=%s}; projection=None", |
| s.startTime, s.endTime, s.traceMetadata.Spec.GetGroup(), s.traceMetadata.Spec.GetName()) |
| } |
| return fmt.Sprintf("TableScan: startTime=%d,endTime=%d,Metadata{group=%s,name=%s}; projection=%s", |
| s.startTime, s.endTime, s.traceMetadata.Spec.GetGroup(), s.traceMetadata.Spec.GetName(), formatExpr(", ", s.projectionFieldRefs...)) |
| } |
| |
| func (s *tableScan) Children() []Plan { |
| return []Plan{} |
| } |
| |
| func (s *tableScan) Type() PlanType { |
| return PlanTableScan |
| } |
| |
| func TableScan(startTime, endTime int64, traceMetadata *common.Metadata, traceState series.TraceState, projection ...string) UnresolvedPlan { |
| return &unresolvedTableScan{ |
| startTime: startTime, |
| endTime: endTime, |
| projectionFields: projection, |
| traceMetadata: traceMetadata, |
| traceState: traceState, |
| } |
| } |