RegexExpression.java

1
/*
2
 * Copyright OpenSearch Contributors
3
 * SPDX-License-Identifier: Apache-2.0
4
 */
5
6
package org.opensearch.sql.expression.parse;
7
8
import com.google.common.collect.ImmutableList;
9
import java.util.List;
10
import java.util.regex.Matcher;
11
import java.util.regex.Pattern;
12
import lombok.EqualsAndHashCode;
13
import lombok.Getter;
14
import lombok.ToString;
15
import org.apache.logging.log4j.LogManager;
16
import org.apache.logging.log4j.Logger;
17
import org.opensearch.sql.data.model.ExprStringValue;
18
import org.opensearch.sql.data.model.ExprValue;
19
import org.opensearch.sql.exception.ExpressionEvaluationException;
20
import org.opensearch.sql.expression.Expression;
21
22
/**
23
 * RegexExpression with regex and named capture group.
24
 */
25
@EqualsAndHashCode(callSuper = true)
26
@ToString
27
public class RegexExpression extends ParseExpression {
28
  private static final Logger log = LogManager.getLogger(RegexExpression.class);
29
  private static final Pattern GROUP_PATTERN = Pattern.compile("\\(\\?<([a-zA-Z][a-zA-Z0-9]*)>");
30
  @Getter
31
  @EqualsAndHashCode.Exclude
32
  private final Pattern regexPattern;
33
34
  /**
35
   * RegexExpression.
36
   *
37
   * @param sourceField source text field
38
   * @param pattern     pattern used for parsing
39
   * @param identifier  derived field
40
   */
41
  public RegexExpression(Expression sourceField, Expression pattern, Expression identifier) {
42
    super("regex", sourceField, pattern, identifier);
43
    this.regexPattern = Pattern.compile(pattern.valueOf().stringValue());
44
  }
45
46
  @Override
47
  ExprValue parseValue(ExprValue value) throws ExpressionEvaluationException {
48
    String rawString = value.stringValue();
49
    Matcher matcher = regexPattern.matcher(rawString);
50 1 1. parseValue : negated conditional → KILLED
    if (matcher.matches()) {
51 1 1. parseValue : replaced return value with null for org/opensearch/sql/expression/parse/RegexExpression::parseValue → KILLED
      return new ExprStringValue(matcher.group(identifierStr));
52
    }
53
    log.debug("failed to extract pattern {} from input ***", regexPattern.pattern());
54 1 1. parseValue : replaced return value with null for org/opensearch/sql/expression/parse/RegexExpression::parseValue → KILLED
    return new ExprStringValue("");
55
  }
56
57
  /**
58
   * Get list of derived fields based on parse pattern.
59
   *
60
   * @param pattern pattern used for parsing
61
   * @return list of names of the derived fields
62
   */
63
  public static List<String> getNamedGroupCandidates(String pattern) {
64
    ImmutableList.Builder<String> namedGroups = ImmutableList.builder();
65
    Matcher m = GROUP_PATTERN.matcher(pattern);
66 1 1. getNamedGroupCandidates : negated conditional → KILLED
    while (m.find()) {
67
      namedGroups.add(m.group(1));
68
    }
69 1 1. getNamedGroupCandidates : replaced return value with Collections.emptyList for org/opensearch/sql/expression/parse/RegexExpression::getNamedGroupCandidates → KILLED
    return namedGroups.build();
70
  }
71
}

Mutations

50

1.1
Location : parseValue
Killed by : org.opensearch.sql.expression.parse.RegexExpressionTest.[engine:junit-jupiter]/[class:org.opensearch.sql.expression.parse.RegexExpressionTest]/[method:resolve_not_parsable_inputs_as_empty_string()]
negated conditional → KILLED

51

1.1
Location : parseValue
Killed by : org.opensearch.sql.expression.parse.RegexExpressionTest.[engine:junit-jupiter]/[class:org.opensearch.sql.expression.parse.RegexExpressionTest]/[method:resolve_regex_groups_and_parsed_values()]
replaced return value with null for org/opensearch/sql/expression/parse/RegexExpression::parseValue → KILLED

54

1.1
Location : parseValue
Killed by : org.opensearch.sql.expression.parse.RegexExpressionTest.[engine:junit-jupiter]/[class:org.opensearch.sql.expression.parse.RegexExpressionTest]/[method:resolve_not_parsable_inputs_as_empty_string()]
replaced return value with null for org/opensearch/sql/expression/parse/RegexExpression::parseValue → KILLED

66

1.1
Location : getNamedGroupCandidates
Killed by : org.opensearch.sql.expression.parse.RegexExpressionTest.[engine:junit-jupiter]/[class:org.opensearch.sql.expression.parse.RegexExpressionTest]/[method:resolve_regex_groups_and_parsed_values()]
negated conditional → KILLED

69

1.1
Location : getNamedGroupCandidates
Killed by : org.opensearch.sql.expression.parse.RegexExpressionTest.[engine:junit-jupiter]/[class:org.opensearch.sql.expression.parse.RegexExpressionTest]/[method:resolve_regex_groups_and_parsed_values()]
replaced return value with Collections.emptyList for org/opensearch/sql/expression/parse/RegexExpression::getNamedGroupCandidates → KILLED

Active mutators

Tests examined


Report generated by PIT 1.9.0