| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | package iiimport (	"fmt"	"strings"	"golib/features/mo")// ArgLookup 检查错误并返回 ItemInfo.Fields 中已配置的 Lookup 过滤器// 当 Lookup 为有效配置时, 检查 Lookup.From 是否存在于 Items 内以及检查 FieldInfo.Fields 内的字段是否存在于该 ItemInfo 内func (c *ItemInfo) ArgLookup(items Items) ([]mo.D, error) {	lookFilter := make([]mo.D, 0)	for _, field := range c.Fields {		if !field.HasLookup() {			continue		}		info, ok := items.Has(c.Name.Database() + "." + field.Lookup.From)		if !ok {			return nil, fmt.Errorf("iteminfo: %s.%s.Lookup.From: %s: item not found", c.Name, field.Name, field.Lookup.From)		}		if _, ok = info.Field(field.Lookup.ForeignField); !ok {			return nil, fmt.Errorf("iteminfo: %s.%s.Lookup.Foreign: %s: not found in iteminfo: %s", c.Name, field.Name, field.Lookup.ForeignField, info.Name)		}		for _, extField := range field.Fields {			_, ok = info.Field(extField.Name)			if ok {				continue			}			return nil, fmt.Errorf("iteminfo: %s.%s.Fields: %s: not found in iteminfo: %s", c.Name, field.Name, extField.Name, info.Name)		}		lookFilter = append(lookFilter, field.ArgLookup().Pipeline())	}	return lookFilter, nil}// ArgSet 检查错误并返回 ItemInfo.Fields 中已配置的 Set 聚合操作// 当 Set 为有效配置时, 检查 Set.Name 是否存在于 ItemInfo 内func (c *ItemInfo) ArgSet() ([]mo.D, error) {	sets := make([]mo.D, 0)	for _, field := range c.Fields {		if !field.HasSet() {			continue		}		for _, set := range field.Set {			fieldName := strings.Split(set.Value, ",")			for _, name := range fieldName {				fieldInfo, ok := c.Field(name)				if !ok {					return nil, fmt.Errorf("iteminfo: %s.%s.Set.Name: %s: field not found", c.Name, field.Name, set.Name)				}				if fieldInfo.Type != mo.TypeDouble && fieldInfo.Type != mo.TypeDate && fieldInfo.Type != mo.TypeLong {					return nil, fmt.Errorf("iteminfo: %s.%s.Set.Type: %s: type must be Number", c.Name, field.Name, fieldInfo.Type.String())				}			}			sets = append(sets, field.ArgSet().Pipeline())		}	}	return sets, nil}func (c *ItemInfo) Aggregation(items Items) ([]mo.D, error) {	arg := make([]mo.D, 0)	lookup, err := c.ArgLookup(items)	if err != nil {		return nil, err	}	arg = append(arg, lookup...)	set, err := c.ArgSet()	if err != nil {		return nil, err	}	arg = append(arg, set...)	return arg, nil}
 |