public static List splitAdverseEventToEntities()

in clns-acuity-admin/acuity-etl/src/main/java/com/acuity/visualisations/batch/processor/AeSplitter.java [58:209]


    public static List<TimestampedEntity> splitAdverseEventToEntities(AdverseEvent adverseEvent) {
        List<TimestampedEntity> out = new ArrayList<>();

        // Create Investigational Drugs
        Drug[] ipDrugs = null;
        int ipDrugsCount = 0;
        if (adverseEvent.getIpDrugs() != null) {
            ipDrugs = new Drug[adverseEvent.getIpDrugs().length];
            for (int i = 0; i < adverseEvent.getIpDrugs().length; i++) {
                Object drugName = adverseEvent.getIpDrugs()[i];
                if (!isEmpty(drugName)) {
                    Drug ipDrug = new Drug(drugName.toString());
                    ipDrugs[i] = ipDrug;
                    out.add(ipDrug);
                    ipDrugsCount++;
                }
            }
        }

        //Create Additional Drugs
        Drug[] adDrugs = null;
        int adDrugsCount = 0;
        if (adverseEvent.getAdDrugs() != null) {
            adDrugs = new Drug[adverseEvent.getAdDrugs().length];
            for (int i = 0; i < adverseEvent.getAdDrugs().length; i++) {
                Object drugName = adverseEvent.getAdDrugs()[i];
                if (!isEmpty(drugName)) {
                    Drug adDrug = new Drug(drugName.toString());
                    adDrugs[i] = adDrug;
                    out.add(adDrug);
                    adDrugsCount++;
                }
            }
        }

        //Create Adverse Event
        AE ae = new AE();
        ae.setAeText(adverseEvent.getAeText());
        ae.setComment(adverseEvent.getComment());
        ae.setSerious(adverseEvent.getSerious());
        ae.setNumber(adverseEvent.getNumber());

        ae.setOutcome(adverseEvent.getOutcome());
        ae.setDoseLimitingToxicity(adverseEvent.getDoseLimitingToxicity());
        ae.setTimePoint(adverseEvent.getTimePoint());
        ae.setImmuneMediated(adverseEvent.getImmuneMediated());
        ae.setInfusionReaction(adverseEvent.getInfusionReaction());
        ae.setRequiredTreatment(adverseEvent.getRequiredTreatment());
        ae.setCausedSubjectWithdrawal(adverseEvent.getCausedSubjectWithdrawal());

        ae.setSubject(adverseEvent.getSubject());
        ae.setPart(adverseEvent.getPart());
        ae.setPT(adverseEvent.getPT());
        ae.setHLT(adverseEvent.getHLT());
        ae.setSOC(adverseEvent.getSOC());
        ae.setSuspectedEndpoint(adverseEvent.getSuspectedEndpoint());
        ae.setSuspectedEndpointCategory(adverseEvent.getSuspectedEndpointCategory());
        ae.setAeOfSpecialInterest(adverseEvent.getAeOfSpecialInterest());
        ae.setStartDate(adverseEvent.getStartDate());
        out.add(ae);

        //Create Causalities
        if (ipDrugsCount > 0) {
            pushAeCausality(out, ae, ipDrugs, adverseEvent.getCausalityForIpDrugs(),
                    "Causalities for Investigational Drugs");
        }

        if (adDrugsCount > 0) {
            pushAeCausality(out, ae, adDrugs, adverseEvent.getCausalityForAdDrugs(),
                    "Causalities for Additional Drugs");
        }

        //Create Severities
        AeSeverity severity = new AeSeverity();
        severity.setAe(ae);
        severity.setStartDate(adverseEvent.getStartDate());
        severity.setEndDate(adverseEvent.getEndDate());

        severity.setSeverity(adverseEvent.getMaxSeverity());

        out.add(severity);

        if (ipDrugsCount > 0) {
            pushAeActionsTaken(out, severity, ipDrugs, adverseEvent.getInitialActionTakenForIpDrugs(),
                    "Initial Actions Taken for Investigational Drugs");
        }

        if (adDrugsCount > 0) {
            pushAeActionsTaken(out, severity, adDrugs, adverseEvent.getInitialActionTakenForAdDrugs(),
                    "Initial Actions Taken for Additional Drugs");
        }

        Object[] gradeChanges = adverseEvent.getCtcGradeChanges();
        Object[] changeDates = adverseEvent.getCtcGradeChangeDates();


        if (gradeChanges != null && changeDates != null && gradeChanges.length == changeDates.length) {
            boolean hasNonEmptyPairsToIterate = false;

            for (Object gradeChange : gradeChanges) {
                if (!isEmpty(gradeChange)) {
                    hasNonEmptyPairsToIterate = true;
                    severity.setSeverity(adverseEvent.getStartingCtcGrade());
                    break;
                }
            }

            if (!hasNonEmptyPairsToIterate) {
                return out;
            }

            int changesCount = 0;
            AeSeverity[] severities = new AeSeverity[gradeChanges.length];

            for (int i = 0; i < gradeChanges.length; i++) {
                if (changeDates[i] != null && !isEmpty(gradeChanges[i])) {
                    LocalDateTime nextStartDate = AcuityFieldTransformer.transform((LocalDateTime) changeDates[i],
                            AcuityFieldTransformation.INITIATING_EVENT_00_00_01);
                    LocalDateTime prevEndDate = ((LocalDateTime) changeDates[i]).minusSeconds(1);

                    severity.setEndDate(prevEndDate);

                    AeSeverity severity1 = new AeSeverity();
                    severity1.setAe(ae);
                    severity1.setStartDate(nextStartDate);
                    severity1.setEndDate(adverseEvent.getEndDate());
                    severity1.setSeverity((String) gradeChanges[i]);
                    out.add(severity1);
                    severities[i] = severity1;

                    severity = severity1;
                    changesCount++;
                }
            }

            LOGGER.debug("Grade changes: {}/{}", changesCount, gradeChanges.length);

            if (ipDrugsCount > 0) {
                pushAeActionsTaken(out, severities, ipDrugs, adverseEvent.getChangedActionTakenForIpDrugs(), gradeChanges,
                        "Changed Actions Taken for Investigational Drugs");
            }

            if (adDrugsCount > 0) {
                pushAeActionsTaken(out, severities, adDrugs, adverseEvent.getChangedActionTakenForAdDrugs(), gradeChanges,
                        "Changed Actions Taken for Additional Drugs");
            }
        } else {
            LOGGER.warn("Grade changes and dates not aligned");
        }

        return out;
    }