1
2
3
4
5
6 package dev.metaschema.core.metapath.cst;
7
8 import java.util.List;
9 import java.util.function.Supplier;
10 import java.util.stream.Collectors;
11
12 import dev.metaschema.core.metapath.DynamicContext;
13 import dev.metaschema.core.metapath.IExpression;
14 import dev.metaschema.core.metapath.StaticMetapathException;
15 import dev.metaschema.core.metapath.function.IFunction;
16 import dev.metaschema.core.metapath.item.IItem;
17 import dev.metaschema.core.metapath.item.ISequence;
18 import dev.metaschema.core.util.ObjectUtils;
19 import edu.umd.cs.findbugs.annotations.NonNull;
20 import nl.talsmasoftware.lazy4j.Lazy;
21
22
23
24
25
26
27
28
29
30
31
32
33
34 public class StaticFunctionCall
35 extends AbstractExpression {
36 @NonNull
37 private final Lazy<IFunction> functionSupplier;
38 @NonNull
39 private final List<IExpression> arguments;
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public StaticFunctionCall(
54 @NonNull String text,
55 @NonNull Supplier<IFunction> functionSupplier,
56 @NonNull List<IExpression> arguments) {
57 super(text);
58 this.functionSupplier = ObjectUtils.notNull(Lazy.of(functionSupplier));
59 this.arguments = arguments;
60 }
61
62
63
64
65
66
67
68
69
70 @NonNull
71 public IFunction getFunction() {
72 IFunction function = functionSupplier.get();
73 if (function == null) {
74 throw new StaticMetapathException(
75 StaticMetapathException.NO_FUNCTION_MATCH,
76 String.format(
77 "No matching function found for the given name and arguments"));
78 }
79 return function;
80 }
81
82 @Override
83 public List<IExpression> getChildren() {
84 return arguments;
85 }
86
87 @Override
88 public Class<? extends IItem> getBaseResultType() {
89 return getFunction().getResult().getType().getItemClass();
90 }
91
92 @SuppressWarnings("null")
93 @Override
94 public String toCSTString() {
95 return String.format("%s[name=%s, arity=%d]", getClass().getName(), getFunction().getQName(),
96 getFunction().arity());
97 }
98
99 @Override
100 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
101 return visitor.visitStaticFunctionCall(this, context);
102 }
103
104 @Override
105 protected ISequence<?> evaluate(DynamicContext dynamicContext, ISequence<?> focus) {
106 List<ISequence<?>> arguments = ObjectUtils.notNull(this.arguments.stream()
107 .map(expression -> expression.accept(dynamicContext, focus).contentsAsSequence())
108 .collect(Collectors.toList()));
109
110 IFunction function = getFunction();
111 return function.execute(arguments, dynamicContext, focus);
112 }
113 }