Skip to content

Commit d052cd9

Browse files
fix: fail-fast on @PlanningEntity being used in a @ProblemFactCollectionProperty (#1646)
The old test classes had different issues that caused a different fail-fast; those issues are now removed.
1 parent 204786b commit d052cd9

File tree

7 files changed

+95
-7
lines changed

7 files changed

+95
-7
lines changed

core/src/main/java/ai/timefold/solver/core/impl/domain/solution/descriptor/SolutionDescriptor.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,14 @@ private void processProblemFactPropertyAnnotation(DescriptorPolicy descriptorPol
587587
Collection.class.getSimpleName()));
588588
}
589589
problemFactCollectionMemberAccessorMap.put(memberAccessor.getName(), memberAccessor);
590-
problemFactType = type;
590+
591+
if (type.isArray()) {
592+
problemFactType = type.getComponentType();
593+
} else {
594+
problemFactType = ConfigUtils.extractGenericTypeParameterOrFail(PlanningSolution.class.getSimpleName(),
595+
memberAccessor.getDeclaringClass(),
596+
type, memberAccessor.getGenericType(), annotationClass, memberAccessor.getName());
597+
}
591598
} else {
592599
throw new IllegalStateException("Impossible situation with annotationClass (" + annotationClass + ").");
593600
}

core/src/test/java/ai/timefold/solver/core/impl/domain/solution/descriptor/SolutionDescriptorTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import ai.timefold.solver.core.testdomain.invalid.constraintconfiguration.TestdataInvalidConfigurationSolution;
3434
import ai.timefold.solver.core.testdomain.invalid.constraintweightoverrides.TestdataInvalidConstraintWeightOverridesSolution;
3535
import ai.timefold.solver.core.testdomain.invalid.duplicateweightoverrides.TestdataDuplicateWeightConfigurationSolution;
36+
import ai.timefold.solver.core.testdomain.invalid.entityannotatedasproblemfact.TestdataEntityAnnotatedAsProblemFactArraySolution;
37+
import ai.timefold.solver.core.testdomain.invalid.entityannotatedasproblemfact.TestdataEntityAnnotatedAsProblemFactCollectionSolution;
3638
import ai.timefold.solver.core.testdomain.invalid.entityannotatedasproblemfact.TestdataEntityAnnotatedAsProblemFactSolution;
3739
import ai.timefold.solver.core.testdomain.invalid.multivar.TestdataInvalidMultiVarSolution;
3840
import ai.timefold.solver.core.testdomain.invalid.nosolution.TestdataNoSolution;
@@ -134,7 +136,14 @@ void planningEntityIsProblemFactProperty() {
134136

135137
@Test
136138
void planningEntityIsProblemFactCollectionProperty() {
137-
assertThatIllegalStateException().isThrownBy(TestdataEntityAnnotatedAsProblemFactSolution::buildSolutionDescriptor);
139+
assertThatIllegalStateException()
140+
.isThrownBy(TestdataEntityAnnotatedAsProblemFactCollectionSolution::buildSolutionDescriptor);
141+
}
142+
143+
@Test
144+
void planningEntityIsProblemFactArrayProperty() {
145+
assertThatIllegalStateException()
146+
.isThrownBy(TestdataEntityAnnotatedAsProblemFactArraySolution::buildSolutionDescriptor);
138147
}
139148

140149
@Test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package ai.timefold.solver.core.testdomain.invalid.entityannotatedasproblemfact;
2+
3+
import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty;
4+
import ai.timefold.solver.core.api.domain.solution.PlanningScore;
5+
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
6+
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
7+
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
8+
import ai.timefold.solver.core.api.score.buildin.simple.SimpleScore;
9+
import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor;
10+
import ai.timefold.solver.core.testdomain.TestdataEntity;
11+
import ai.timefold.solver.core.testdomain.TestdataValue;
12+
13+
@PlanningSolution
14+
public class TestdataEntityAnnotatedAsProblemFactArraySolution {
15+
TestdataEntity[] entities;
16+
TestdataValue[] values;
17+
SimpleScore score;
18+
19+
public static SolutionDescriptor<TestdataEntityAnnotatedAsProblemFactArraySolution> buildSolutionDescriptor() {
20+
return SolutionDescriptor.buildSolutionDescriptor(TestdataEntityAnnotatedAsProblemFactArraySolution.class,
21+
TestdataEntity.class);
22+
}
23+
24+
public TestdataEntityAnnotatedAsProblemFactArraySolution() {
25+
}
26+
27+
@ProblemFactCollectionProperty
28+
public TestdataEntity[] getEntitiesAsFacts() {
29+
return entities;
30+
}
31+
32+
@PlanningEntityCollectionProperty
33+
public TestdataEntity[] getEntities() {
34+
return entities;
35+
}
36+
37+
public void setEntities(TestdataEntity[] entities) {
38+
this.entities = entities;
39+
}
40+
41+
@ValueRangeProvider(id = "valueRange")
42+
public TestdataValue[] getValues() {
43+
return values;
44+
}
45+
46+
public void setValues(TestdataValue[] values) {
47+
this.values = values;
48+
}
49+
50+
@PlanningScore
51+
public SimpleScore getScore() {
52+
return score;
53+
}
54+
55+
public void setScore(SimpleScore score) {
56+
this.score = score;
57+
}
58+
}

core/src/test/java/ai/timefold/solver/core/testdomain/invalid/entityannotatedasproblemfact/TestdataEntityAnnotatedAsProblemFactCollectionSolution.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.util.List;
44

5+
import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty;
6+
import ai.timefold.solver.core.api.domain.solution.PlanningScore;
57
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
68
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
79
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
@@ -25,6 +27,11 @@ public TestdataEntityAnnotatedAsProblemFactCollectionSolution() {
2527
}
2628

2729
@ProblemFactCollectionProperty
30+
public List<TestdataEntity> getEntitiesAsFacts() {
31+
return entities;
32+
}
33+
34+
@PlanningEntityCollectionProperty
2835
public List<TestdataEntity> getEntities() {
2936
return entities;
3037
}
@@ -42,6 +49,7 @@ public void setValues(List<TestdataValue> values) {
4249
this.values = values;
4350
}
4451

52+
@PlanningScore
4553
public SimpleScore getScore() {
4654
return score;
4755
}

core/src/test/java/ai/timefold/solver/core/testdomain/invalid/entityannotatedasproblemfact/TestdataEntityAnnotatedAsProblemFactSolution.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.util.List;
44

5+
import ai.timefold.solver.core.api.domain.solution.PlanningEntityProperty;
6+
import ai.timefold.solver.core.api.domain.solution.PlanningScore;
57
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
68
import ai.timefold.solver.core.api.domain.solution.ProblemFactProperty;
79
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
@@ -24,11 +26,16 @@ public static SolutionDescriptor<TestdataEntityAnnotatedAsProblemFactSolution> b
2426
public TestdataEntityAnnotatedAsProblemFactSolution() {
2527
}
2628

27-
@ProblemFactProperty
29+
@PlanningEntityProperty
2830
public TestdataEntity getEntity() {
2931
return entity;
3032
}
3133

34+
@ProblemFactProperty
35+
public TestdataEntity getEntityAsFact() {
36+
return entity;
37+
}
38+
3239
public void setEntity(TestdataEntity entity) {
3340
this.entity = entity;
3441
}
@@ -42,6 +49,7 @@ public void setValues(List<TestdataValue> values) {
4249
this.values = values;
4350
}
4451

52+
@PlanningScore
4553
public SimpleScore getScore() {
4654
return score;
4755
}

core/src/test/java/ai/timefold/solver/core/testdomain/shadow/inverserelation/TestdataInverseRelationSolution.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty;
66
import ai.timefold.solver.core.api.domain.solution.PlanningScore;
77
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
8-
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
98
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
109
import ai.timefold.solver.core.api.score.buildin.simple.SimpleScore;
1110
import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor;
@@ -32,7 +31,7 @@ public TestdataInverseRelationSolution(String code) {
3231
}
3332

3433
@ValueRangeProvider(id = "valueRange")
35-
@ProblemFactCollectionProperty
34+
@PlanningEntityCollectionProperty
3635
public List<TestdataInverseRelationValue> getValueList() {
3736
return valueList;
3837
}

quarkus-integration/quarkus-benchmark/integration-test/src/main/java/ai/timefold/solver/quarkus/benchmark/it/domain/TestdataStringLengthShadowSolution.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
import ai.timefold.solver.core.api.domain.solution.PlanningEntityCollectionProperty;
66
import ai.timefold.solver.core.api.domain.solution.PlanningScore;
77
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
8-
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
98
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
109
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
1110

1211
@PlanningSolution
1312
public class TestdataStringLengthShadowSolution {
1413

15-
@ProblemFactCollectionProperty
14+
@PlanningEntityCollectionProperty
1615
@ValueRangeProvider
1716
private List<TestdataListValueShadowEntity> valueList;
1817

0 commit comments

Comments
 (0)