1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.metapath.cst.items;
7   
8   import java.util.List;
9   
10  import dev.metaschema.core.metapath.IExpression;
11  import dev.metaschema.core.metapath.cst.IExpressionVisitor;
12  import dev.metaschema.core.metapath.item.IItem;
13  import dev.metaschema.core.metapath.item.ISequence;
14  import dev.metaschema.core.util.ObjectUtils;
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  
17  /**
18   * The CST node for a Metapath
19   * <a href="https://www.w3.org/TR/xpath-31/#combining_seq">intersect
20   * expression</a>.
21   */
22  public class Intersect
23      extends AbstractFilterExpression {
24  
25    /**
26     * Construct a new Metapath intersect expression CST node.
27     *
28     * @param text
29     *          the parsed text of the expression
30     * @param left
31     *          an expression indicating the items to filter
32     * @param right
33     *          an expression indicating the items to keep
34     */
35    public Intersect(
36        @NonNull String text,
37        @NonNull IExpression left,
38        @NonNull IExpression right) {
39      super(text, left, right);
40    }
41  
42    @Override
43    protected ISequence<?> applyFilterTo(@NonNull List<? extends IItem> source, @NonNull List<? extends IItem> items) {
44      return ISequence.of(ObjectUtils.notNull(source.stream()
45          .distinct()
46          .filter(items::contains)));
47    }
48  
49    @Override
50    public <RESULT, CONTEXT> RESULT accept(@NonNull IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
51      return visitor.visitIntersect(this, context);
52    }
53  }