def _create_filter()

in lib/python3.12/filter_lib/src/query_modificator.py [0:0]


def _create_filter(query: Query, fil: Dict[str, Any]) -> Query:
    model = _get_entity(query, fil.get("model"))
    field = fil.get("field")
    op = fil.get("op")
    value = fil.get("value")

    validate_filter_args(model, fil, field, op, value)

    try:
        attr = getattr(model, field).type
    except AttributeError:
        attr = None

    if isinstance(attr, LtreeType):
        return _make_ltree_query(query=query, model=model, op=op, value=value)

    if _op_is_match(fil):
        column = _get_column(model, field)
        query = _make_match(query, column, value)
        return query

    if _has_relation(model, field):
        relation = getattr(model, field.split(".")[0])
        query = query.join(relation)
        fil["field"] = field.split(".")[1]
        fil["model"] = relation.property.mapper.class_.__name__

    if _op_is_not(fil):
        fil = _create_or_condition(fil)

    try:
        query = apply_filters(query, fil, do_auto_join=False)
    except ArgumentError as e:
        raise BadFilterFormat(f"{e.args}")

    return query