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
}