Skip to content

Commit 01ec1ce

Browse files
committed
more consistent results for AnalysisExpression and AssertionExpression
1 parent b45ebb3 commit 01ec1ce

File tree

6 files changed

+41
-53
lines changed

6 files changed

+41
-53
lines changed

src/java/org/tensorics/core/analysis/AnalysisResult.java

+17-15
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313

1414
import org.tensorics.core.analysis.expression.AssertionExpression;
1515

16-
import com.google.common.collect.ImmutableList;
16+
import com.google.common.collect.ImmutableMap;
1717

1818
public class AnalysisResult implements Serializable {
1919

2020
private static final long serialVersionUID = 1L;
2121

22-
private final List<AssertionResult> assertionResults;
22+
/* We on purpose we use a guava immutable map here, because it preserves insertion order */
23+
private final ImmutableMap<AssertionExpression, AssertionResult> assertionResults;
2324
private final AssertionStatus overallStatus;
2425

2526
public AnalysisResult(Builder builder) {
@@ -34,15 +35,17 @@ public static final Builder builder(AssertionStatus overallStatus) {
3435
public static final class Builder {
3536

3637
private final AssertionStatus overallStatus;
37-
private final ImmutableList.Builder<AssertionResult> resultsBuilder = ImmutableList.builder();
38+
private final ImmutableMap.Builder<AssertionExpression, AssertionResult> resultsBuilder = ImmutableMap
39+
.builder();
3840

3941
Builder(AssertionStatus overallStatus) {
4042
this.overallStatus = requireNonNull(overallStatus, "overallStatus must not be null.");
4143
}
4244

43-
public Builder add(AssertionResult result) {
45+
public Builder put(AssertionExpression expression, AssertionResult result) {
46+
requireNonNull(expression, "expression to add must not be null.");
4447
requireNonNull(result, "result to add must not be null.");
45-
resultsBuilder.add(result);
48+
resultsBuilder.put(expression, result);
4649
return this;
4750
}
4851

@@ -90,21 +93,20 @@ public boolean equals(Object obj) {
9093
return true;
9194
}
9295

93-
public List<AssertionResult> assertionResults() {
94-
return this.assertionResults;
95-
}
96-
9796
public List<AssertionExpression> assertions() {
98-
return this.assertionResults.stream().map(a -> a.assertion()).collect(Collectors.toList());
97+
return this.assertionResults.keySet().stream().collect(Collectors.toList());
9998
}
10099

101100
public AssertionStatus statusFor(AssertionExpression assertion) {
102-
for (AssertionResult assertionResult : this.assertionResults) {
103-
if (assertion.equals(assertionResult.assertion())) {
104-
return assertionResult.status();
105-
}
101+
return resultFor(assertion).status();
102+
103+
}
104+
105+
public AssertionResult resultFor(AssertionExpression assertion) {
106+
if (!assertionResults.containsKey(assertion)) {
107+
throw new NoSuchElementException("No result available for assertion'" + assertion + "'.");
106108
}
107-
throw new NoSuchElementException("No result available for assertion'" + assertion + "'.");
109+
return assertionResults.get(assertion);
108110
}
109111

110112
public AssertionStatus overallStatus() {

src/java/org/tensorics/core/analysis/AssertionResult.java

+5-24
Original file line numberDiff line numberDiff line change
@@ -24,40 +24,27 @@
2424

2525
import java.io.Serializable;
2626

27-
import org.tensorics.core.analysis.expression.AssertionExpression;
28-
2927
public class AssertionResult implements Serializable {
3028

3129
private static final long serialVersionUID = 1L;
32-
private final AssertionExpression assertion;
3330
private final AssertionStatus status;
3431

35-
private AssertionResult(AssertionExpression assertion, AssertionStatus status) {
36-
this.assertion = assertion;
32+
private AssertionResult(AssertionStatus status) {
3733
this.status = status;
3834
}
3935

40-
public static AssertionResult of(AssertionExpression assertion, AssertionStatus status) {
41-
return new AssertionResult(assertion, status);
42-
}
43-
44-
public String condition() {
45-
return assertion.name();
36+
public static AssertionResult of(AssertionStatus status) {
37+
return new AssertionResult(status);
4638
}
4739

4840
public AssertionStatus status() {
4941
return status;
5042
}
5143

52-
public AssertionExpression assertion() {
53-
return this.assertion;
54-
}
55-
5644
@Override
5745
public int hashCode() {
5846
final int prime = 31;
5947
int result = 1;
60-
result = prime * result + ((assertion == null) ? 0 : assertion.hashCode());
6148
result = prime * result + ((status == null) ? 0 : status.hashCode());
6249
return result;
6350
}
@@ -74,13 +61,6 @@ public boolean equals(Object obj) {
7461
return false;
7562
}
7663
AssertionResult other = (AssertionResult) obj;
77-
if (assertion == null) {
78-
if (other.assertion != null) {
79-
return false;
80-
}
81-
} else if (!assertion.equals(other.assertion)) {
82-
return false;
83-
}
8464
if (status != other.status) {
8565
return false;
8666
}
@@ -89,7 +69,8 @@ public boolean equals(Object obj) {
8969

9070
@Override
9171
public String toString() {
92-
return "AssertionResult [assertion=" + assertion + ", status=" + status + "]";
72+
return "AssertionResult [status=" + status + "]";
9373
}
9474

75+
9576
}

src/java/org/tensorics/core/analysis/expression/AnalysisExpression.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@
2626
import java.util.List;
2727

2828
import org.tensorics.core.analysis.AnalysisResult;
29+
import org.tensorics.core.analysis.resolver.AnalysisResolver;
2930
import org.tensorics.core.tree.domain.AbstractDeferredExpression;
3031

3132
import com.google.common.collect.ImmutableList;
3233

3334
/**
34-
* A group of assertions that are evaluated altogether. The strategy is defined in the {@link AssertionGroupResolver}.
35+
* A group of assertions that are evaluated altogether. The strategy is defined in the {@link AnalysisResolver}.
3536
*
36-
* @see AssertionGroupResolver
37+
* @see AnalysisResolver
3738
* @author acalia, caguiler, kfuchsberger
3839
*/
3940
public class AnalysisExpression extends AbstractDeferredExpression<AnalysisResult> {

src/java/org/tensorics/core/analysis/expression/AssertionExpression.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
package org.tensorics.core.analysis.expression;
2424

2525
import static java.util.Objects.requireNonNull;
26+
import static org.tensorics.core.analysis.AssertionStatus.ERROR;
2627

2728
import java.util.Collection;
2829
import java.util.Collections;
@@ -31,7 +32,9 @@
3132
import org.slf4j.Logger;
3233
import org.slf4j.LoggerFactory;
3334
import org.tensorics.core.analysis.AssertionBuilder;
35+
import org.tensorics.core.analysis.AssertionResult;
3436
import org.tensorics.core.analysis.AssertionStatus;
37+
import org.tensorics.core.analysis.resolver.AssertionResolver;
3538
import org.tensorics.core.expressions.IterableResolvingExpression;
3639
import org.tensorics.core.tree.domain.AbstractDeferredExpression;
3740
import org.tensorics.core.tree.domain.ExceptionHandlingNode;
@@ -48,8 +51,8 @@
4851
* @see AssertionResolver
4952
* @author acalia, caguiler, kfuchsbe
5053
*/
51-
public class AssertionExpression extends AbstractDeferredExpression<AssertionStatus>
52-
implements ExceptionHandlingNode<AssertionStatus> {
54+
public class AssertionExpression extends AbstractDeferredExpression<AssertionResult>
55+
implements ExceptionHandlingNode<AssertionResult> {
5356
private static final long serialVersionUID = 1L;
5457
private static final Logger LOGGER = LoggerFactory.getLogger(AssertionExpression.class);
5558
private static final Expression<Boolean> DEFAULT_TRUE_PRECONDITION = ResolvedExpression.of(true);
@@ -88,9 +91,9 @@ public String name() {
8891
}
8992

9093
@Override
91-
public AssertionStatus handle(Exception exception) {
94+
public AssertionResult handle(Exception exception) {
9295
LOGGER.error("Exception evaluating expression {} [{}]", name, key, exception);
93-
return AssertionStatus.ERROR;
96+
return AssertionResult.of(ERROR);
9497
}
9598

9699
@Override

src/java/org/tensorics/core/analysis/resolver/AssertionGroupResolver.java src/java/org/tensorics/core/analysis/resolver/AnalysisResolver.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
* @see AnalysisExpression
4747
* @author acalia, caguiler, kfuchsberger
4848
*/
49-
public class AssertionGroupResolver extends AbstractResolver<AnalysisResult, AnalysisExpression> {
49+
public class AnalysisResolver extends AbstractResolver<AnalysisResult, AnalysisExpression> {
5050

5151
@Override
5252
public boolean canResolve(AnalysisExpression assertionSet, ResolvingContext context) {
@@ -58,15 +58,15 @@ public AnalysisResult resolve(AnalysisExpression assertionSet, ResolvingContext
5858
AssertionStatus overallStatus = overallStatus(assertionSet, context);
5959
Builder builder = AnalysisResult.builder(overallStatus);
6060
for (AssertionExpression assertion : assertionSet.getChildren()) {
61-
AssertionResult assertionResult = AssertionResult.of(assertion, context.resolvedValueOf(assertion));
62-
builder.add(assertionResult);
61+
AssertionResult assertionResult = context.resolvedValueOf(assertion);
62+
builder.put(assertion, assertionResult);
6363
}
6464
return builder.build();
6565
}
6666

6767
private AssertionStatus overallStatus(AnalysisExpression assertionSet, ResolvingContext context) {
6868
return fromBooleanSuccessful(assertionSet.getChildren().stream().map(context::resolvedValueOf)
69-
.filter(not(NONAPPLICABLE::equals)).allMatch(SUCCESSFUL::equals));
69+
.map(AssertionResult::status).filter(not(NONAPPLICABLE::equals)).allMatch(SUCCESSFUL::equals));
7070
}
7171

7272
}

src/java/org/tensorics/core/analysis/resolver/AssertionResolver.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static org.tensorics.core.analysis.AssertionStatus.NONAPPLICABLE;
2626
import static org.tensorics.core.analysis.AssertionStatus.fromBooleanSuccessful;
2727

28+
import org.tensorics.core.analysis.AssertionResult;
2829
import org.tensorics.core.analysis.AssertionStatus;
2930
import org.tensorics.core.analysis.expression.AssertionExpression;
3031
import org.tensorics.core.resolve.resolvers.AbstractResolver;
@@ -37,20 +38,20 @@
3738
* @see AssertionExpression
3839
* @author acalia, caguiler, kfuchsberger
3940
*/
40-
public class AssertionResolver extends AbstractResolver<AssertionStatus, AssertionExpression> {
41+
public class AssertionResolver extends AbstractResolver<AssertionResult, AssertionExpression> {
4142

4243
@Override
4344
public boolean canResolve(AssertionExpression expression, ResolvingContext context) {
4445
return Resolvers.contextResolvesAll(expression.getChildren(), context);
4546
}
4647

4748
@Override
48-
public AssertionStatus resolve(AssertionExpression assertion, ResolvingContext context) {
49+
public AssertionResult resolve(AssertionExpression assertion, ResolvingContext context) {
4950
if (!context.resolvedValueOf(assertion.preConditionsExpression())) {
50-
return NONAPPLICABLE;
51+
return AssertionResult.of(NONAPPLICABLE);
5152
}
5253

53-
return fromBooleanSuccessful(context.resolvedValueOf(assertion.condition()));
54+
return AssertionResult.of(fromBooleanSuccessful(context.resolvedValueOf(assertion.condition())));
5455
}
5556

5657
}

0 commit comments

Comments
 (0)