Skip to content

Commit bb327ad

Browse files
chore: use class reference to discover calling code instead of string
1 parent cf5a4dc commit bb327ad

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

core/src/main/java/ai/timefold/solver/core/impl/bavet/common/AbstractNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ public abstract class AbstractNode {
1717

1818
private long id;
1919
private long layerIndex = -1;
20+
/**
21+
* Used to map this node to where it was defined/used.
22+
* Null when profiling is disabled.
23+
*/
2024
private @Nullable SortedSet<ConstraintNodeLocation> locationSet;
2125

2226
/**

core/src/main/java/ai/timefold/solver/core/impl/bavet/common/BavetAbstractConstraintStream.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
package ai.timefold.solver.core.impl.bavet.common;
22

3+
import java.lang.reflect.Method;
34
import java.util.ArrayList;
5+
import java.util.Arrays;
46
import java.util.List;
57
import java.util.Objects;
68
import java.util.Set;
79
import java.util.SortedSet;
810
import java.util.TreeSet;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.Stream;
913

1014
import ai.timefold.solver.core.api.score.Score;
1115
import ai.timefold.solver.core.api.score.constraint.ConstraintRef;
1216
import ai.timefold.solver.core.api.score.stream.Constraint;
17+
import ai.timefold.solver.core.api.score.stream.ConstraintFactory;
18+
import ai.timefold.solver.core.api.score.stream.ConstraintStream;
19+
import ai.timefold.solver.core.api.score.stream.bi.BiConstraintStream;
20+
import ai.timefold.solver.core.api.score.stream.quad.QuadConstraintStream;
21+
import ai.timefold.solver.core.api.score.stream.tri.TriConstraintStream;
22+
import ai.timefold.solver.core.api.score.stream.uni.UniConstraintStream;
1323
import ai.timefold.solver.core.impl.score.stream.bavet.BavetConstraint;
1424
import ai.timefold.solver.core.impl.score.stream.bavet.BavetConstraintFactory;
1525
import ai.timefold.solver.core.impl.score.stream.bavet.common.BavetScoringConstraintStream;
@@ -24,9 +34,14 @@ public abstract class BavetAbstractConstraintStream<Solution_>
2434
extends AbstractConstraintStream<Solution_>
2535
implements BavetStream {
2636

27-
private static final String BAVET_IMPL_PACKAGE = "ai.timefold.solver.core.impl.bavet";
28-
private static final String BAVET_SCORE_IMPL_PACKAGE = "ai.timefold.solver.core.impl.score.stream";
29-
private static final String BAVET_SCORE_API_PACKAGE = "ai.timefold.solver.core.api.score.stream";
37+
private static final Set<String> constraintStreamApiMethodSet = Stream.of(
38+
UniConstraintStream.class,
39+
BiConstraintStream.class,
40+
TriConstraintStream.class,
41+
QuadConstraintStream.class)
42+
.flatMap(clazz -> Arrays.stream(clazz.getMethods()))
43+
.map(Method::getName)
44+
.collect(Collectors.toUnmodifiableSet());
3045

3146
protected final BavetConstraintFactory<Solution_> constraintFactory;
3247
protected final BavetAbstractConstraintStream<Solution_> parent;
@@ -54,10 +69,11 @@ protected BavetAbstractConstraintStream(BavetConstraintFactory<Solution_> constr
5469
public abstract StreamKind getStreamKind();
5570

5671
private ConstraintNodeLocation determineStreamLocation() {
57-
return StackWalker.getInstance().walk(stack -> stack
58-
.dropWhile(stackFrame -> stackFrame.getClassName().startsWith(BAVET_IMPL_PACKAGE) ||
59-
stackFrame.getClassName().startsWith(BAVET_SCORE_IMPL_PACKAGE) ||
60-
stackFrame.getClassName().startsWith(BAVET_SCORE_API_PACKAGE))
72+
return StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).walk(stack -> stack
73+
.dropWhile(stackFrame -> !ConstraintStream.class.isAssignableFrom(stackFrame.getDeclaringClass())
74+
&& !constraintStreamApiMethodSet.contains(stackFrame.getMethodName()))
75+
.dropWhile(stackFrame -> ConstraintStream.class.isAssignableFrom(stackFrame.getDeclaringClass()) ||
76+
ConstraintFactory.class.isAssignableFrom(stackFrame.getDeclaringClass()))
6177
.map(stackFrame -> new ConstraintNodeLocation(
6278
getStreamKind(),
6379
stackFrame.getClassName(),

0 commit comments

Comments
 (0)