code: public static Expression filter(String field, String operator, Val<Expression>[] args, EbeanExprInvoker invoker) {
          if (args.length > 0) {
              SpiExpressionFactory queryEf = (SpiExpressionFactory) invoker.getServer().getExpressionFactory();
              ExpressionFactory filterEf = queryEf.createExpressionFactory();
              SpiQuery<?> query = invoker.getQuery();
              FilterExpression filter = new FilterExpression<>(field, filterEf, query);
              fillArgs(operator, args, filter);
              try {
                  BeanType type = query.getBeanDescriptor().getBeanTypeAtPath(field);
                  SpiExpressionValidation validation = new SpiExpressionValidation(type);
                  filter.validate(validation);
                  Set<String> invalid = validation.getUnknownProperties();
                  if (invalid != null && !invalid.isEmpty()) {
                      UnprocessableEntityException.throwQuery(invalid);
                  }
  
                  return filter;
              } catch (Exception e) {
                  UnprocessableEntityException.throwQuery("[" + field + "]");
              }
          }
          throw new QuerySyntaxException(Messages.get("dsl.arguments.error0", operator));
      }
docs: <p>filter.</p>
  
  @param field a {@link java.lang.String} object.
  @param operator a {@link java.lang.String} object.
  @param args an array of {@link ameba.db.dsl.QueryExprMeta.Val} objects.
  @param invoker a {@link ameba.db.ebean.filter.EbeanExprInvoker} object.
  @return a {@link io.ebean.Expression} object.