code: public static <A extends Enum<A> & FieldNameProvider, T> Specification<T> parse(final String rsql,
              final Class<A> fieldNameProvider, final VirtualPropertyReplacer virtualPropertyReplacer,
              final Database database) {
          return new RSQLSpecification<>(rsql.toLowerCase(), fieldNameProvider, virtualPropertyReplacer, database);
      }
docs: parses an RSQL valid string into an JPA {@link Specification} which then
  can be used to filter for JPA entities with the given RSQL query.
  
  @param rsql
  the rsql query
  @param fieldNameProvider
  the enum class type which implements the
  {@link FieldNameProvider}
  @param virtualPropertyReplacer
  holds the logic how the known macros have to be resolved; may
  be <code>null</code>
  @param database
  in use
  
  @return an specification which can be used with JPA
  @throws RSQLParameterUnsupportedFieldException
  if a field in the RSQL string is used but not provided by the
  given {@code fieldNameProvider}
  @throws RSQLParameterSyntaxException
  if the RSQL syntax is wrong