'Filter a set of rows by the effective virtual filter
@param rows: a Rows object
@param start: index of the first matching record to select
@param limit: maximum number of records to select'

def __call__(self, rows, start=None, limit=None):

    vfltr = self.get_filter()
    if ((rows is None) or (vfltr is None)):
        return rows
    resource = self.resource
    if (start is None):
        start = 0
    first = start
    if (limit is not None):
        last = (start + limit)
        if (last < first):
            (first, last) = (last, first)
        if (first < 0):
            first = 0
        if (last < 0):
            last = 0
    else:
        last = None
    i = 0
    result = []
    append = result.append
    for row in rows:
        if ((last is not None) and (i >= last)):
            break
        success = vfltr(resource, row, virtual=True)
        if (success or (success is None)):
            if (i >= first):
                append(row)
            i += 1
    return Rows(rows.db, result, colnames=rows.colnames, compact=False)
