Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 22 additions & 22 deletions docs/src/main/asciidoc/optaplanner.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,11 @@ and there are no time slots during lunch or other breaks.
A time slot has no date, because a high school schedule just repeats every week.
So there is no need for https://docs.optaplanner.org/latestFinal/optaplanner-docs/html_single/index.html#continuousPlanning[continuous planning].

Create the `src/main/java/org/acme/domain/Timeslot.java` class:
Create the `src/main/java/org/acme/optaplanner/domain/Timeslot.java` class:

[source,java]
----
package org.acme.domain;
package org.acme.optaplanner.domain;

import java.time.DayOfWeek;
import java.time.LocalTime;
Expand Down Expand Up @@ -185,7 +185,7 @@ public class Timeslot {

@Override
public String toString() {
return dayOfWeek + " " + startTime.toString();
return dayOfWeek + " " + startTime;
}

}
Expand All @@ -204,11 +204,11 @@ for example, `Room A` or `Room B`.
For simplicity's sake, all rooms are without capacity limits
and they can accommodate all lessons.

Create the `src/main/java/org/acme/domain/Room.java` class:
Create the `src/main/java/org/acme/optaplanner/domain/Room.java` class:

[source,java]
----
package org.acme.domain;
package org.acme.optaplanner.domain;

public class Room {

Expand Down Expand Up @@ -259,11 +259,11 @@ In order for OptaPlanner to recognize them,
both the `timeslot` and `room` fields require an `@PlanningVariable` annotation.
Their containing class, `Lesson`, requires an `@PlanningEntity` annotation.

Create the `src/main/java/org/acme/domain/Lesson.java` class:
Create the `src/main/java/org/acme/optaplanner/domain/Lesson.java` class:

[source,java]
----
package org.acme.domain;
package org.acme.optaplanner.domain;

import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.lookup.PlanningId;
Expand Down Expand Up @@ -412,15 +412,15 @@ Unfortunately **that does not scale well**, because it is non-incremental:
every time a lesson is assigned to a different time slot or room,
all lessons are re-evaluated to calculate the new score.

Instead, create a `src/main/java/org/acme/solver/TimeTableConstraintProvider.java` class
Instead, create a `src/main/java/org/acme/optaplanner/solver/TimeTableConstraintProvider.java` class
to perform incremental score calculation.
It uses OptaPlanner's ConstraintStream API which is inspired by Java 8 Streams and SQL:

[source,java]
----
package org.acme.solver;
package org.acme.optaplanner.solver;

import org.acme.domain.Lesson;
import org.acme.optaplanner.domain.Lesson;
import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
import org.optaplanner.core.api.score.stream.Constraint;
import org.optaplanner.core.api.score.stream.ConstraintFactory;
Expand Down Expand Up @@ -493,11 +493,11 @@ for example, a solution with the score `-2hard/-3soft`.
* If it adheres to all hard constraints, then it is a _feasible_ solution,
for example, a solution with the score `0hard/-7soft`.

Create the `src/main/java/org/acme/domain/TimeTable.java` class:
Create the `src/main/java/org/acme/optaplanner/domain/TimeTable.java` class:

[source,java]
----
package org.acme.domain;
package org.acme.optaplanner.domain;

import java.util.List;

Expand Down Expand Up @@ -603,11 +603,11 @@ Therefore, the Quarkus extension injects a `SolverManager`,
which runs solvers in a separate thread pool
and can solve multiple datasets in parallel.

Create the `src/main/java/org/acme/solver/TimeTableResource.java` class:
Create the `src/main/java/org/acme/optaplanner/rest/TimeTableResource.java` class:

[source,java]
----
package org.acme.rest;
package org.acme.optaplanner.rest;

import java.util.UUID;
import java.util.concurrent.ExecutionException;
Expand All @@ -618,7 +618,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.acme.domain.TimeTable;
import org.acme.optaplanner.domain.TimeTable;
import org.optaplanner.core.api.solver.SolverJob;
import org.optaplanner.core.api.solver.SolverManager;

Expand Down Expand Up @@ -720,11 +720,11 @@ On the server side, the `info` log show what OptaPlanner did in those five secon
A good application includes test coverage.
In a JUnit test, generate a test dataset and send it to the `TimeTableResource` to solve.

Create the `src/test/java/org/acme/solver/TimeTableResourceTest.java` class:
Create the `src/test/java/org/acme/optaplanner/rest/TimeTableResourceTest.java` class:

[source,java]
----
package org.acme;
package org.acme.optaplanner.rest;

import java.time.DayOfWeek;
import java.time.LocalTime;
Expand All @@ -734,11 +734,11 @@ import java.util.List;
import javax.inject.Inject;

import io.quarkus.test.junit.QuarkusTest;
import org.acme.domain.Room;
import org.acme.domain.Timeslot;
import org.acme.domain.Lesson;
import org.acme.domain.TimeTable;
import org.acme.rest.TimeTableResource;
import org.acme.optaplanner.domain.Room;
import org.acme.optaplanner.domain.Timeslot;
import org.acme.optaplanner.domain.Lesson;
import org.acme.optaplanner.domain.TimeTable;
import org.acme.optaplanner.rest.TimeTableResource;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;

Expand Down