| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 
							- package bootable
 
- import (
 
- 	"strings"
 
- 	"golib/features/mo"
 
- 	"golib/infra/ii"
 
- )
 
- // handle2Point
 
- // 支持:
 
- // 1. 反向查找子 Lookup 关联数据
 
- // 2. Array 类型且 Items=object 时的查找
 
- func (q *Filter) handle2Point(pipe *mo.Pipeline, matcher *mo.Matcher, info *ii.ItemInfo, items ii.Items, name string, value interface{}) {
 
- 	k := strings.Split(name, ".")
 
- 	if len(k) != 3 {
 
- 		return
 
- 	}
 
- 	fieldName := k[0]
 
- 	pointName := k[1]
 
- 	subFieldName := k[2]
 
- 	field, ok := info.Field(fieldName)
 
- 	if !ok {
 
- 		return
 
- 	}
 
- 	subField, ok := field.SubField(subFieldName)
 
- 	if !ok {
 
- 		return
 
- 	}
 
- 	// 如果类型为 array 且 items=object 时认定为数组 object 查找
 
- 	if field.Type == mo.TypeArray && field.Items == ii.FieldItemsObject {
 
- 		v, err := subField.Convert(value)
 
- 		if err != nil {
 
- 			return
 
- 		}
 
- 		q.handleField(matcher, subField, name, v, false)
 
- 	}
 
- 	// 如果不存在 Lookup 选项
 
- 	if !field.HasLookup() {
 
- 		return
 
- 	}
 
- 	// 如果 List 为 true 则不允许查找
 
- 	if field.Lookup.List {
 
- 		return
 
- 	}
 
- 	// 如果 AS 和关联的数据库表名不一致时
 
- 	if field.Lookup.AS != pointName {
 
- 		return
 
- 	}
 
- 	match := &mo.Matcher{}
 
- 	// 获取 Lookup 关联的 ItemName
 
- 	lookItem, ok := items.Has(info.Name.Database() + "." + field.Lookup.From)
 
- 	if !ok {
 
- 		return
 
- 	}
 
- 	// 关联的 itemInfo 中是否包含该字段
 
- 	lookField, ok := lookItem.Field(subFieldName)
 
- 	if !ok {
 
- 		return
 
- 	}
 
- 	val, err := lookField.Convert(value)
 
- 	if err != nil {
 
- 		return
 
- 	}
 
- 	// 格式化查询
 
- 	q.handleField(match, field, lookField.Name, val, false)
 
- 	looker := field.ArgLookup()
 
- 	looker.Pipe = append(looker.Pipe, match.Pipeline())
 
- 	*pipe = append(*pipe, looker.Pipeline())
 
- 	q.lookASName = append(q.lookASName, pointName)
 
- }
 
 
  |