(writer, fieldname, facet, column=None)
Adds a per-document value column to an existing field which was created
    without the ``sortable`` keyword argument.

    >>> from whoosh import index, sorting
    >>> ix = index.open_dir("indexdir")
    >>> with ix.writer() as w:
    ...   facet = sorting.FieldFacet("price")
    ...   sorting.add_sortable(w, "price", facet)
    ...

    :param writer: a :class:`whoosh.writing.IndexWriter` object.
    :param fieldname: the name of the field to add the per-document sortable
        values to. If this field doesn't exist in the writer's schema, the
        function will add a :class:`whoosh.fields.COLUMN` field to the schema,
        and you must specify the column object to using the ``column`` keyword
        argument.
    :param facet: a :class:`FacetType` object to use to generate the
        per-document values.
    :param column: a :class:`whosh.columns.ColumnType` object to use to store
        the per-document values. If you don't specify a column object, the
        function will use the default column type for the given field.
Adds a per-document value column to an existing field which was created
    without the ``sortable`` keyword argument.
Adds a per - document value column to an existing field which was created without the sortable keyword argument .
def add_sortable(writer, fieldname, facet, column=None):
    """Adds a per-document value column to an existing field which was created
    without the ``sortable`` keyword argument.

    >>> from whoosh import index, sorting
    >>> ix = index.open_dir("indexdir")
    >>> with ix.writer() as w:
    ...   facet = sorting.FieldFacet("price")
    ...   sorting.add_sortable(w, "price", facet)
    ...

    :param writer: a :class:`whoosh.writing.IndexWriter` object.
    :param fieldname: the name of the field to add the per-document sortable
        values to. If this field doesn't exist in the writer's schema, the
        function will add a :class:`whoosh.fields.COLUMN` field to the schema,
        and you must specify the column object to using the ``column`` keyword
        argument.
    :param facet: a :class:`FacetType` object to use to generate the
        per-document values.
    :param column: a :class:`whosh.columns.ColumnType` object to use to store
        the per-document values. If you don't specify a column object, the
        function will use the default column type for the given field.
    """

    storage = writer.storage
    schema = writer.schema

    field = None
    if fieldname in schema:
        field = schema[fieldname]
        if field.column_type:
            raise Exception("%r field is already sortable" % fieldname)

    if column:
        if fieldname not in schema:
            from whoosh.fields import COLUMN
            field = COLUMN(column)
            schema.add(fieldname, field)
    else:
        if fieldname in schema:
            column = field.default_column()
        else:
            raise Exception("Field %r does not exist" % fieldname)

    searcher = writer.searcher()
    catter = facet.categorizer(searcher)
    for subsearcher, docoffset in searcher.leaf_searchers():
        catter.set_searcher(subsearcher, docoffset)
        reader = subsearcher.reader()

        if reader.has_column(fieldname):
            raise Exception("%r field already has a column" % fieldname)

        codec = reader.codec()
        segment = reader.segment()

        colname = codec.column_filename(segment, fieldname)
        colfile = storage.create_file(colname)
        try:
            colwriter = column.writer(colfile)
            for docnum in reader.all_doc_ids():
                v = catter.key_to_name(catter.key_for(None, docnum))
                cv = field.to_column_value(v)
                colwriter.add(docnum, cv)
            colwriter.finish(reader.doc_count_all())
        finally:
            colfile.close()

    field.column_type = column
def add_sortable ( writer , fieldname , facet , column = None ) : storage = writer . storage schema = writer . schema field = None if fieldname in schema : field = schema [ fieldname ] if field . column_type : raise Exception ( "%r field is already sortable" % fieldname ) if column : if fieldname not in schema : from whoosh . fields import COLUMN field = COLUMN ( column ) schema . add ( fieldname , field ) else : if fieldname in schema : column = field . default_column ( ) else : raise Exception ( "Field %r does not exist" % fieldname ) searcher = writer . searcher ( ) catter = facet . categorizer ( searcher ) for subsearcher , docoffset in searcher . leaf_searchers ( ) : catter . set_searcher ( subsearcher , docoffset ) reader = subsearcher . reader ( ) if reader . has_column ( fieldname ) : raise Exception ( "%r field already has a column" % fieldname ) codec = reader . codec ( ) segment = reader . segment ( ) colname = codec . column_filename ( segment , fieldname ) colfile = storage . create_file ( colname ) try : colwriter = column . writer ( colfile ) for docnum in reader . all_doc_ids ( ) : v = catter . key_to_name ( catter . key_for ( None , docnum ) ) cv = field . to_column_value ( v ) colwriter . add ( docnum , cv ) colwriter . finish ( reader . doc_count_all ( ) ) finally : colfile . close ( ) field . column_type = column