jirutka / rsql-parser:如何定义没有参数的运算符? (= empty =,= notEmpty =)

时间:2016-01-08 17:28:39

标签: java rest search-engine

我定义了两个名为=empty==notEmpty=的新自定义运算符,就像我一直这样。

public abstract class RsqlParserOperators extends RSQLOperators {
...
    public static final ComparisonOperator LIKE = new ComparisonOperator("=like=", true);
...
    public static final ComparisonOperator EMPTY = new ComparisonOperator("=empty=", false);
    public static final ComparisonOperator NOT_EMPTY = new ComparisonOperator("=notEmpty=", false);

    public static Set<ComparisonOperator> operators() {
        Set<ComparisonOperator> set = defaultOperators();
...
        set.add(LIKE);
...
        set.add(EMPTY);
        set.add(NOT_EMPTY);
        return set;
    }
}

这些新操作员的特殊之处在于他们不需要争论。

当我尝试使用其中一个时,例如使用像serie=empty=这样的过滤器时,我最终遇到了以下异常。

cz.jirutka.rsql.parser.ParseException: Encountered "<EOF>" at line 1, column 12.
Was expecting one of:
    <UNRESERVED_STR> ...
    <SINGLE_QUOTED_STR> ...
    <DOUBLE_QUOTED_STR> ...
    "(" ...

关于如何定义无参数运算符的任何想法?

感谢。

2 个答案:

答案 0 :(得分:2)

我遇到了完全相同的问题,最终创建了一个名为IS_EMPTY的新ComparisonOperator。

public static final ComparisonOperator IS_EMPTY = new ComparisonOperator("=isEmpty=", false);

它只需要一个真或假的参数

final Node rootNode = new RSQLParser(RsqlParserOperators.operators()).parse("subEntity=isEmpty=true");   

当然,您仍然需要将转换器中的参数从String转换为布尔值。

答案 1 :(得分:1)

RSQL grammar不允许无参数比较。

  

比较由选择器,运算符和参数组成。

comparison     = selector, comparison-op, arguments;

我不确定允许空论证是否是个好主意,但我会考虑一下。

您可以定义一个特殊参数,而不是自定义运算符,例如null,并在转换器中处理它。