in pkg/query/logical/measure/measure_plan_distributed.go [58:149]
func (ud *unresolvedDistributed) Analyze(s logical.Schema) (logical.Plan, error) {
projectionTags := logical.ToTags(ud.originalQuery.GetTagProjection())
if len(projectionTags) > 0 {
var err error
projTagsRefs, err := s.CreateTagRef(projectionTags...)
if err != nil {
return nil, err
}
s = s.ProjTags(projTagsRefs...)
}
projectionFields := make([]*logical.Field, len(ud.originalQuery.GetFieldProjection().GetNames()))
for i, fieldNameProj := range ud.originalQuery.GetFieldProjection().GetNames() {
projectionFields[i] = logical.NewField(fieldNameProj)
}
if len(projectionFields) > 0 {
var err error
projFieldRefs, err := s.CreateFieldRef(projectionFields...)
if err != nil {
return nil, err
}
s = s.ProjFields(projFieldRefs...)
}
limit := ud.originalQuery.GetLimit()
if limit == 0 {
limit = defaultLimit
}
temp := &measurev1.QueryRequest{
TagProjection: ud.originalQuery.TagProjection,
FieldProjection: ud.originalQuery.FieldProjection,
Name: ud.originalQuery.Name,
Groups: ud.originalQuery.Groups,
Criteria: ud.originalQuery.Criteria,
Limit: limit + ud.originalQuery.Offset,
OrderBy: ud.originalQuery.OrderBy,
}
if ud.groupByEntity {
e := s.EntityList()[0]
sortTagSpec := s.FindTagSpecByName(e)
if sortTagSpec == nil {
return nil, fmt.Errorf("entity tag %s not found", e)
}
result := &distributedPlan{
queryTemplate: temp,
s: s,
sortByTime: false,
sortTagSpec: *sortTagSpec,
}
if ud.originalQuery.OrderBy != nil && ud.originalQuery.OrderBy.Sort == modelv1.Sort_SORT_DESC {
result.desc = true
}
return result, nil
}
if ud.originalQuery.OrderBy == nil {
return &distributedPlan{
queryTemplate: temp,
s: s,
sortByTime: true,
}, nil
}
if ud.originalQuery.OrderBy.IndexRuleName == "" {
result := &distributedPlan{
queryTemplate: temp,
s: s,
sortByTime: true,
}
if ud.originalQuery.OrderBy.Sort == modelv1.Sort_SORT_DESC {
result.desc = true
}
return result, nil
}
ok, indexRule := s.IndexRuleDefined(ud.originalQuery.OrderBy.IndexRuleName)
if !ok {
return nil, fmt.Errorf("index rule %s not found", ud.originalQuery.OrderBy.IndexRuleName)
}
if len(indexRule.Tags) != 1 {
return nil, fmt.Errorf("index rule %s should have only one tag", ud.originalQuery.OrderBy.IndexRuleName)
}
sortTagSpec := s.FindTagSpecByName(indexRule.Tags[0])
if sortTagSpec == nil {
return nil, fmt.Errorf("tag %s not found", indexRule.Tags[0])
}
result := &distributedPlan{
queryTemplate: temp,
s: s,
sortByTime: false,
sortTagSpec: *sortTagSpec,
}
if ud.originalQuery.OrderBy.Sort == modelv1.Sort_SORT_DESC {
result.desc = true
}
return result, nil
}