public static DispatcherResult buildResult()

in prototype/dispatch/order-dispatcher/src/main/java/com/aws/proto/dispatching/planner/solution/v2/SolutionConsumer.java [82:139]


    public static DispatcherResult buildResult(DispatchingSolution solution, SolverStatus solverStatus, long solverDurationInMs, boolean includeEmptyDrivers) {
        DispatcherResult result = new DispatcherResult();

        result.problemId = solution.getId();
        result.executionId = solution.getExecutionId();
        result.createdAt = solution.getCreatedAt();
        result.score = solution.getScore().toString();
        result.state = solverStatus.name();
        result.solverDurationInMs = solverDurationInMs;

        List<PlanningDriver> drivers = solution.getPlanningDrivers();

        if(drivers.size() > 0) {
            DistanceMatrix distanceMatrix = drivers.get(0).getLocation().getDistanceMatrix();
            result.distanceMatrixMetrics = new DispatcherResult.DistanceMatrixMetrics(distanceMatrix.getGeneratedTime(), distanceMatrix.dimension());
        }

        List<DispatcherResult.AssignedOrders> assignedOrders = new ArrayList<>();
        List<String> unassigned = new ArrayList<>();
        for(PlanningDriver driver : drivers) {
            List<String> orderIds = new ArrayList<>();
            List<DispatcherResult.Visit> visits = new ArrayList<>();

            PlanningDelivery delivery = driver.getNextPlanningDelivery();
            if (delivery == null && !includeEmptyDrivers) {
                continue;
            }
            // TODO: manually putting orders to unassigned if there are more than 2 assigned to a driver
            // because driver simulator at this point cannot handle more than one assigned order
            int ctr = 0;
            while(delivery != null) {
                ctr++;
                if (ctr > 1) {
                    unassigned.add(delivery.getOrder().getOrderId());
                } else {
                    orderIds.add(delivery.getOrder().getOrderId());
                    visits.add(new DispatcherResult.Visit(delivery.getPickup()));
                    visits.add(new DispatcherResult.Visit(delivery.getDropoff()));
                }
                delivery = delivery.getNextPlanningDelivery();
            }

            assignedOrders.add(new DispatcherResult.AssignedOrders(
              driver.getId(),
              driver.getDriverIdentity(),
              driver.getLocation(),
              orderIds,
              visits
            ));
        }


        result.assigned = assignedOrders;
        // currently we don't have a mechanism to keep orders unassigned
        result.unassigned = unassigned;

        return result;
    }