def enumerateIndexes():
    #   Return a list of ( index_name, type ) pairs for the initial
    #   index set.
    return ( ('tm_serial', 'FieldIndex')
           , ('topicTypes', 'KeywordIndex')
           # This makes title sortable. We were never searching it anyway
           , ('Title', 'FieldIndex')
           , ('Date', 'DateIndex')
           , ('created', 'DateIndex')
           , ('effective', 'DateIndex')
           , ('expires', 'DateIndex')
           , ('modified', 'DateIndex')
           , ('effectiveRange', 'DateRangeIndex')
           )

def enumerateColumns():
    #   Return a sequence of schema names to be cached.
    return ( 'getId'
           , 'meta_type'
           , 'tm_serial'
           , 'topicTypes'
           , 'portal_type'
           )


def install(self):
    """ Initialize indexes """
    catalog = getattr(self, 'portal_catalog')
    
    indexes = {}
    indexobjects = catalog.getIndexObjects()
    for index in indexobjects:
        indexes[index.__name__] = index

    # Content indexes
    for index_name, index_type in enumerateIndexes():
        if not index_name in indexes:
            catalog.manage_addIndex(index_name, index_type)
        else:
            index = indexes[index_name]
            indextype = catalog.__class__.__name__
            if indextype != index_type:
                catalog.manage_delIndex((index_name,))
                catalog.manage_addIndex(index_name, index_type)

    columns = catalog.schema()
    # Cached metadata
    for column_name in enumerateColumns():
        #TODO: Remove redundant metadata coloums.
        if not column_name in columns:
            catalog.manage_addColumn(column_name)

