nodes: 0, module; 1, function_definition; 2, function_name:getTableMetadata; 3, parameters; 4, block; 5, identifier:self; 6, expression_statement; 7, expression_statement; 8, for_statement; 9, if_statement; 10, return_statement; 11, comment:"""
          Retrieve a description of the various properties of this scrolltable.
  
          @return: A sequence containing 5 elements.  They are, in order, a
          list of the names of the columns present, a mapping of column names
          to two-tuples of their type and a boolean indicating their
          sortability, the total number of rows in the scrolltable, the name
          of the default sort column, and a boolean indicating whether or not
          the current sort order is ascending.
          """; 12, assignment; 13, tuple_pattern; 14, call; 15, block; 16, attribute; 17, block; 18, else_clause; 19, list; 20, identifier:coltypes; 21, dictionary; 22, identifier:colname; 23, identifier:column; 24, attribute; 25, argument_list; 26, expression_statement; 27, expression_statement; 28, if_statement; 29, expression_statement; 30, identifier:self; 31, identifier:currentSortColumn; 32, expression_statement; 33, block; 34, attribute; 35, identifier:coltypes; 36, call; 37, identifier:csc; 38, attribute; 39, attribute; 40, identifier:iteritems; 41, assignment; 42, assignment; 43, comparison_operator:coltype is not None; 44, block; 45, assignment; 46, assignment; 47, expression_statement; 48, identifier:self; 49, identifier:columnNames; 50, attribute; 51, argument_list; 52, identifier:self; 53, identifier:isAscending; 54, identifier:self; 55, identifier:columns; 56, identifier:sortable; 57, comparison_operator:column.sortAttribute() is not None; 58, identifier:coltype; 59, call; 60, identifier:coltype; 61, None; 62, expression_statement; 63, subscript; 64, tuple; 65, identifier:csc; 66, call; 67, assignment; 68, identifier:self; 69, identifier:requestCurrentSize; 70, call; 71, None; 72, attribute; 73, argument_list; 74, assignment; 75, identifier:coltypes; 76, identifier:colname; 77, identifier:coltype; 78, identifier:sortable; 79, identifier:unicode; 80, argument_list; 81, identifier:csc; 82, None; 83, attribute; 84, argument_list; 85, identifier:column; 86, identifier:getType; 87, identifier:coltype; 88, call; 89, attribute; 90, string; 91, identifier:column; 92, identifier:sortAttribute; 93, identifier:unicode; 94, argument_list; 95, call; 96, identifier:attrname; 97, string_content:ascii; 98, identifier:coltype; 99, string; 100, attribute; 101, argument_list; 102, string_content:ascii; 103, attribute; 104, identifier:sortAttribute; 105, identifier:self; 106, identifier:currentSortColumn
code: def getTableMetadata(self):
          """
          Retrieve a description of the various properties of this scrolltable.
  
          @return: A sequence containing 5 elements.  They are, in order, a
          list of the names of the columns present, a mapping of column names
          to two-tuples of their type and a boolean indicating their
          sortability, the total number of rows in the scrolltable, the name
          of the default sort column, and a boolean indicating whether or not
          the current sort order is ascending.
          """
          coltypes = {}
          for (colname, column) in self.columns.iteritems():
              sortable = column.sortAttribute() is not None
              coltype = column.getType()
              if coltype is not None:
                  coltype = unicode(coltype, 'ascii')
              coltypes[colname] = (coltype, sortable)
  
          if self.currentSortColumn:
              csc = unicode(self.currentSortColumn.sortAttribute().attrname, 'ascii')
          else:
              csc = None
  
          return [self.columnNames, coltypes, self.requestCurrentSize(),
                  csc, self.isAscending]