• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pkiraly / metadata-qa-api / #731

29 Oct 2025 07:42AM UTC coverage: 86.347% (-0.007%) from 86.354%
#731

push

pkiraly
Improve OR with priorityOnFail

2 of 5 new or added lines in 1 file covered. (40.0%)

5673 of 6570 relevant lines covered (86.35%)

0.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

45.78
/src/main/java/de/gwdg/metadataqa/api/rule/logical/OrChecker.java
1
package de.gwdg.metadataqa.api.rule.logical;
2

3
import de.gwdg.metadataqa.api.counter.FieldCounter;
4
import de.gwdg.metadataqa.api.json.DataElement;
5
import de.gwdg.metadataqa.api.model.XmlFieldInstance;
6
import de.gwdg.metadataqa.api.model.selector.Selector;
7
import de.gwdg.metadataqa.api.rule.RuleChecker;
8
import de.gwdg.metadataqa.api.rule.RuleCheckerOutput;
9
import de.gwdg.metadataqa.api.rule.RuleCheckingOutputStatus;
10
import de.gwdg.metadataqa.api.rule.RuleCheckingOutputType;
11
import de.gwdg.metadataqa.api.rule.singlefieldchecker.DependencyChecker;
12
import de.gwdg.metadataqa.api.rule.singlefieldchecker.MinCountChecker;
13

14
import java.util.ArrayList;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.HashMap;
18
import java.util.logging.Logger;
19

20
public class OrChecker extends LogicalChecker {
21

22
  private static final Logger LOGGER = Logger.getLogger(OrChecker.class.getCanonicalName());
1✔
23

24
  private static final long serialVersionUID = 1114999259831619599L;
25
  public static final String PREFIX = "or";
26
  private boolean priorityOnFail = false;
1✔
27

28
  /**
29
   * @param field The field
30
   * @param checkers The list of checkers
31
   */
32
  public OrChecker(DataElement field, List<RuleChecker> checkers) {
33
    this(field, field.getLabel(), checkers);
1✔
34
  }
1✔
35

36
  public OrChecker(DataElement field, String header, List<RuleChecker> checkers) {
37
    super(field, header + ":" + PREFIX + ":" + getChildrenHeader(checkers));
1✔
38
    this.checkers = checkers;
1✔
39
  }
1✔
40

41
  @Override
42
  public void update(Selector selector, FieldCounter<RuleCheckerOutput> results, RuleCheckingOutputType outputType) {
43
    update(selector, results, outputType, null);
1✔
44
  }
1✔
45

46
  public void update(Selector selector,
47
                     FieldCounter<RuleCheckerOutput> results,
48
                     RuleCheckingOutputType outputType,
49
                     FieldCounter<RuleCheckerOutput> globalResults) {
50
    if (isDebug())
1✔
51
      LOGGER.info(this.getClass().getSimpleName() + " " + this.id + ", alwaysCheckDependencies: " + alwaysCheckDependencies + ", priorityOnFail: " + priorityOnFail + " - " + results);
×
52

53
    if (globalResults == null) {
1✔
54
      globalResults = results;
1✔
55
    }
56

57
    // if NA and dependency checker FAILED -> FAILED
58
    var allPassed = false;
1✔
59
    var isNA = false;
1✔
60
    RuleCheckerOutput output = null;
1✔
61
    List<XmlFieldInstance> instances = selector.get(field);
1✔
62
    List<RuleCheckingOutputStatus> statuses = new ArrayList<>();
1✔
63
    if (instances != null && !instances.isEmpty()) {
1✔
64
      if (isDebug())
1✔
NEW
65
        LOGGER.info("non empty");
×
66
      FieldCounter<RuleCheckerOutput> localResults2 = new FieldCounter<>();
1✔
67
      for (RuleChecker checker : checkers) {
1✔
68
        if (checker instanceof DependencyChecker) {
1✔
69
          ((DependencyChecker) checker).update(selector, localResults2, outputType, results);
×
70
        } else {
71
          checker.update(selector, localResults2, outputType);
1✔
72
        }
73
        String key = outputType.equals(RuleCheckingOutputType.BOTH)
1✔
74
                   ? checker.getIdOrHeader(RuleCheckingOutputType.SCORE)
1✔
75
                   : checker.getIdOrHeader();
1✔
76
        RuleCheckingOutputStatus status = localResults2.get(key).getStatus();
1✔
77
        statuses.add(status);
1✔
78
        if (!priorityOnFail && status.equals(RuleCheckingOutputStatus.PASSED)) {
1✔
79
          allPassed = true;
1✔
80
          break;
1✔
81
        }
82
      }
1✔
83
    } else {
1✔
NEW
84
      if (isDebug())
×
NEW
85
        LOGGER.info("empty branch");
×
86
      isNA = true;
×
87
      for (RuleChecker checker : checkers) {
×
88
        if (checker instanceof MinCountChecker) {
×
89
          MinCountChecker minCountChecker = (MinCountChecker) checker;
×
90
          if (!minCountChecker.isEmptyInstancesAllowed() || minCountChecker.getMinCount() > 0)
×
91
            allPassed = false;
×
92
        }
×
93
        else if (alwaysCheckDependencies && checker instanceof DependencyChecker) {
×
94
          DependencyChecker dependencyChecker = (DependencyChecker) checker;
×
95
          Map<String, Boolean> localResult = dependencyChecker.getResult(outputType, results);
×
96
          boolean dependenciesPassed = localResult.get("allPassed");
×
97
          isNA = localResult.get("isNA");
×
98
          if (isNA) {
×
99
            output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.NA);
×
100
          } else {
101
            if (dependenciesPassed)
×
102
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.PASSED);
×
103
            else
104
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.FAILED);
×
105
          }
106
          statuses.add(output.getStatus());
×
107
        }
108

109
        // if (!allPassed)
110
        //   break;
111
      }
×
112
    }
113

114
    if (priorityOnFail) {
1✔
115
      output = null;
×
116
      allPassed = !statuses.contains(RuleCheckingOutputStatus.FAILED);
×
117
      if (!allPassed || statuses.contains(RuleCheckingOutputStatus.PASSED))
×
118
        isNA = false;
×
119
    }
120

121
    if (output != null) {
1✔
122
      addOutput(results, output, outputType);
×
123
    } else {
124
      addOutput(results, isNA, allPassed, outputType);
1✔
125
    }
126

127
    if (isDebug()) {
1✔
128
      RuleCheckingOutputStatus status = output != null
×
129
        ? output.getStatus()
×
130
        : RuleCheckingOutputStatus.create(isNA, allPassed, isMandatory());
×
131
      LOGGER.info(String.format("%s %s) isNA: %s, allPassed: %s, result: %s",
×
132
        this.getClass().getSimpleName(), this.id, isNA, allPassed, status));
×
133
    }
134
  }
1✔
135

136
  public Map<RuleCheckingOutputType, Object> getResult(RuleCheckingOutputType outputType,
137
                                                       FieldCounter<RuleCheckerOutput> globalResults) {
138
    Map<RuleCheckingOutputType, Object> result = new HashMap();
×
139
    if (outputType.equals(RuleCheckingOutputType.STATUS)) {
×
140
      result.put(RuleCheckingOutputType.STATUS, globalResults.get(getIdOrHeader()));
×
141
    } else if (outputType.equals(RuleCheckingOutputType.SCORE)) {
×
142
      result.put(RuleCheckingOutputType.SCORE, globalResults.get(getIdOrHeader()));
×
143
    } else if (outputType.equals(RuleCheckingOutputType.BOTH)) {
×
144
      result.put(RuleCheckingOutputType.STATUS, globalResults.get(getIdOrHeader() + ":status"));
×
145
      result.put(RuleCheckingOutputType.SCORE, globalResults.get(getIdOrHeader() + ":score"));
×
146
    }
147
    return result;
×
148
  }
149

150
  public void setPriorityOnFail(boolean priorityOnFail) {
151
    this.priorityOnFail = priorityOnFail;
×
152
  }
×
153
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc