| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | package iiimport (	"fmt"	"golib/v3/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 {		for _, lookup := range field.Lookup {			if !lookup.Valid() {				continue			}			info, ok := items.Has(c.ForkDb(lookup.From))			if !ok {				return nil, fmt.Errorf("iteminfo: %s.%s.Lookup.From: %s: item not found", c.Name, field.Name, lookup.From)			}			if _, ok = info.Field(lookup.ForeignField); !ok {				return nil, fmt.Errorf("iteminfo: %s.%s.Lookup.Foreign: %s: not found in iteminfo: %s", c.Name, field.Name, lookup.ForeignField, info.Name)			}			lookFilter = append(lookFilter, field.ArgLookup(&lookup).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 {			switch set.OP {			case mo.PoSum:				sets = append(sets, field.ArgSet().Pipeline())			default:				continue			}		}	}	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}
 |