| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | 
							- package ii
 
- import (
 
- 	"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
 
- }
 
 
  |