func (p *parser) subqueryOrRangeSelector(expr Expr, checkRange bool) Expr {
	ctx := "subquery selector"
	if checkRange {
		ctx = "range/subquery selector"
	}

	p.next()

	var erange time.Duration
	var err error

	erangeStr := p.expect(ItemDuration, ctx).val
	erange, err = parseDuration(erangeStr)
	if err != nil {
		p.error(err)
	}

	var itm item
	if checkRange {
		itm = p.expectOneOf(ItemRightBracket, ItemColon, ctx)
		if itm.typ == ItemRightBracket {
			// Range selector.
			vs, ok := expr.(*VectorSelector)
			if !ok {
				p.errorf("range specification must be preceded by a metric selector, but follows a %T instead", expr)
			}
			return &MatrixSelector{
				Name:          vs.Name,
				LabelMatchers: vs.LabelMatchers,
				Range:         erange,
			}
		}
	} else {
		itm = p.expect(ItemColon, ctx)
	}

	// Subquery.
	var estep time.Duration

	itm = p.expectOneOf(ItemRightBracket, ItemDuration, ctx)
	if itm.typ == ItemDuration {
		estepStr := itm.val
		estep, err = parseDuration(estepStr)
		if err != nil {
			p.error(err)
		}
		p.expect(ItemRightBracket, ctx)
	}

	return &SubqueryExpr{
		Expr:  expr,
		Range: erange,
		Step:  estep,
	}
}
func (p *parser) subqueryOrRangeSelector(expr Expr, checkRange bool) Expr {
	ctx := "subquery selector"
	if checkRange {
		ctx = "range/subquery selector"
	}

	p.next()

	var erange time.Duration
	var err error

	erangeStr := p.expect(ItemDuration, ctx).val
	erange, err = parseDuration(erangeStr)
	if err != nil {
		p.error(err)
	}

	var itm item
	if checkRange {
		itm = p.expectOneOf(ItemRightBracket, ItemColon, ctx)
		if itm.typ == ItemRightBracket {
			
			vs, ok := expr.(*VectorSelector)
			if !ok {
				p.errorf("range specification must be preceded by a metric selector, but follows a %T instead", expr)
			}
			return &MatrixSelector{
				Name:          vs.Name,
				LabelMatchers: vs.LabelMatchers,
				Range:         erange,
			}
		}
	} else {
		itm = p.expect(ItemColon, ctx)
	}

	
	var estep time.Duration

	itm = p.expectOneOf(ItemRightBracket, ItemDuration, ctx)
	if itm.typ == ItemDuration {
		estepStr := itm.val
		estep, err = parseDuration(estepStr)
		if err != nil {
			p.error(err)
		}
		p.expect(ItemRightBracket, ctx)
	}

	return &SubqueryExpr{
		Expr:  expr,
		Range: erange,
		Step:  estep,
	}
}
func ( p * parser ) subqueryOrRangeSelector ( expr Expr , checkRange bool ) Expr { ctx := " " if checkRange { ctx = " " } p . next ( ) var erange time . Duration var err error erangeStr := p . expect ( ItemDuration , ctx ) . val erange , err = parseDuration ( erangeStr ) if err != nil { p . error ( err ) } var itm item if checkRange { itm = p . expectOneOf ( ItemRightBracket , ItemColon , ctx ) if itm . typ == ItemRightBracket { // Range selector. vs , ok := expr . ( * VectorSelector ) if ! ok { p . errorf ( " " , expr ) } return & MatrixSelector { Name : vs . Name , LabelMatchers : vs . LabelMatchers , Range : erange , } } } else { itm = p . expect ( ItemColon , ctx ) } // Subquery. var estep time . Duration itm = p . expectOneOf ( ItemRightBracket , ItemDuration , ctx ) if itm . typ == ItemDuration { estepStr := itm . val estep , err = parseDuration ( estepStr ) if err != nil { p . error ( err ) } p . expect ( ItemRightBracket , ctx ) } return & SubqueryExpr { Expr : expr , Range : erange , Step : estep , } }
// subqueryOrRangeSelector parses a Subquery based on given Expr (or)
// a Matrix (a.k.a. range) selector based on a given Vector selector.
//
//		<Vector_selector> '[' <duration> ']' | <Vector_selector> '[' <duration> ':' [<duration>] ']'
//
subqueryOrRangeSelector parses a Subquery based on given Expr ( or ) a Matrix ( a . k . a . range ) selector based on a given Vector selector . <Vector_selector > [ <duration > ] | <Vector_selector > [ <duration > : [ <duration > ] ]