/* Retrieve the set for annotated values. If the attachment type is not a set, then throw an invalid distinct set error and return. */ func getSet(item value.Value) (*value.Set, error) { switch item := item.(type) { case value.AnnotatedValue: ps := item.GetAttachment("set") switch ps := ps.(type) { case *value.Set: return ps, nil default: return nil, fmt.Errorf("Invalid DISTINCT set %v of type %T.", ps, ps) } default: return nil, fmt.Errorf("Invalid DISTINCT %v of type %T.", item, item) } }
/* Directly call the evaluate method for aggregate functions and passe in the receiver, current item and current context, for count with an input expression operand. For a count with no operands (count (*)), get the count from the attachment and then evaluate. */ func (this *Count) Evaluate(item value.Value, context expression.Context) (result value.Value, e error) { if this.Operand() != nil { return this.evaluate(this, item, context) } // Full keyspace count is short-circuited switch item := item.(type) { case value.AnnotatedValue: count := item.GetAttachment("count") if count != nil { return value.NewValue(count), nil } } return this.evaluate(this, item, context) }