def get_nodes(self, query, dataset_rows: "DataTable") -> Iterator[Node]:
        """
        This gets nodes based on the provided query, and should be used sparingly,
        as it will be slow on any OLAP database systems.
        """
        dr = dataset_rows
        columns = [c.name for c in query.selected_columns]
        for row in self.db.execute(query):
            d = dict(zip(columns, row))
            yield Node(**{dr.without_object(k): v for k, v in d.items()})

        This gets nodes based on the provided query, and should be used sparingly,
        as it will be slow on any OLAP database systems.
        
src/datachain/data_storage/warehouse.py