def apply_inner_select_joins( self, query: BaseQuery, select_columns: List[str] = None) -> BaseQuery: """ Add select load options to query. The goal is to only SQL select what is requested and join all the necessary models when dotted notation is used. Inner implies non dotted columns and one to many and one to one :param query: :param select_columns: :return: """ if not select_columns: return query joined_models = list() for column in select_columns: if is_column_dotted(column): root_relation = get_column_root_relation(column) leaf_column = get_column_leaf(column) if self.is_relation_many_to_one( root_relation) or self.is_relation_one_to_one( root_relation): if root_relation not in joined_models: query = self._query_join_relation(query, root_relation) # only needed if we need to wrap this query, from_self if select_columns and self.exists_col_to_many( select_columns): related_model = self.get_related_model( root_relation) query = query.add_entity(related_model) joined_models.append(root_relation) query = query.options( (contains_eager(root_relation).load_only(leaf_column))) else: query = self._apply_normal_col_select_option(query, column) return query
def add_entities(query: BaseQuery, *args) -> BaseQuery: for arg in args: query = query.add_entity(arg) return query