QualifierAnalyzer.java

1
/*
2
 * Copyright OpenSearch Contributors
3
 * SPDX-License-Identifier: Apache-2.0
4
 */
5
6
7
package org.opensearch.sql.analysis;
8
9
import java.util.Arrays;
10
import java.util.Optional;
11
import lombok.RequiredArgsConstructor;
12
import org.opensearch.sql.analysis.symbol.Namespace;
13
import org.opensearch.sql.analysis.symbol.Symbol;
14
import org.opensearch.sql.ast.expression.QualifiedName;
15
import org.opensearch.sql.common.antlr.SyntaxCheckException;
16
import org.opensearch.sql.exception.SemanticCheckException;
17
18
/**
19
 * Analyzer that analyzes qualifier(s) in a full field name.
20
 */
21
@RequiredArgsConstructor
22
public class QualifierAnalyzer {
23
24
  private final AnalysisContext context;
25
26
  public String unqualified(String... parts) {
27 1 1. unqualified : replaced return value with "" for org/opensearch/sql/analysis/QualifierAnalyzer::unqualified → KILLED
    return unqualified(QualifiedName.of(Arrays.asList(parts)));
28
  }
29
30
  /**
31
   * Get unqualified name if its qualifier symbol found is in index namespace
32
   * on type environment. Unqualified name means name with qualifier removed.
33
   * For example, unqualified name of "accounts.age" or "acc.age" is "age".
34
   *
35
   * @return  unqualified name if criteria met above, otherwise original name
36
   */
37
  public String unqualified(QualifiedName fullName) {
38 2 1. unqualified : negated conditional → KILLED
2. unqualified : replaced return value with "" for org/opensearch/sql/analysis/QualifierAnalyzer::unqualified → KILLED
    return isQualifierIndexOrAlias(fullName) ? fullName.rest().toString() : fullName.toString();
39
  }
40
41
  private boolean isQualifierIndexOrAlias(QualifiedName fullName) {
42
    Optional<String> qualifier = fullName.first();
43 1 1. isQualifierIndexOrAlias : negated conditional → KILLED
    if (qualifier.isPresent()) {
44 1 1. isQualifierIndexOrAlias : negated conditional → KILLED
      if (isFieldName(qualifier.get())) {
45 1 1. isQualifierIndexOrAlias : replaced boolean return with true for org/opensearch/sql/analysis/QualifierAnalyzer::isQualifierIndexOrAlias → KILLED
        return false;
46
      }
47 1 1. isQualifierIndexOrAlias : removed call to org/opensearch/sql/analysis/QualifierAnalyzer::resolveQualifierSymbol → KILLED
      resolveQualifierSymbol(fullName, qualifier.get());
48 1 1. isQualifierIndexOrAlias : replaced boolean return with false for org/opensearch/sql/analysis/QualifierAnalyzer::isQualifierIndexOrAlias → KILLED
      return true;
49
    }
50 1 1. isQualifierIndexOrAlias : replaced boolean return with true for org/opensearch/sql/analysis/QualifierAnalyzer::isQualifierIndexOrAlias → KILLED
    return false;
51
  }
52
53
  private boolean isFieldName(String qualifier) {
54
    try {
55
      // Resolve the qualifier in Namespace.FIELD_NAME
56
      context.peek().resolve(new Symbol(Namespace.FIELD_NAME, qualifier));
57 1 1. isFieldName : replaced boolean return with false for org/opensearch/sql/analysis/QualifierAnalyzer::isFieldName → KILLED
      return true;
58
    } catch (SemanticCheckException e2) {
59 1 1. isFieldName : replaced boolean return with true for org/opensearch/sql/analysis/QualifierAnalyzer::isFieldName → KILLED
      return false;
60
    }
61
  }
62
63
  private void resolveQualifierSymbol(QualifiedName fullName, String qualifier) {
64
    try {
65
      context.peek().resolve(new Symbol(Namespace.INDEX_NAME, qualifier));
66
    } catch (SemanticCheckException e) {
67
      // Throw syntax check intentionally to indicate fall back to old engine.
68
      // Need change to semantic check exception in future.
69
      throw new SyntaxCheckException(String.format(
70
          "The qualifier [%s] of qualified name [%s] must be an field name, index name or its "
71
              + "alias", qualifier, fullName));
72
    }
73
  }
74
75
}

Mutations

27

1.1
Location : unqualified
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_original_name_if_no_qualifier()]
replaced return value with "" for org/opensearch/sql/analysis/QualifierAnalyzer::unqualified → KILLED

38

1.1
Location : unqualified
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_original_name_if_no_qualifier()]
negated conditional → KILLED

2.2
Location : unqualified
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_original_name_if_no_qualifier()]
replaced return value with "" for org/opensearch/sql/analysis/QualifierAnalyzer::unqualified → KILLED

43

1.1
Location : isQualifierIndexOrAlias
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_original_name_if_no_qualifier()]
negated conditional → KILLED

44

1.1
Location : isQualifierIndexOrAlias
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_report_error_if_qualifier_is_not_exist()]
negated conditional → KILLED

45

1.1
Location : isQualifierIndexOrAlias
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_qualified_name_if_qualifier_is_field()]
replaced boolean return with true for org/opensearch/sql/analysis/QualifierAnalyzer::isQualifierIndexOrAlias → KILLED

47

1.1
Location : isQualifierIndexOrAlias
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_report_error_if_qualifier_is_not_exist()]
removed call to org/opensearch/sql/analysis/QualifierAnalyzer::resolveQualifierSymbol → KILLED

48

1.1
Location : isQualifierIndexOrAlias
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_qualified_name_if_qualifier_is_index()]
replaced boolean return with false for org/opensearch/sql/analysis/QualifierAnalyzer::isQualifierIndexOrAlias → KILLED

50

1.1
Location : isQualifierIndexOrAlias
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_original_name_if_no_qualifier()]
replaced boolean return with true for org/opensearch/sql/analysis/QualifierAnalyzer::isQualifierIndexOrAlias → KILLED

57

1.1
Location : isFieldName
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_return_qualified_name_if_qualifier_is_field()]
replaced boolean return with false for org/opensearch/sql/analysis/QualifierAnalyzer::isFieldName → KILLED

59

1.1
Location : isFieldName
Killed by : org.opensearch.sql.analysis.QualifierAnalyzerTest.[engine:junit-jupiter]/[class:org.opensearch.sql.analysis.QualifierAnalyzerTest]/[method:should_report_error_if_qualifier_is_not_exist()]
replaced boolean return with true for org/opensearch/sql/analysis/QualifierAnalyzer::isFieldName → KILLED

Active mutators

Tests examined


Report generated by PIT 1.9.0