1 | /* | |
2 | * Copyright OpenSearch Contributors | |
3 | * SPDX-License-Identifier: Apache-2.0 | |
4 | */ | |
5 | ||
6 | ||
7 | package org.opensearch.sql.expression; | |
8 | ||
9 | import org.opensearch.sql.expression.aggregation.Aggregator; | |
10 | import org.opensearch.sql.expression.aggregation.NamedAggregator; | |
11 | import org.opensearch.sql.expression.conditional.cases.CaseClause; | |
12 | import org.opensearch.sql.expression.conditional.cases.WhenClause; | |
13 | import org.opensearch.sql.expression.function.FunctionImplementation; | |
14 | import org.opensearch.sql.expression.parse.ParseExpression; | |
15 | ||
16 | /** | |
17 | * Abstract visitor for expression tree nodes. | |
18 | * @param <T> type of return value to accumulate when visiting. | |
19 | * @param <C> type of context. | |
20 | */ | |
21 | public abstract class ExpressionNodeVisitor<T, C> { | |
22 | ||
23 | public T visitNode(Expression node, C context) { | |
24 | return null; | |
25 | } | |
26 | ||
27 | /** | |
28 | * Visit children nodes in function arguments. | |
29 | * @param node function node | |
30 | * @param context context | |
31 | * @return result | |
32 | */ | |
33 | public T visitChildren(FunctionImplementation node, C context) { | |
34 | T result = defaultResult(); | |
35 | ||
36 | for (Expression child : node.getArguments()) { | |
37 | T childResult = child.accept(this, context); | |
38 | result = aggregateResult(result, childResult); | |
39 | } | |
40 |
1
1. visitChildren : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitChildren → SURVIVED |
return result; |
41 | } | |
42 | ||
43 | private T defaultResult() { | |
44 | return null; | |
45 | } | |
46 | ||
47 | private T aggregateResult(T aggregate, T nextResult) { | |
48 |
1
1. aggregateResult : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::aggregateResult → SURVIVED |
return nextResult; |
49 | } | |
50 | ||
51 | public T visitLiteral(LiteralExpression node, C context) { | |
52 |
1
1. visitLiteral : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitLiteral → KILLED |
return visitNode(node, context); |
53 | } | |
54 | ||
55 | public T visitNamed(NamedExpression node, C context) { | |
56 |
1
1. visitNamed : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitNamed → SURVIVED |
return node.getDelegated().accept(this, context); |
57 | } | |
58 | ||
59 | public T visitHighlight(HighlightExpression node, C context) { | |
60 |
1
1. visitHighlight : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitHighlight → KILLED |
return visitNode(node, context); |
61 | } | |
62 | ||
63 | public T visitReference(ReferenceExpression node, C context) { | |
64 |
1
1. visitReference : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitReference → KILLED |
return visitNode(node, context); |
65 | } | |
66 | ||
67 | public T visitParse(ParseExpression node, C context) { | |
68 |
1
1. visitParse : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitParse → SURVIVED |
return visitNode(node, context); |
69 | } | |
70 | ||
71 | public T visitFunction(FunctionExpression node, C context) { | |
72 |
1
1. visitFunction : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitFunction → SURVIVED |
return visitChildren(node, context); |
73 | } | |
74 | ||
75 | public T visitAggregator(Aggregator<?> node, C context) { | |
76 |
1
1. visitAggregator : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitAggregator → SURVIVED |
return visitChildren(node, context); |
77 | } | |
78 | ||
79 | public T visitNamedAggregator(NamedAggregator node, C context) { | |
80 |
1
1. visitNamedAggregator : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitNamedAggregator → SURVIVED |
return visitChildren(node, context); |
81 | } | |
82 | ||
83 | /** | |
84 | * Call visitFunction() by default rather than visitChildren(). | |
85 | * This makes CASE/WHEN able to be handled: | |
86 | * 1) by visitFunction() if not overwritten: ex. FilterQueryBuilder | |
87 | * 2) by visitCase/When() otherwise if any special logic: ex. ExprReferenceOptimizer | |
88 | */ | |
89 | public T visitCase(CaseClause node, C context) { | |
90 |
1
1. visitCase : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitCase → SURVIVED |
return visitFunction(node, context); |
91 | } | |
92 | ||
93 | public T visitWhen(WhenClause node, C context) { | |
94 |
1
1. visitWhen : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitWhen → SURVIVED |
return visitFunction(node, context); |
95 | } | |
96 | ||
97 | public T visitNamedArgument(NamedArgumentExpression node, C context) { | |
98 |
1
1. visitNamedArgument : replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitNamedArgument → SURVIVED |
return visitNode(node, context); |
99 | } | |
100 | } | |
Mutations | ||
40 |
1.1 |
|
48 |
1.1 |
|
52 |
1.1 |
|
56 |
1.1 |
|
60 |
1.1 |
|
64 |
1.1 |
|
68 |
1.1 |
|
72 |
1.1 |
|
76 |
1.1 |
|
80 |
1.1 |
|
90 |
1.1 |
|
94 |
1.1 |
|
98 |
1.1 |