func buildIndexModeCriteria()

in pkg/index/inverted/query.go [203:267]


func buildIndexModeCriteria(criteria *modelv1.Criteria, schema logical.Schema, entityDict map[string]int) (index.Query, error) {
	switch criteria.GetExp().(type) {
	case *modelv1.Criteria_Condition:
		cond := criteria.GetCondition()
		expr, err := logical.ParseExpr(cond)
		if err != nil {
			return nil, err
		}
		if ok, indexRule := schema.IndexDefined(cond.Name); ok {
			fk := index.FieldKey{IndexRuleID: indexRule.Metadata.Id}
			return parseConditionToQuery(cond, indexRule, expr, fk.Marshal())
		}
		if _, ok := entityDict[cond.Name]; ok {
			fk := index.FieldKey{TagName: index.IndexModeEntityTagPrefix + cond.Name}
			return parseConditionToQuery(cond, nil, expr, fk.Marshal())
		}
		return nil, errors.Wrapf(logical.ErrUnsupportedConditionOp, "mandatory index rule conf:%s", cond)
	case *modelv1.Criteria_Le:
		le := criteria.GetLe()
		if le.GetLeft() == nil && le.GetRight() == nil {
			return nil, errors.WithMessagef(logical.ErrInvalidLogicalExpression, "both sides(left and right) of [%v] are empty", criteria)
		}
		if le.GetLeft() == nil {
			return buildIndexModeCriteria(le.Right, schema, entityDict)
		}
		if le.GetRight() == nil {
			return buildIndexModeCriteria(le.Left, schema, entityDict)
		}
		left, err := buildIndexModeCriteria(le.Left, schema, entityDict)
		if err != nil {
			return nil, err
		}
		right, err := buildIndexModeCriteria(le.Right, schema, entityDict)
		if err != nil {
			return nil, err
		}
		switch le.Op {
		case modelv1.LogicalExpression_LOGICAL_OP_AND:
			query, node := bluge.NewBooleanQuery(), newMustNode()
			if left != nil {
				query.AddMust(left.(*queryNode).query)
				node.Append(left.(*queryNode).node)
			}
			if right != nil {
				query.AddMust(right.(*queryNode).query)
				node.Append(right.(*queryNode).node)
			}
			return &queryNode{query, node}, nil
		case modelv1.LogicalExpression_LOGICAL_OP_OR:
			query, node := bluge.NewBooleanQuery(), newShouldNode()
			query.SetMinShould(1)
			if left != nil {
				query.AddShould(left.(*queryNode).query)
				node.Append(left.(*queryNode).node)
			}
			if right != nil {
				query.AddShould(right.(*queryNode).query)
				node.Append(right.(*queryNode).node)
			}
			return &queryNode{query, node}, nil
		}
		return nil, logical.ErrInvalidCriteriaType
	}
	return nil, logical.ErrInvalidCriteriaType
}