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

pkiraly / metadata-qa-api / #738

03 Dec 2025 10:03PM UTC coverage: 86.157% (-0.1%) from 86.256%
#738

push

pkiraly
Improve OR

0 of 8 new or added lines in 1 file covered. (0.0%)

42 existing lines in 3 files now uncovered.

5670 of 6581 relevant lines covered (86.16%)

0.86 hits per line

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

42.39
/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✔
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 if (checker instanceof AndChecker) {
1✔
UNCOV
71
          ((AndChecker) checker).update(selector, localResults2, outputType, results);
×
72
        } else {
73
          checker.update(selector, localResults2, outputType);
1✔
74
        }
75
        String key = outputType.equals(RuleCheckingOutputType.BOTH)
1✔
76
                   ? checker.getIdOrHeader(RuleCheckingOutputType.SCORE)
1✔
77
                   : checker.getIdOrHeader();
1✔
78
        RuleCheckingOutputStatus status = localResults2.get(key).getStatus();
1✔
79
        statuses.add(status);
1✔
80
        if (!priorityOnFail && status.equals(RuleCheckingOutputStatus.PASSED)) {
1✔
81
          allPassed = true;
1✔
82
          break;
1✔
83
        }
84
      }
1✔
85
    } else {
1✔
86
      if (isDebug())
×
87
        LOGGER.info("empty branch");
×
88
      isNA = true;
×
89
      for (RuleChecker checker : checkers) {
×
90
        if (checker instanceof MinCountChecker) {
×
91
          MinCountChecker minCountChecker = (MinCountChecker) checker;
×
92
          if (!minCountChecker.isEmptyInstancesAllowed() || minCountChecker.getMinCount() > 0)
×
93
            allPassed = false;
×
94
        }
×
95
        else if (alwaysCheckDependencies && checker instanceof DependencyChecker) {
×
96
          DependencyChecker dependencyChecker = (DependencyChecker) checker;
×
97
          Map<String, Boolean> localResult = dependencyChecker.getResult(outputType, results);
×
98
          boolean dependenciesPassed = localResult.get("allPassed");
×
99
          var localIsNA = localResult.get("isNA");
×
UNCOV
100
          if (localIsNA) {
×
101
            output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.NA);
×
102
          } else {
UNCOV
103
            if (dependenciesPassed)
×
104
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.PASSED);
×
105
            else
106
              output = new RuleCheckerOutput(this, RuleCheckingOutputStatus.FAILED);
×
107
          }
UNCOV
108
          statuses.add(output.getStatus());
×
109
        }
110

111
        // if (!allPassed)
112
        //   break;
UNCOV
113
      }
×
114
    }
115

116
    if (priorityOnFail) {
1✔
117
      output = null;
×
118
      allPassed = statuses.contains(RuleCheckingOutputStatus.PASSED);
×
NEW
119
      if (!statuses.isEmpty()
×
NEW
120
          && !containsOnlyNAs(statuses)
×
NEW
121
          && (!allPassed || statuses.contains(RuleCheckingOutputStatus.PASSED)))
×
UNCOV
122
        isNA = false;
×
123
    }
124

125
    if (output != null) {
1✔
UNCOV
126
      addOutput(results, output, outputType);
×
127
    } else {
128
      addOutput(results, isNA, allPassed, outputType);
1✔
129
    }
130

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

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

154
  public void setPriorityOnFail(boolean priorityOnFail) {
UNCOV
155
    this.priorityOnFail = priorityOnFail;
×
UNCOV
156
  }
×
157

158
  private boolean containsOnlyNAs(List<RuleCheckingOutputStatus> statuses) {
NEW
159
    for (RuleCheckingOutputStatus status : statuses) {
×
NEW
160
      if (!status.equals(RuleCheckingOutputStatus.NA))
×
NEW
161
        return false;
×
NEW
162
    }
×
NEW
163
    return true;
×
164
  }
165
}
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