1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.metapath.cst.logic;
7   
8   import dev.metaschema.core.metapath.DynamicContext;
9   import dev.metaschema.core.metapath.IExpression;
10  import dev.metaschema.core.metapath.cst.IExpressionVisitor;
11  import dev.metaschema.core.metapath.function.ComparisonFunctions;
12  import dev.metaschema.core.metapath.item.ISequence;
13  import dev.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
14  import dev.metaschema.core.metapath.item.atomic.IBooleanItem;
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  
17  /**
18   * Supports Metapath
19   * <a href="https://www.w3.org/TR/xpath-31/#id-general-comparisons">general
20   * comparisons</a>.
21   */
22  public class GeneralComparison
23      extends AbstractComparison {
24  
25    /**
26     * Create a new value comparison expression.
27     *
28     * @param text
29     *          the parsed text of the expression
30     * @param left
31     *          the expression to compare against
32     * @param operator
33     *          the comparison operator
34     * @param right
35     *          the expression to compare with
36     */
37    public GeneralComparison(
38        @NonNull String text,
39        @NonNull IExpression left,
40        @NonNull ComparisonFunctions.Operator operator,
41        @NonNull IExpression right) {
42      super(text, left, operator, right);
43    }
44  
45    @Override
46    public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
47      return visitor.visitGeneralComparison(this, context);
48    }
49  
50    @Override
51    protected ISequence<? extends IBooleanItem> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
52      ISequence<? extends IAnyAtomicItem> leftItems = ISequence.of(getLeft().accept(dynamicContext, focus).atomize());
53      ISequence<? extends IAnyAtomicItem> rightItems = ISequence.of(getRight().accept(dynamicContext, focus).atomize());
54      return ISequence.of(ComparisonFunctions.generalComparison(leftItems, getOperator(), rightItems, dynamicContext));
55    }
56  }