| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | package bootableimport (	"strings"	"golib/features/mo"	"golib/infra/ii")func (q *Filter) handleDateTime(matcher *mo.Matcher, field ii.FieldInfo, value interface{}) {	switch v := value.(type) {	case string:		date, err := mo.ResolveDateTimeFrom(TimeLayout, v)		if err != nil {			return		}		matcher.Gte(field.Name, date)	default:		if t, err := field.Convert(value); err == nil {			matcher.Gte(field.Name, t)		}	}}// handleSinglePoint 处理带 . 的字段查找// 适用于 object 类型的查找func (q *Filter) handleSinglePoint(reqName string, value interface{}, info *ii.ItemInfo, matcher *mo.Matcher) {	fieldName, subFieldName, ok := strings.Cut(reqName, ".")	if !ok {		return	}	field, ok := info.Field(fieldName)	if !ok {		return	}	if !field.NoField {	}	subField, ok := field.SubField(subFieldName)	if !ok {		return	}	val, err := subField.Convert(value)	if err != nil {		return	}	switch field.Type {	// 子 map 查找	case mo.TypeObject:		q.handleField(matcher, field, reqName, val, false)	case mo.TypeArray:		if field.Items != ii.FieldItemsObject {			return		}		match := new(mo.Matcher)		q.handleField(match, subField, subFieldName, val, false)		q.handleField(matcher, field, fieldName, match, false)	}}func (q *Filter) handleField(matcher *mo.Matcher, field ii.FieldInfo, key string, val interface{}, custom bool) {	if custom {		matcher.Add(key, val)		return	}	// 详情见 ii utils.go 中 isEnabledType 已启用的类型	switch field.Type {	case mo.TypeString:		// 字符串类型使用正则表达式搜索		matcher.Regex(key, val)	case mo.TypeDouble:		matcher.Gte(key, val)		matcher.Lte(key, val.(float64)+1)	case mo.TypeLong:		matcher.Gte(key, val)	case mo.TypeArray:		if field.Items == ii.FieldItemsObject {			matcher.ElemMatch(key, val.(*mo.Matcher))		} else {			matcher.In(key, val.(mo.A))		}	default:		matcher.Eq(key, val)	}}func (q *Filter) handleParams(itemInfo *ii.ItemInfo, items ii.Items, pipe *mo.Pipeline, matcher *mo.Matcher, doc mo.D, custom bool) {	for _, ele := range doc {		// 检查请求参数中的字段是否包含在 XML 配置文件中		field, ok := itemInfo.Field(ele.Key)		if !ok {			switch strings.Count(ele.Key, ".") {			case 1:				q.handleSinglePoint(ele.Key, ele.Value, itemInfo, matcher)			case 2:				// lookup filter				q.handle2Point(pipe, matcher, itemInfo, items, ele.Key, ele.Value)			}			continue		}		if field.Type == mo.TypeDate {			q.handleDateTime(matcher, field, ele.Value)			continue		}		// 将请求参数值转换为 XML 配置文件中的类型		val, err := field.Convert(ele.Value)		if err != nil {			continue		}		q.handleField(matcher, field, ele.Key, val, custom)	}}
 |