docs: def format_sql(self):
          """
          Builds the sql in a format that is easy for humans to read and debug
  
          :return: The formatted sql for this query
          :rtype: str
          """
          # TODO: finish adding the other parts of the sql generation
          sql = ''
  
          # build SELECT
          select_segment = self.build_select_fields()
          select_segment = select_segment.replace('SELECT ', '', 1)
          fields = [field.strip() for field in select_segment.split(',')]
          sql += 'SELECT\n\t{0}\n'.format(',\n\t'.join(fields))
  
          # build FROM
          from_segment = self.build_from_table()
          from_segment = from_segment.replace('FROM ', '', 1)
          tables = [table.strip() for table in from_segment.split(',')]
          sql += 'FROM\n\t{0}\n'.format(',\n\t'.join(tables))
  
          # build ORDER BY
          order_by_segment = self.build_order_by()
          if len(order_by_segment):
              order_by_segment = order_by_segment.replace('ORDER BY ', '', 1)
              sorters = [sorter.strip() for sorter in order_by_segment.split(',')]
              sql += 'ORDER BY\n\t{0}\n'.format(',\n\t'.join(sorters))
  
          # build LIMIT
          limit_segment = self.build_limit()
          if len(limit_segment):
              if 'LIMIT' in limit_segment:
                  limit_segment = limit_segment.replace('LIMIT ', 'LIMIT\n\t', 1)
                  if 'OFFSET' in limit_segment:
                      limit_segment = limit_segment.replace('OFFSET ', '\nOFFSET\n\t', 1)
              elif 'OFFSET' in limit_segment:
                  limit_segment = limit_segment.replace('OFFSET ', 'OFFSET\n\t', 1)
              sql += limit_segment
  
          return sql