All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.imsweb.algorithms.countyatdiagnosisanalysis.CountyAtDxAnalysisUtils Maven / Gradle / Ivy

/*
 * Copyright (C) 2019 Information Management Services, Inc.
 */
package com.imsweb.algorithms.countyatdiagnosisanalysis;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.opencsv.CSVReaderBuilder;

import com.imsweb.algorithms.internal.CountryData;
import com.imsweb.algorithms.internal.CountyData;
import com.imsweb.algorithms.internal.StateData;

public class CountyAtDxAnalysisUtils {

    public static final String ALG_NAME = "County at Diagnosis Analysis";
    public static final String ALG_VERSION = "1.0";

    // special codes
    public static final String INVALID_COUNTY_CODE = "999";
    public static final String CANADIAN_COUNTY_CODE = "998";

    // flag values
    public static final String REP_REP_GEO_EQUAL = "2";
    public static final String REP_GEO_BLANK_OR_UNK = "2.1";
    public static final String REP_GEO_INVALID_FOR_STATE = "2.2";
    public static final String GEO_CERT_KNOWN_REP_UNK = "3";
    public static final String GEO_CERT_1_OR_6 = "4";
    public static final String REP_CERT_5 = "5";
    public static final String REP_CERT_UNK = "6";
    public static final String GEO_CERT_UNK_REP_UNK = "6.1";
    public static final String REP_CERT_2_3_OR_4 = "7";
    public static final String OTHER_CANADIAN_STATE = "9";
    public static final String OTHER_STATE_OR_DX_YEAR_BLANK = "10";
    public static final String OTHER_REP_AND_GEO_BLANK = "10.1";

    private static final List _CANADIAN_STATE_ABBREVIATIONS = Arrays.asList("AB", "BC", "MB", "NB", "NL", "NS", "NT", "NU", "ON", "PE", "QC", "SK", "YT");

    public static CountyAtDxAnalysisOutputDto computeCountyAtDiagnosis(CountyAtDxAnalysisInputDto input) {
        CountyAtDxAnalysisOutputDto output = new CountyAtDxAnalysisOutputDto();

        String dateOfDiagnosis = input.getDateOfDiagnosis();
        Integer diagnosisYear;

        if (dateOfDiagnosis == null || isBlankOrNineFilled(dateOfDiagnosis) || dateOfDiagnosis.length() < 4)
            diagnosisYear = null;
        else {
            try {
                diagnosisYear = Integer.valueOf(dateOfDiagnosis.substring(0, 4));
            }
            catch (NumberFormatException e) {
                diagnosisYear = null;
            }
        }

        if (diagnosisYear == null || StringUtils.isBlank(input.getAddrAtDxState())) {
            output.setCountyAtDxAnalysis(INVALID_COUNTY_CODE);
            output.setCountyAtDxAnalysisFlag(OTHER_STATE_OR_DX_YEAR_BLANK);
        }
        else if (_CANADIAN_STATE_ABBREVIATIONS.contains(input.getAddrAtDxState())) {
            output.setCountyAtDxAnalysis(CANADIAN_COUNTY_CODE);
            output.setCountyAtDxAnalysisFlag(OTHER_CANADIAN_STATE);
        }
        else {
            String geocoderCountyAtDx;
            String geocoderCertainty;

            if (diagnosisYear < 2000) {
                geocoderCountyAtDx = input.getCountyAtDxGeocode1990();
                geocoderCertainty = input.getCensusTrCert19708090();
            }
            else if (diagnosisYear < 2010) {
                geocoderCountyAtDx = input.getCountyAtDxGeocode2000();
                geocoderCertainty = input.getCensusTrCertainty2000();
            }
            else {
                geocoderCountyAtDx = input.getCountyAtDxGeocode2010();
                geocoderCertainty = input.getCensusTrCertainty2010();
            }

            if (StringUtils.isBlank(geocoderCountyAtDx) && StringUtils.isBlank(input.getCountyAtDx())) {
                output.setCountyAtDxAnalysis(INVALID_COUNTY_CODE);
                output.setCountyAtDxAnalysisFlag(OTHER_REP_AND_GEO_BLANK);
            }
            else if (isBlankOrNineFilled(geocoderCountyAtDx)) {
                output.setCountyAtDxAnalysis(input.getCountyAtDx());
                output.setCountyAtDxAnalysisFlag(REP_GEO_BLANK_OR_UNK);
            }
            else if (geocoderCountyAtDx.equals(input.getCountyAtDx())) {
                output.setCountyAtDxAnalysis(input.getCountyAtDx());
                output.setCountyAtDxAnalysisFlag(REP_REP_GEO_EQUAL);
            }
            else {
                if (!CountryData.getInstance().isCountyAtDxAnalysisInitialized())
                    CountryData.getInstance().initializeCountyAtDxAnalysisData(loadCountyAtDxAnalysisData());

                StateData stateData = CountryData.getInstance().getCountyAtDxAnalysisData(input.getAddrAtDxState());
                if (stateData == null || stateData.getCountyData(geocoderCountyAtDx) == null) {
                    output.setCountyAtDxAnalysis(input.getCountyAtDx());
                    output.setCountyAtDxAnalysisFlag(REP_GEO_INVALID_FOR_STATE);
                }
                else if (!isBlankOrNineFilled(geocoderCertainty) && isBlankOrNineFilled(input.getCountyAtDx())) {
                    output.setCountyAtDxAnalysis(geocoderCountyAtDx);
                    output.setCountyAtDxAnalysisFlag(GEO_CERT_KNOWN_REP_UNK);
                }
                else if (Arrays.asList("1", "6").contains(geocoderCertainty)) {
                    output.setCountyAtDxAnalysis(geocoderCountyAtDx);
                    output.setCountyAtDxAnalysisFlag(GEO_CERT_1_OR_6);
                }
                else if (Arrays.asList("2", "3", "4").contains(geocoderCertainty)) {
                    output.setCountyAtDxAnalysis(input.getCountyAtDx());
                    output.setCountyAtDxAnalysisFlag(REP_CERT_2_3_OR_4);
                }
                else if ("5".equals(geocoderCertainty)) {
                    output.setCountyAtDxAnalysis(input.getCountyAtDx());
                    output.setCountyAtDxAnalysisFlag(REP_CERT_5);
                }
                else if (isBlankOrNineFilled(input.getCountyAtDx())) {
                    output.setCountyAtDxAnalysis(geocoderCountyAtDx);
                    output.setCountyAtDxAnalysisFlag(GEO_CERT_UNK_REP_UNK);
                }
                else {
                    output.setCountyAtDxAnalysis(input.getCountyAtDx());
                    output.setCountyAtDxAnalysisFlag(REP_CERT_UNK);
                }
            }
        }

        return output;
    }

    static boolean isBlankOrNineFilled(String str) {
        if (StringUtils.isBlank(str))
            return true;

        boolean allNines = true;
        for (Character c : str.toCharArray())
            allNines &= c.equals('9');

        return allNines;
    }

    @SuppressWarnings("ConstantConditions")
    private static Map> loadCountyAtDxAnalysisData() {
        Map> result = new HashMap<>();
        try (Reader reader = new InputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream("countyatdxanalysis/state-county-map.csv"), StandardCharsets.US_ASCII)) {
            for (String[] row : new CSVReaderBuilder(reader).withSkipLines(1).build().readAll())
                result.computeIfAbsent(row[0], k -> new HashMap<>()).computeIfAbsent(row[1], k -> new CountyData());
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }

        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy