ExpressionNodeVisitor.java

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
Location : visitChildren
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitChildren → SURVIVED

48

1.1
Location : aggregateResult
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::aggregateResult → SURVIVED

52

1.1
Location : visitLiteral
Killed by : org.opensearch.sql.analysis.ExpressionReferenceOptimizerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.ExpressionReferenceOptimizerTest]/[method:expression_without_aggregation_should_not_be_replaced()]
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitLiteral → KILLED

56

1.1
Location : visitNamed
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitNamed → SURVIVED

60

1.1
Location : visitHighlight
Killed by : org.opensearch.sql.analysis.AnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.AnalyzerTest]/[method:project_highlight()]
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitHighlight → KILLED

64

1.1
Location : visitReference
Killed by : org.opensearch.sql.planner.logical.LogicalSortTest.[engine:junit-jupiter]/[class:org.opensearch.sql.planner.logical.LogicalSortTest]/[method:analyze_sort_with_two_field_with_default_option()]
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitReference → KILLED

68

1.1
Location : visitParse
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitParse → SURVIVED

72

1.1
Location : visitFunction
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitFunction → SURVIVED

76

1.1
Location : visitAggregator
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitAggregator → SURVIVED

80

1.1
Location : visitNamedAggregator
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitNamedAggregator → SURVIVED

90

1.1
Location : visitCase
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitCase → SURVIVED

94

1.1
Location : visitWhen
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitWhen → SURVIVED

98

1.1
Location : visitNamedArgument
Killed by : none
replaced return value with null for org/opensearch/sql/expression/ExpressionNodeVisitor::visitNamedArgument → SURVIVED

Active mutators

Tests examined


Report generated by PIT 1.9.0