protected <ENTITY> SqlPredicateFragment render(
            final Function<Field<ENTITY>, String> columnNamer,
            final Function<Field<ENTITY>, Class<?>> columnDbTypeFunction,
            final FieldPredicate<ENTITY> predicate) {

        final PredicateType pt = predicate.getPredicateType();
        final Field<ENTITY> f  = predicate.getField();
        final String cn        = columnNamer.apply(f);

        switch (pt) {
            // Constants
            case ALWAYS_TRUE  : return alwaysTrue();
            case ALWAYS_FALSE : return alwaysFalse();

            // Reference
            case IS_NULL     : return isNull(cn);
            case IS_NOT_NULL : return isNotNull(cn);

            // Comparable
            case EQUAL            : return equal(cn, columnDbTypeFunction.apply(f), predicate);
            case NOT_EQUAL        : return notEqual(cn, columnDbTypeFunction.apply(f), predicate);
            case GREATER_THAN     : return greaterThan(cn, columnDbTypeFunction.apply(f), predicate);
            case GREATER_OR_EQUAL : return greaterOrEqual(cn, columnDbTypeFunction.apply(f), predicate);
            case LESS_THAN        : return lessThan(cn, columnDbTypeFunction.apply(f), predicate);
            case LESS_OR_EQUAL    : return lessOrEqual(cn, columnDbTypeFunction.apply(f), predicate);
            case BETWEEN          : return between(cn, columnDbTypeFunction.apply(f), predicate);
            case NOT_BETWEEN      : return notBetween(cn, columnDbTypeFunction.apply(f), predicate);
            case IN               : return in(cn, columnDbTypeFunction.apply(f), predicate);
            case NOT_IN           : return notIn(cn, columnDbTypeFunction.apply(f), predicate);

            // String
            case EQUAL_IGNORE_CASE     : return equalIgnoreCase(cn, predicate);
            case NOT_EQUAL_IGNORE_CASE : return notEqualIgnoreCase(cn, predicate);

            case STARTS_WITH                 : return startsWith(cn, predicate);
            case NOT_STARTS_WITH             : return notStartsWith(cn, predicate);
            case STARTS_WITH_IGNORE_CASE     : return startsWithIgnoreCase(cn, predicate);
            case NOT_STARTS_WITH_IGNORE_CASE : return notStartsWithIgnoreCase(cn, predicate);

            case ENDS_WITH                 : return endsWith(cn, predicate);
            case NOT_ENDS_WITH             : return notEndsWith(cn, predicate);
            case ENDS_WITH_IGNORE_CASE     : return endsWithIgnoreCase(cn, predicate);
            case NOT_ENDS_WITH_IGNORE_CASE : return notEndsWithIgnoreCase(cn, predicate);

            case CONTAINS                 : return contains(cn, predicate);
            case NOT_CONTAINS             : return notContains(cn, predicate);
            case CONTAINS_IGNORE_CASE     : return containsIgnoreCase(cn, predicate);
            case NOT_CONTAINS_IGNORE_CASE : return notContainsIgnoreCase(cn, predicate);

            case IS_EMPTY     : return isEmpty(cn);
            case IS_NOT_EMPTY : return isNotEmpty(cn);
            default : throw new UnsupportedOperationException(
                "Unknown PredicateType  " + pt.name() + ". Column name:" +
                    predicate.getField().identifier().getColumnId()
            );
        }
    }
@author Per Minborg
@author Emil Forslund
runtime-parent/runtime-core/src/main/java/com/speedment/runtime/core/abstracts/AbstractFieldPredicateView.java