public static int calculateDistance()

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;
    }