OpenSRP/opensrp-client-anc

View on GitHub
opensrp-anc/src/main/java/org/smartregister/anc/library/presenter/AdvancedSearchPresenter.java

Summary

Maintainability
C
1 day
Test Coverage
package org.smartregister.anc.library.presenter;

import android.database.Cursor;
import android.database.CursorJoiner;

import org.apache.commons.lang3.StringUtils;
import org.smartregister.anc.library.contract.AdvancedSearchContract;
import org.smartregister.anc.library.cursor.AdvancedMatrixCursor;
import org.smartregister.anc.library.interactor.AdvancedSearchInteractor;
import org.smartregister.anc.library.model.AdvancedSearchModel;
import org.smartregister.anc.library.util.CreateRemoteLocalCursorUtils;
import org.smartregister.anc.library.util.DBConstantsUtils;
import org.smartregister.domain.Response;

import java.lang.ref.WeakReference;
import java.util.Map;

public class AdvancedSearchPresenter extends RegisterFragmentPresenter
        implements AdvancedSearchContract.Presenter, AdvancedSearchContract.InteractorCallBack {

    public static final String TABLE_NAME = DBConstantsUtils.DEMOGRAPHIC_TABLE_NAME;
    private WeakReference<AdvancedSearchContract.View> viewReference;
    private AdvancedSearchContract.Model model;

    public AdvancedSearchPresenter(AdvancedSearchContract.View view, String viewConfigurationIdentifier) {
        super(view, viewConfigurationIdentifier);
        this.viewReference = new WeakReference<>(view);
        model = new AdvancedSearchModel();
        interactor = new AdvancedSearchInteractor();
    }

    public void search(String firstName, String lastName, String ancId, String edd, String dob, String phoneNumber,
                       String alternateContact, boolean isLocal) {
        String searchCriteria =
                model.createSearchString(firstName, lastName, ancId, edd, dob, phoneNumber, alternateContact);
        if (StringUtils.isBlank(searchCriteria)) {
            return;
        }

        getView().updateSearchCriteria(searchCriteria);

        Map<String, String> editMap =
                model.createEditMap(firstName, lastName, ancId, edd, dob, phoneNumber, alternateContact, isLocal);
        if (editMap == null || editMap.isEmpty()) {
            return;
        }

        if (isLocal) {
            getView().showProgressView();
            getView().switchViews(true);
            localQueryInitialize(editMap);

            getView().countExecute();
            getView().filterandSortInInitializeQueries();
            getView().hideProgressView();

        } else {
            getView().showProgressView();
            getView().switchViews(true);
            if (editMap.size() > 0) {
                Map<String, String> localMap =
                        model.createEditMap(firstName, lastName, ancId, edd, dob, phoneNumber, alternateContact, true);
                if (localMap != null && !localMap.isEmpty()) {
                    localQueryInitialize(localMap);
                }
            }
            interactor.search(editMap, this, ancId);

        }
    }

    protected AdvancedSearchContract.View getView() {
        if (viewReference != null) return viewReference.get();
        else return null;
    }

    private void localQueryInitialize(Map<String, String> editMap) {
        String mainCondition = model.getMainConditionString(editMap);

        String countSelect = model.countSelect(TABLE_NAME, mainCondition);
        String mainSelect = model.mainSelect(TABLE_NAME, mainCondition);

        getView().initializeQueryParams(TABLE_NAME, countSelect, mainSelect);
        getView().initializeAdapter(visibleColumns);
    }

    @Override
    public void onResultsFound(Response<String> response, String ancId) {
        matrixCursor = model.createMatrixCursor(response);
        AdvancedMatrixCursor advancedMatrixCursor = getRemoteLocalMatrixCursor(matrixCursor);
        advancedMatrixCursor.moveToFirst();
        getView().recalculatePagination(advancedMatrixCursor);

        getView().filterandSortInInitializeQueries();
        getView().hideProgressView();
    }

    private AdvancedMatrixCursor getRemoteLocalMatrixCursor(AdvancedMatrixCursor matrixCursor) {
        String query = getView().filterAndSortQuery();
        Cursor cursor = getView().getRawCustomQueryForAdapter(query);
        if (cursor != null && cursor.getCount() > 0) {
            AdvancedMatrixCursor remoteLocalCursor = new AdvancedMatrixCursor(
                    new String[]{DBConstantsUtils.KeyUtils.ID_LOWER_CASE, DBConstantsUtils.KeyUtils.RELATIONAL_ID, DBConstantsUtils.KeyUtils.FIRST_NAME,
                            DBConstantsUtils.KeyUtils.LAST_NAME, DBConstantsUtils.KeyUtils.DOB,DBConstantsUtils.KeyUtils.EDD, DBConstantsUtils.KeyUtils.ANC_ID,
                            DBConstantsUtils.KeyUtils.PHONE_NUMBER, DBConstantsUtils.KeyUtils.ALT_NAME,DBConstantsUtils.KeyUtils.NEXT_CONTACT,DBConstantsUtils.KeyUtils.NEXT_CONTACT_DATE});

            CursorJoiner joiner =
                    new CursorJoiner(matrixCursor, new String[]{DBConstantsUtils.KeyUtils.ANC_ID, DBConstantsUtils.KeyUtils.ID_LOWER_CASE},
                            cursor, new String[]{DBConstantsUtils.KeyUtils.ANC_ID, DBConstantsUtils.KeyUtils.ID_LOWER_CASE});
            for (CursorJoiner.Result joinerResult : joiner) {
                switch (joinerResult) {
                    case BOTH:
                        CreateRemoteLocalCursorUtils createRemoteLocalCursorUtils = new CreateRemoteLocalCursorUtils(matrixCursor, true);
                        remoteLocalCursor.addRow(new Object[]{createRemoteLocalCursorUtils.getId(),
                                createRemoteLocalCursorUtils.getRelationalId(), createRemoteLocalCursorUtils.getFirstName(),
                                createRemoteLocalCursorUtils.getLastName(), createRemoteLocalCursorUtils.getDob(),
                                createRemoteLocalCursorUtils.getEdd(),
                                createRemoteLocalCursorUtils.getAncId(),
                                createRemoteLocalCursorUtils.getPhoneNumber(),
                                createRemoteLocalCursorUtils.getAltName(),
                                createRemoteLocalCursorUtils.getNextContact(),
                                createRemoteLocalCursorUtils.getNextContactDate()
                        });
                        break;
                    case RIGHT:
                        CreateRemoteLocalCursorUtils localCreateRemoteLocalCursorUtils = new CreateRemoteLocalCursorUtils(cursor, false);
                        remoteLocalCursor.addRow(new Object[]{localCreateRemoteLocalCursorUtils.getId(),
                                localCreateRemoteLocalCursorUtils.getRelationalId(), localCreateRemoteLocalCursorUtils.getFirstName(),
                                localCreateRemoteLocalCursorUtils.getLastName(), localCreateRemoteLocalCursorUtils.getDob(),
                                localCreateRemoteLocalCursorUtils.getEdd(),
                                localCreateRemoteLocalCursorUtils.getAncId(), localCreateRemoteLocalCursorUtils.getPhoneNumber(),
                                localCreateRemoteLocalCursorUtils.getAltName(),localCreateRemoteLocalCursorUtils.getNextContact(),
                                localCreateRemoteLocalCursorUtils.getNextContactDate()});

                        break;
                    case LEFT:
                        createRemoteLocalCursorUtils = new CreateRemoteLocalCursorUtils(matrixCursor, true);
                        remoteLocalCursor.addRow(new Object[]{createRemoteLocalCursorUtils.getId(),
                                createRemoteLocalCursorUtils.getRelationalId(), createRemoteLocalCursorUtils.getFirstName(),
                                createRemoteLocalCursorUtils.getLastName(), createRemoteLocalCursorUtils.getDob(),
                                createRemoteLocalCursorUtils.getEdd(),
                                createRemoteLocalCursorUtils.getAncId(), createRemoteLocalCursorUtils.getPhoneNumber(),
                                createRemoteLocalCursorUtils.getAltName(),
                                createRemoteLocalCursorUtils.getNextContact(),
                                createRemoteLocalCursorUtils.getNextContactDate()
                        });
                        break;
                    default:
                        break;
                }
            }

            cursor.close();
            matrixCursor.close();
            return remoteLocalCursor;
        } else {
            return matrixCursor;
        }
    }

    public void setInteractor(AdvancedSearchContract.Interactor interactor) {
        this.interactor = interactor;
    }

    public void setModel(AdvancedSearchContract.Model model) {
        this.model = model;
    }
}