pkg/query/logical/common.go (67 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 (
"github.com/pkg/errors"
modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
)
var (
// ErrUnsupportedConditionOp indicates an unsupported condition operation.
ErrUnsupportedConditionOp = errors.New("unsupported condition operation")
// ErrUnsupportedConditionValue indicates an unsupported condition value type.
ErrUnsupportedConditionValue = errors.New("unsupported condition value type")
// ErrInvalidCriteriaType indicates an invalid criteria type.
ErrInvalidCriteriaType = errors.New("invalid criteria type")
// ErrInvalidLogicalExpression indicates an invalid logical expression.
ErrInvalidLogicalExpression = errors.New("invalid logical expression")
errTagNotDefined = errors.New("tag is not defined")
errIndexNotDefined = errors.New("index is not define for the tag")
errIndexSortingUnsupported = errors.New("index does not support sorting")
)
// Tag represents the combination of tag family and tag name.
// It's a tag's identity.
type Tag struct {
familyName, name string
}
// NewTag return a new Tag.
func NewTag(family, name string) *Tag {
return &Tag{
familyName: family,
name: name,
}
}
// NewTags create an array of Tag within a TagFamily.
func NewTags(family string, tagNames ...string) []*Tag {
tags := make([]*Tag, len(tagNames))
for i, name := range tagNames {
tags[i] = NewTag(family, name)
}
return tags
}
// GetCompoundName is only used for error message.
func (t *Tag) GetCompoundName() string {
return t.familyName + ":" + t.name
}
// GetTagName returns the tag name.
func (t *Tag) GetTagName() string {
return t.name
}
// GetFamilyName returns the tag family name.
func (t *Tag) GetFamilyName() string {
return t.familyName
}
// ToTags converts a projection spec to Tag sets.
func ToTags(projection *modelv1.TagProjection) [][]*Tag {
projTags := make([][]*Tag, len(projection.GetTagFamilies()))
for i, tagFamily := range projection.GetTagFamilies() {
var projTagInFamily []*Tag
for _, tagName := range tagFamily.GetTags() {
projTagInFamily = append(projTagInFamily, NewTag(tagFamily.GetName(), tagName))
}
projTags[i] = projTagInFamily
}
return projTags
}
// Field identity a field in a measure.
type Field struct {
Name string
}
// NewField return a new Field.
func NewField(name string) *Field {
return &Field{Name: name}
}
// StringSlicesEqual reports whether a and b are the same length and contain the same strings.
// A nil argument is equivalent to an empty slice.
func StringSlicesEqual(a, b []string) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}