in use-cases/order-picking/src/main/java/org/acme/orderpicking/domain/Warehouse.java [129:173]
public static int calculateDistance(WarehouseLocation start, WarehouseLocation end) {
final Shelving startShelving = SHELVING_MAP.get(start.getShelvingId());
if (startShelving == null) {
throw new IndexOutOfBoundsException(String.format(SHELVING_NOT_FOUND_ERROR, start.getShelvingId()));
}
final Shelving endShelving = SHELVING_MAP.get(end.getShelvingId());
if (endShelving == null) {
throw new IndexOutOfBoundsException(String.format(SHELVING_NOT_FOUND_ERROR, end.getShelvingId()));
}
int deltaX = 0;
int deltaY;
final int startX = getAbsoluteX(startShelving, start);
final int startY = getAbsoluteY(startShelving, start);
final int endX = getAbsoluteX(endShelving, end);
final int endY = getAbsoluteY(endShelving, end);
if (startShelving == endShelving) {
//same shelving
if (start.getSide() == end.getSide()) {
//same side
deltaY = abs(startY - endY);
} else {
//different side, calculate shortest walk.
deltaX = SHELVING_WIDTH;
deltaY = calculateBestYDistanceInShelvingRow(start.getRow(), end.getRow());
}
} else if (startShelving.getY() == endShelving.getY()) {
//distinct shelvings but on the same warehouse row
if (abs(startX - endX) == SHELVING_PADDING) {
//neighbor shelvings, but also contiguous side
deltaX = SHELVING_PADDING;
deltaY = abs(startY - endY);
} else {
//any other combination of shelvings but in the same warehouse row
deltaX = abs(startX - endX);
deltaY = calculateBestYDistanceInShelvingRow(start.getRow(), end.getRow());
}
} else {
//shelvings on different warehouse rows
deltaX = abs(startX - endX);
deltaY = abs(startY - endY);
}
return deltaX + deltaY;
}