OpenSRP/opensrp-client-anc

View on GitHub
opensrp-anc/src/main/java/org/smartregister/anc/library/model/AdvancedSearchModel.java

Summary

Maintainability
B
4 hrs
Test Coverage
package org.smartregister.anc.library.model;

import org.apache.commons.lang3.StringUtils;
import org.smartregister.anc.library.contract.AdvancedSearchContract;
import org.smartregister.anc.library.util.DBConstantsUtils;

import java.util.LinkedHashMap;
import java.util.Map;

public class AdvancedSearchModel extends RegisterFragmentModel implements AdvancedSearchContract.Model {


    public static final String GLOBAL_FIRST_NAME = "firstName";
    public static final String GLOBAL_LAST_NAME = "lastName";
    public static final String GLOBAL_BIRTH_DATE = "birthdate";
    public static final String GLOBAL_ATTRIBUTE = "attribute";
    public static final String GLOBAL_IDENTIFIER = "identifier";
    public static final String ANC_ID = "ANC_ID";
    public static final String EDD_ATTR = "edd";
    public static final String PHONE_NUMBER = "phone_number";
    public static final String ALT_CONTACT_NAME = "alt_name";
    public static final String FIRST_NAME = "First name:";
    public static final String LAST_NAME = "Last name:";
    public static final String SEARCH_TERM_ANC_ID = "ANC ID:";
    public static final String EDD = "Edd:";
    public static final String DOB = "Dob:";
    public static final String MOBILE_PHONE_NUMBER = "Mobile phone number:";
    public static final String ALTERNATE_CONTACT_NAME = "Alternate contact name:";
    public static final String LIKE = "Like";
    public static final String AND = "AND";


    @Override
    public Map<String, String> createEditMap(String firstName, String lastName, String ancId, String edd, String dob,
                                             String phoneNumber, String alternateContact, boolean isLocal) {
        Map<String, String> editMap = new LinkedHashMap<>();
        addMapValues(firstName, isLocal, editMap, DBConstantsUtils.KeyUtils.FIRST_NAME, GLOBAL_FIRST_NAME);
        addMapValues(lastName, isLocal, editMap, DBConstantsUtils.KeyUtils.LAST_NAME, GLOBAL_LAST_NAME);
        addMapValuesCheckingLocals(ancId, isLocal, editMap, DBConstantsUtils.KeyUtils.ANC_ID, GLOBAL_IDENTIFIER, ANC_ID);
        addMapValuesCheckingLocals(edd, isLocal, editMap, DBConstantsUtils.KeyUtils.EDD, GLOBAL_ATTRIBUTE, EDD_ATTR);
        addMapValuesCheckingLocals(edd, isLocal, editMap, DBConstantsUtils.KeyUtils.EDD, GLOBAL_ATTRIBUTE, EDD_ATTR);
        addMapValues(dob, isLocal, editMap, DBConstantsUtils.KeyUtils.DOB, GLOBAL_BIRTH_DATE);
        addMapValues(phoneNumber, isLocal, editMap, DBConstantsUtils.KeyUtils.PHONE_NUMBER, PHONE_NUMBER);
        addMapValues(alternateContact, isLocal, editMap, DBConstantsUtils.KeyUtils.ALT_NAME, ALT_CONTACT_NAME);
        return editMap;
    }

    private void addMapValues(String field, boolean isLocal, Map<String, String> editMap, String key, String globalField) {
        if (StringUtils.isNotBlank(field)) {
            editMap.put(isLocal ? key : globalField, field);
        }
    }

    private void addMapValuesCheckingLocals(String field, boolean isLocal, Map<String, String> editMap, String key, String globalField, String keyToMapTo) {
        if (StringUtils.isNotBlank(field)) {
            editMap.put(isLocal ? key : globalField, isLocal ? field : keyToMapTo + ":" + field);
        }
    }

    @Override
    public String createSearchString(String firstName, String lastName, String ancId, String edd, String dob,
                                     String phoneNumber, String alternateContact) {
        String searchCriteria = "";

        if (StringUtils.isNotBlank(firstName)) {
            searchCriteria += " " + FIRST_NAME + " " + firstName + ";";
        }
        if (StringUtils.isNotBlank(lastName)) {
            searchCriteria += " " + LAST_NAME + " " + lastName + ";";
        }
        if (StringUtils.isNotBlank(ancId)) {
            searchCriteria += " " + SEARCH_TERM_ANC_ID + " " + ancId + ";";
        }
        if (StringUtils.isNotBlank(edd)) {
            searchCriteria += " " + EDD + " " + edd + ";";
        }
        if (StringUtils.isNotBlank(dob)) {
            searchCriteria += " " + DOB + " " + dob + ";";
        }
        if (StringUtils.isNotBlank(phoneNumber)) {
            searchCriteria += " " + MOBILE_PHONE_NUMBER + " " + phoneNumber + ";";
        }
        if (StringUtils.isNotBlank(alternateContact)) {
            searchCriteria += " " + ALTERNATE_CONTACT_NAME + " " + alternateContact + ";";
        }
        return removeLastSemiColon(searchCriteria);
    }

    @Override
    public String getMainConditionString(Map<String, String> editMap) {

        String mainConditionString = "";
        if (editMap == null || editMap.isEmpty()) {
            return mainConditionString;
        }

        for (Map.Entry<String, String> entry : editMap.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if (StringUtils.isBlank(mainConditionString)) {
                mainConditionString += " " + key + " " + LIKE + " '%" + value + "%'";
            } else {
                mainConditionString += " " + AND + " " + key + " " + LIKE + " '%" + value + "%'";
            }
        }

        mainConditionString += " ";

        return mainConditionString;

    }

    private String removeLastSemiColon(String str) {
        if (StringUtils.isBlank(str)) {
            return str;
        }
        String s = str.trim();
        if (s.charAt(s.length() - 1) == ';') {
            return s.substring(0, s.length() - 1);
        }
        return s;
    }

}