def generate_keys(transform, field, evaluator, value):
    '''
    Generates the query keys for the default structure of the query index.
    The structure of the key: [field_name, value].
    It supports custom sorting, in which case the value is substituted
    bu the result of transform(value).

    @param transform: callable of 1 argument
    @param field: C{str} field name
    @param evaluator: C{Evaluator}
    @param value: value
    @rtype: dict
    @returns: keys to use to query the view
    '''

    if evaluator == Evaluator.equals:
        return dict(key=(field, transform(value)))
    if evaluator == Evaluator.le:
        return dict(startkey=(field, ), endkey=(field, transform(value)))
    if evaluator == Evaluator.ge:
        return dict(startkey=(field, transform(value)), endkey=(field, {}))
    if evaluator == Evaluator.between:
        return dict(startkey=(field, transform(value[0])),
                    endkey=(field, transform(value[1])))
    if evaluator == Evaluator.inside:
        return dict(keys=[(field, transform(x)) for x in value])
    if evaluator == Evaluator.none:
        return dict(startkey=(field, ), endkey=(field, {}))