GrrDTOTransformer.java

package com.tradecloud.repository.goodsreceivedreceipt;

import com.tradecloud.dto.goodsreceivedreceipt.GrrItemValidationDTO;
import com.tradecloud.dto.goodsreceivedreceipt.GrrValidationDTO;
import org.hibernate.transform.ResultTransformer;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import static org.aspectj.runtime.internal.Conversions.longValue;

public class GrrDTOTransformer implements ResultTransformer {

    private Map<Long, GrrValidationDTO> postDTOMap = new LinkedHashMap<>();

    @Override
    public Object transformTuple(
            Object[] tuple,
            String[] aliases) {

        Map<String, Integer> aliasToIndexMap = aliasToIndexMap(aliases);

        Long postId = longValue(tuple[aliasToIndexMap.get(GrrValidationDTO.ORDER_ID_ALIAS)]);

        GrrValidationDTO postDTO = postDTOMap.computeIfAbsent(
                postId,
                id -> new GrrValidationDTO(tuple, aliasToIndexMap)
        );

        postDTO.getItems().add(new GrrItemValidationDTO(tuple, aliasToIndexMap));

        return postDTO;
    }

    public Map<String, Integer> aliasToIndexMap(String[] aliases) {

        Map<String, Integer> aliasToIndexMap = new LinkedHashMap<>();

        for (int i = 0; i < aliases.length; i++) {
            aliasToIndexMap.put(aliases[i], i);
        }

        return aliasToIndexMap;
    }

    @Override
    public List transformList(List collection) {
        return new ArrayList<>(postDTOMap.values());
    }
}