pkg/query/logical/expr.go (59 lines of code) (raw):
// 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"
databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
)
var _ Expr = (*TagRef)(nil)
// TagRef is the reference to the tag
// also it holds the definition (derived from the streamSchema, measureSchema) of the tag.
type TagRef struct {
// Tag defines the family name and name of the Tag
Tag *Tag
// spec contains the index of the key in the streamSchema/measureSchema, as well as the underlying tagSpec
Spec *TagSpec
}
// Equal reports whether f and expr have the same name and data type.
func (f *TagRef) Equal(expr Expr) bool {
if other, ok := expr.(*TagRef); ok {
return other.Tag.getTagName() == f.Tag.getTagName() && other.Spec.Spec.GetType() == f.Spec.Spec.GetType()
}
return false
}
// DataType shows the type of the tag's value.
func (f *TagRef) DataType() int32 {
if f.Spec == nil {
panic("should be resolved first")
}
return int32(f.Spec.Spec.GetType())
}
// String shows the string representation.
func (f *TagRef) String() string {
return fmt.Sprintf("#%s<%s>", f.Tag.GetCompoundName(), f.Spec.Spec.GetType().String())
}
// NewTagRef returns a new TagRef.
func NewTagRef(familyName, tagName string) *TagRef {
return &TagRef{
Tag: NewTag(familyName, tagName),
}
}
// NewSearchableTagRef is a short-handed method for creating a TagRef to the tag in the searchable family.
func NewSearchableTagRef(tagName string) *TagRef {
return &TagRef{
Tag: NewTag("searchable", tagName),
}
}
var _ Expr = (*FieldRef)(nil)
// FieldRef is the reference to the field
// also it holds the definition (derived from measureSchema) of the field.
type FieldRef struct {
// Field defines the name of the Field
Field *Field
// spec contains the index of the key in the measureSchema, as well as the underlying FieldSpec
Spec *FieldSpec
}
// String shows the string representation.
func (f *FieldRef) String() string {
return fmt.Sprintf("#%s<%s>", f.Spec.Spec.GetName(), f.Spec.Spec.GetFieldType().String())
}
// DataType shows the type of the filed's value.
func (f *FieldRef) DataType() int32 {
if f.Spec == nil {
panic("should be resolved first")
}
return int32(f.Spec.Spec.GetFieldType())
}
// Equal reports whether f and expr have the same name and data type.
func (f *FieldRef) Equal(expr Expr) bool {
if other, ok := expr.(*FieldRef); ok {
return other.Field.Name == f.Field.Name && other.Spec.Spec.GetFieldType() == f.Spec.Spec.GetFieldType()
}
return false
}
// FieldSpec is the reference to the field.
// It also holds the definition of the field.
type FieldSpec struct {
Spec *databasev1.FieldSpec
FieldIdx int
}