def _to_sqlalchemy_filtering_statement(sql_statement, session): key_type = sql_statement.get("type") key_name = sql_statement.get("key") value = sql_statement.get("value") comparator = sql_statement.get("comparator").upper() if SearchUtils.is_metric(key_type, comparator): entity = SqlLatestMetric value = float(value) elif SearchUtils.is_param(key_type, comparator): entity = SqlParam elif SearchUtils.is_tag(key_type, comparator): entity = SqlTag elif SearchUtils.is_attribute(key_type, comparator): return None else: raise MlflowException("Invalid search expression type '%s'" % key_type, error_code=INVALID_PARAMETER_VALUE) if comparator in SearchUtils.CASE_INSENSITIVE_STRING_COMPARISON_OPERATORS: op = SearchUtils.get_sql_filter_ops(entity.value, comparator) return session.query(entity).filter(entity.key == key_name, op(value)).subquery() elif comparator in SearchUtils.filter_ops: op = SearchUtils.filter_ops.get(comparator) return (session.query(entity).filter(entity.key == key_name, op(entity.value, value)).subquery()) else: return None
def _get_attributes_filtering_clauses(parsed): clauses = [] for sql_statement in parsed: key_type = sql_statement.get("type") key_name = sql_statement.get("key") value = sql_statement.get("value") comparator = sql_statement.get("comparator").upper() if SearchUtils.is_attribute(key_type, comparator): # key_name is guaranteed to be a valid searchable attribute of entities.RunInfo # by the call to parse_search_filter attribute = getattr(SqlRun, SqlRun.get_attribute_name(key_name)) if comparator in SearchUtils.CASE_INSENSITIVE_STRING_COMPARISON_OPERATORS: op = SearchUtils.get_sql_filter_ops(attribute, comparator) clauses.append(op(value)) elif comparator in SearchUtils.filter_ops: op = SearchUtils.filter_ops.get(comparator) clauses.append(op(attribute, value)) return clauses