Example usage for org.apache.commons.lang3 StringUtils replace

List of usage examples for org.apache.commons.lang3 StringUtils replace

Introduction

In this page you can find the example usage for org.apache.commons.lang3 StringUtils replace.

Prototype

public static String replace(final String text, final String searchString, final String replacement) 

Source Link

Document

Replaces all occurrences of a String within another String.

A null reference passed to this method is a no-op.

 StringUtils.replace(null, *, *)        = null StringUtils.replace("", *, *)          = "" StringUtils.replace("any", null, *)    = "any" StringUtils.replace("any", *, null)    = "any" StringUtils.replace("any", "", *)      = "any" StringUtils.replace("aba", "a", null)  = "aba" StringUtils.replace("aba", "a", "")    = "b" StringUtils.replace("aba", "a", "z")   = "zbz" 

Usage

From source file:org.apache.drill.common.util.DrillStringUtils.java

/**
 * Copied form commons-lang 2.x code as common-lang 3.x has this API removed.
 * (http://commons.apache.org/proper/commons-lang/article3_0.html#StringEscapeUtils.escapeSql)
 * @param str/*from   www  .j  av a  2s . c o m*/
 * @return
 */
public static String escapeSql(String str) {
    return (str == null) ? null : StringUtils.replace(str, "'", "''");
}

From source file:org.apache.fineract.infrastructure.dataexport.service.DataExportWritePlatformServiceImpl.java

/**
 * Adds a join statements, select statements or where clauses
 * This method prevents the addition of duplicate join statements
 * //from w w w  .java 2  s. co  m
 * @param dataExportEntityData
 * @param aliasPostfixNumber
 * @param sqlBuilder
 * @param sqlJoinMap
 * @param isSelectStatement
 * @param filterValue
 */
private void addCoreColumnSqlToSqlBuilder(final DataExportEntityData dataExportEntityData,
        final EntityColumnMetaData columnMetaData, final SQL sqlBuilder,
        final HashMap<String, DataExportSqlJoin> sqlJoinMap, final boolean isSelectStatement,
        final String filterValue, final MutableInt aliasPostfixNumber) {
    final String columnName = columnMetaData.getName();
    final String columnLabel = columnMetaData.getLabel();
    final DataExportCoreColumn coreColumn = DataExportCoreColumn.newInstanceFromName(columnName);
    final String baseEntityName = dataExportEntityData.getEntityName();
    final DataExportBaseEntity baseEntity = DataExportBaseEntity.fromEntityName(baseEntityName);
    final DataExportCoreTable baseEntityCoreTable = DataExportCoreTable.newInstance(baseEntity.getTableName());

    // variables initialized with null values
    String sqlStatement, mClientTableAlias, mGroupTableAlias, mGroupClientTableAlias, mOfficeTableAlias,
            mStaffTableAlias, mLoanTableAlias, mProductLoanTableAlias, mPaymentDetailTableAlias,
            mSavingsProductTableAlias, sqlJoinKey, parentTableAlias, mSavingsAccountTableAlias,
            mAppUserTableAlias;
    DataExportSqlJoin dataExportSqlJoin;

    if (coreColumn != null) {
        String referencedTableName = coreColumn.getReferencedTableName();
        DataExportCoreTable referencedTable = DataExportCoreTable.newInstance(referencedTableName);
        String referencedColumnName = coreColumn.getReferencedColumnName();
        String foreignKeyIndexColumnName = coreColumn.getForeignKeyIndexColumnName();

        switch (baseEntity) {
        case CLIENT:
            switch (coreColumn) {
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupClientTableAlias = DataExportCoreTable.M_GROUP_CLIENT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_client and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP_CLIENT.getName() + "` `"
                            + mGroupClientTableAlias + "` on `" + mGroupClientTableAlias + "`.`client_id` = `"
                            + baseEntityName + "`.`id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, baseEntityName,
                            mGroupClientTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getChildTableAlias() + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_CLIENT);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    // m_office/m_staff and m_client table join
                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + baseEntityName + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_CLIENT, sqlStatement, parentTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case CLIENT_ID:
            case CLIENT_NAME:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "`" + baseEntityName + "`.`" + referencedColumnName + "` as `"
                            + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + baseEntityName + "`.`" + referencedColumnName + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case PHONE_NUMBER:
            case DATE_OF_BIRTH:
            case GENDER:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "`" + baseEntityName + "`.`" + coreColumn.getName() + "` as `"
                            + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + baseEntityName + "`.`" + coreColumn.getName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;

        case GROUP:
            switch (coreColumn) {
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "`" + baseEntityName + "`.`" + referencedColumnName + "` as `"
                            + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + baseEntityName + "`.`" + referencedColumnName + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_GROUP);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    // m_office/m_staff and m_group table join
                    sqlStatement = "`" + referencedTableName + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + baseEntityName + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_GROUP, sqlStatement, parentTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;

        case LOAN:
            switch (coreColumn) {
            case LOAN_OFFICER_NAME:
            case CLIENT_NAME:
            case CLIENT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    // m_client/m_staff and m_loan
                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + baseEntityName + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, parentTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupClientTableAlias = DataExportCoreTable.M_GROUP_CLIENT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP_CLIENT.getName() + "` `"
                            + mGroupClientTableAlias + "` on `" + mGroupClientTableAlias + "`.`client_id` = `"
                            + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, baseEntityName,
                            mGroupClientTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = case when " + "isnull(`" + baseEntityName
                            + "`.`group_id`) then `" + dataExportSqlJoin.getChildTableAlias()
                            + "`.`group_id` else `" + baseEntityName + "`.`group_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `" + baseEntityName + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin clientLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin groupLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mOfficeTableAlias = DataExportCoreTable.M_OFFICE.getAlias(aliasPostfixNumber.intValue());

                    // m_office and m_client/m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_OFFICE.getName() + "` `" + mOfficeTableAlias
                            + "` on `" + mOfficeTableAlias + "`.`id` = case when " + "isnull(`" + baseEntityName
                            + "`.`group_id`) then `" + clientLoanSqlJoin.getParentTableAlias()
                            + "`.`office_id` else `" + groupLoanSqlJoin.getParentTableAlias()
                            + "`.`office_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_OFFICE,
                            DataExportCoreTable.M_LOAN, sqlStatement, mOfficeTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_LOAN);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `" + baseEntityName + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin clientLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin groupLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_staff and m_client/m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = case when " + "isnull(`" + baseEntityName
                            + "`.`group_id`) then `" + clientLoanSqlJoin.getParentTableAlias()
                            + "`.`staff_id` else `" + groupLoanSqlJoin.getParentTableAlias()
                            + "`.`staff_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_LOAN, sqlStatement, mStaffTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case DATE_OF_BIRTH:
            case PHONE_NUMBER:
            case GENDER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;
            case LOAN_ARREARS_AMOUNT:
            case LOAN_ARREARS_DATE:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    // m_client/m_staff and m_loan
                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`loan_id` = `" + baseEntityName + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, parentTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_ARREARS_DAYS:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    // m_client/m_staff and m_loan
                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`loan_id` = `" + baseEntityName + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, parentTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "DATEDIFF(CURDATE(), `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + referencedColumnName + "`) as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "DATEDIFF(CURDATE(), `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + referencedColumnName + "`) " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;

        case SAVINGS_ACCOUNT:
            switch (coreColumn) {
            case CLIENT_NAME:
            case CLIENT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    // m_client/m_staff and m_savings_account
                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + baseEntityName + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, parentTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupClientTableAlias = DataExportCoreTable.M_GROUP_CLIENT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP_CLIENT.getName() + "` `"
                            + mGroupClientTableAlias + "` on `" + mGroupClientTableAlias + "`.`client_id` = `"
                            + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, baseEntityName,
                            mGroupClientTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = case when " + "isnull(`" + baseEntityName
                            + "`.`group_id`) then `" + dataExportSqlJoin.getChildTableAlias()
                            + "`.`group_id` else `" + baseEntityName + "`.`group_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mClientTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `" + baseEntityName + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mGroupTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin clientSavingsAccount = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin groupSavingsAccount = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mOfficeTableAlias = DataExportCoreTable.M_OFFICE.getAlias(aliasPostfixNumber.intValue());

                    // m_office and m_client/m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_OFFICE.getName() + "` `" + mOfficeTableAlias
                            + "` on `" + mOfficeTableAlias + "`.`id` = case when " + "isnull(`" + baseEntityName
                            + "`.`group_id`) then `" + clientSavingsAccount.getParentTableAlias()
                            + "`.`office_id` else `" + groupSavingsAccount.getParentTableAlias()
                            + "`.`office_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_OFFICE,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mOfficeTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mClientTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `" + baseEntityName + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mGroupTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin clientSavingsAccount = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin groupSavingsAccount = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_staff and m_client/m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = case when " + "isnull(`" + baseEntityName
                            + "`.`group_id`) then `" + clientSavingsAccount.getParentTableAlias()
                            + "`.`staff_id` else `" + groupSavingsAccount.getParentTableAlias()
                            + "`.`staff_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mStaffTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case DATE_OF_BIRTH:
            case PHONE_NUMBER:
            case GENDER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mClientTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;

        case LOAN_TRANSACTION:
            switch (coreColumn) {
            case LOAN_TRANSACTION_TOTAL_REPAID:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`amount` " + "is not null and `"
                            + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.REPAYMENT.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`amount` " + "is not null and `"
                            + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.REPAYMENT.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_PRINCIPAL_REPAID:
            case LOAN_TRANSACTION_INTEREST_REPAID:
            case LOAN_TRANSACTION_FEES_REPAID:
            case LOAN_TRANSACTION_PENALTIES_REPAID:
            case LOAN_TRANSACTION_OVERPAYMENT_REPAID:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`" + coreColumn.getName() + "` "
                            + "is not null and `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.REPAYMENT.getValue() + " then `" + baseEntityName + "`.`"
                            + coreColumn.getName() + "` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`" + coreColumn.getName() + "` "
                            + "is not null and `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.REPAYMENT.getValue() + " then `" + baseEntityName + "`.`"
                            + coreColumn.getName() + "` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_INTEREST_ACCRUED:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`interest_portion_derived` "
                            + "is not null and `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.ACCRUAL.getValue() + " then `" + baseEntityName
                            + "`.`interest_portion_derived` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`interest_portion_derived` "
                            + "is not null and `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.ACCRUAL.getValue() + " then `" + baseEntityName
                            + "`.`interest_portion_derived` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_INTEREST_WAIVED:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`interest_portion_derived` "
                            + "is not null and `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.WAIVE_INTEREST.getValue() + " then `" + baseEntityName
                            + "`.`interest_portion_derived` " + "else NULL end as `" + coreColumn.getLabel()
                            + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`interest_portion_derived` "
                            + "is not null and `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.WAIVE_INTEREST.getValue() + " then `" + baseEntityName
                            + "`.`interest_portion_derived` " + "else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;
            case LOAN_TRANSACTION_TRANSFER_AMOUNT:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.APPROVE_TRANSFER.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.APPROVE_TRANSFER.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end `" + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_TOTAL_RECOVERED:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.RECOVERY_REPAYMENT.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + LoanTransactionType.RECOVERY_REPAYMENT.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end `" + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_PRODUCT_SHORT_NAME:
            case LOAN_TRANSACTION_PRODUCT_NAME:
            case LOAN_TRANSACTION_PRODUCT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mProductLoanTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + mProductLoanTableAlias + "` on `"
                            + mProductLoanTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias()
                            + "`.`" + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, mProductLoanTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_LOAN_ACCOUNT_NUMBER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_PAYMENT_CHANNEL:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_PAYMENT_DETAIL,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mPaymentDetailTableAlias = DataExportCoreTable.M_PAYMENT_DETAIL
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_PAYMENT_DETAIL.getName() + "` `"
                            + mPaymentDetailTableAlias + "` on `" + mPaymentDetailTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`payment_detail_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_PAYMENT_DETAIL,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mPaymentDetailTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_PAYMENT_DETAIL);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_PAYMENT_DETAIL, sqlStatement, parentTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_REFERENCE:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_PAYMENT_DETAIL,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mPaymentDetailTableAlias = DataExportCoreTable.M_PAYMENT_DETAIL
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_PAYMENT_DETAIL.getName() + "` `"
                            + mPaymentDetailTableAlias + "` on `" + mPaymentDetailTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`payment_detail_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_PAYMENT_DETAIL,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mPaymentDetailTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_OFFICER_NAME:
            case CLIENT_NAME:
            case CLIENT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, parentTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupClientTableAlias = DataExportCoreTable.M_GROUP_CLIENT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP_CLIENT.getName() + "` `"
                            + mGroupClientTableAlias + "` on `" + mGroupClientTableAlias + "`.`client_id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement,
                            dataExportSqlJoin.getParentTableAlias(), mGroupClientTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION);

                    DataExportSqlJoin loanTransactionSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_CLIENT);

                    DataExportSqlJoin loanGroupClientSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = case when " + "isnull(`"
                            + loanTransactionSqlJoin.getParentTableAlias() + "`.`group_id`) then `"
                            + loanGroupClientSqlJoin.getChildTableAlias() + "`.`group_id` else `"
                            + loanTransactionSqlJoin.getParentTableAlias() + "`.`group_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, mGroupTableAlias,
                            loanGroupClientSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mOfficeTableAlias = DataExportCoreTable.M_OFFICE.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_OFFICE.getName() + "` `" + mOfficeTableAlias
                            + "` on `" + mOfficeTableAlias + "`.`id` = `" + baseEntityName + "`.`office_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_OFFICE,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mOfficeTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION);

                    DataExportSqlJoin loanTransactionSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `"
                            + loanTransactionSqlJoin.getParentTableAlias() + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias,
                            loanTransactionSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION);

                    DataExportSqlJoin loanTransactionSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin clientLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin groupLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = case when " + "isnull(`"
                            + loanTransactionSqlJoin.getParentTableAlias() + "`.`group_id`) then `"
                            + clientLoanSqlJoin.getParentTableAlias() + "`.`staff_id` else `"
                            + groupLoanSqlJoin.getParentTableAlias() + "`.`staff_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_LOAN, sqlStatement, mStaffTableAlias,
                            loanTransactionSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case DATE_OF_BIRTH:
            case PHONE_NUMBER:
            case GENDER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_TRANSACTION_CREATED_BY:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_APP_USER,
                        DataExportCoreTable.M_LOAN_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mAppUserTableAlias = DataExportCoreTable.M_APP_USER.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_APP_USER.getName() + "` `" + mAppUserTableAlias
                            + "` on `" + mAppUserTableAlias + "`.`id` = `" + baseEntityName + "`.`"
                            + coreColumn.getForeignKeyIndexColumnName() + "` ";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_APP_USER,
                            DataExportCoreTable.M_LOAN_TRANSACTION, sqlStatement, mAppUserTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;
        case SAVINGS_ACCOUNT_TRANSACTION:
            switch (coreColumn) {
            case SAVINGS_TRANSACTION_DEPOSIT:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.DEPOSIT.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.DEPOSIT.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_INTEREST_POSTING:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.INTEREST_POSTING.getValue() + " then `"
                            + baseEntityName + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.INTEREST_POSTING.getValue() + " then `"
                            + baseEntityName + "`.`amount` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_CHARGE_APPLIED:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.WITHDRAWAL_FEE.getValue() + " or `" + baseEntityName
                            + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.ANNUAL_FEE.getValue() + " then `" + baseEntityName
                            + "`.`amount` " + "else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.WITHDRAWAL_FEE.getValue() + " or `" + baseEntityName
                            + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.ANNUAL_FEE.getValue() + " then `" + baseEntityName
                            + "`.`amount` " + "else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_CHARGE_WAIVED:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.WAIVE_CHARGES.getValue() + " then `"
                            + baseEntityName + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.WAIVE_CHARGES.getValue() + " then `"
                            + baseEntityName + "`.`amount` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_TRANSFER_AMOUNT:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.APPROVE_TRANSFER.getValue() + " then `"
                            + baseEntityName + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.APPROVE_TRANSFER.getValue() + " then `"
                            + baseEntityName + "`.`amount` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_PRODUCT_SHORT_NAME:
            case SAVINGS_TRANSACTION_PRODUCT_NAME:
            case SAVINGS_TRANSACTION_PRODUCT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsAccountTableAlias = DataExportCoreTable.M_SAVINGS_ACCOUNT
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_SAVINGS_ACCOUNT.getName() + "` `"
                            + mSavingsAccountTableAlias + "` on `" + mSavingsAccountTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`savings_account_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mSavingsAccountTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsProductTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + mSavingsProductTableAlias
                            + "` on `" + mSavingsProductTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`" + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mSavingsProductTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_ACCOUNT_NUMBER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsAccountTableAlias = DataExportCoreTable.M_SAVINGS_ACCOUNT
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_SAVINGS_ACCOUNT.getName() + "` `"
                            + mSavingsAccountTableAlias + "` on `" + mSavingsAccountTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`savings_account_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mSavingsAccountTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_PAYMENT_CHANNEL:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_PAYMENT_DETAIL,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mPaymentDetailTableAlias = DataExportCoreTable.M_PAYMENT_DETAIL
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_PAYMENT_DETAIL.getName() + "` `"
                            + mPaymentDetailTableAlias + "` on `" + mPaymentDetailTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`payment_detail_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_PAYMENT_DETAIL,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mPaymentDetailTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_PAYMENT_DETAIL);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_PAYMENT_DETAIL, sqlStatement, parentTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_REFERENCE:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_PAYMENT_DETAIL,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mPaymentDetailTableAlias = DataExportCoreTable.M_PAYMENT_DETAIL
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_PAYMENT_DETAIL.getName() + "` `"
                            + mPaymentDetailTableAlias + "` on `" + mPaymentDetailTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`payment_detail_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_PAYMENT_DETAIL,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mPaymentDetailTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_WITHDRAWAL:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.WITHDRAWAL.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "case when `" + baseEntityName + "`.`transaction_type_enum` = "
                            + SavingsAccountTransactionType.WITHDRAWAL.getValue() + " then `" + baseEntityName
                            + "`.`amount` else NULL end " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case CLIENT_NAME:
            case CLIENT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsAccountTableAlias = DataExportCoreTable.M_SAVINGS_ACCOUNT
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_SAVINGS_ACCOUNT.getName() + "` `"
                            + mSavingsAccountTableAlias + "` on `" + mSavingsAccountTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`savings_account_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mSavingsAccountTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, parentTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_SAVINGS_ACCOUNT);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsAccountTableAlias = DataExportCoreTable.M_SAVINGS_ACCOUNT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_SAVINGS_ACCOUNT.getName() + "` `"
                            + mSavingsAccountTableAlias + "` on `" + mSavingsAccountTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`savings_account_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mSavingsAccountTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupClientTableAlias = DataExportCoreTable.M_GROUP_CLIENT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP_CLIENT.getName() + "` `"
                            + mGroupClientTableAlias + "` on `" + mGroupClientTableAlias + "`.`client_id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement,
                            dataExportSqlJoin.getParentTableAlias(), mGroupClientTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_GROUP_CLIENT);

                    DataExportSqlJoin savingsAccountGroupClientSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = case when " + "isnull(`"
                            + savingsAccountGroupClientSqlJoin.getParentTableAlias() + "`.`group_id`) then `"
                            + savingsAccountGroupClientSqlJoin.getChildTableAlias() + "`.`group_id` else `"
                            + savingsAccountGroupClientSqlJoin.getParentTableAlias() + "`.`group_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, mGroupTableAlias,
                            savingsAccountGroupClientSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mOfficeTableAlias = DataExportCoreTable.M_OFFICE.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_OFFICE.getName() + "` `" + mOfficeTableAlias
                            + "` on `" + mOfficeTableAlias + "`.`id` = `" + baseEntityName + "`.`office_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_OFFICE,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement, mOfficeTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsAccountTableAlias = DataExportCoreTable.M_SAVINGS_ACCOUNT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_SAVINGS_ACCOUNT.getName() + "` `"
                            + mSavingsAccountTableAlias + "` on `" + mSavingsAccountTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`savings_account_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mSavingsAccountTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getChildTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin clientSavingsAccountSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `"
                            + clientSavingsAccountSqlJoin.getChildTableAlias() + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mGroupTableAlias,
                            clientSavingsAccountSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin clientSavingsAccountSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT);

                    DataExportSqlJoin groupSavingsAccountSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = case when " + "isnull(`"
                            + clientSavingsAccountSqlJoin.getChildTableAlias() + "`.`group_id`) then `"
                            + clientSavingsAccountSqlJoin.getParentTableAlias() + "`.`staff_id` else `"
                            + groupSavingsAccountSqlJoin.getParentTableAlias() + "`.`staff_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mStaffTableAlias,
                            clientSavingsAccountSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case DATE_OF_BIRTH:
            case PHONE_NUMBER:
            case GENDER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mSavingsAccountTableAlias = DataExportCoreTable.M_SAVINGS_ACCOUNT
                            .getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_SAVINGS_ACCOUNT.getName() + "` `"
                            + mSavingsAccountTableAlias + "` on `" + mSavingsAccountTableAlias + "`.`id` = `"
                            + baseEntityName + "`.`savings_account_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_SAVINGS_ACCOUNT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement,
                            mSavingsAccountTableAlias, baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case SAVINGS_TRANSACTION_CREATED_BY:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_APP_USER,
                        DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mAppUserTableAlias = DataExportCoreTable.M_APP_USER.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_APP_USER.getName() + "` `" + mAppUserTableAlias
                            + "` on `" + mAppUserTableAlias + "`.`id` = `" + baseEntityName + "`.`"
                            + coreColumn.getForeignKeyIndexColumnName() + "` ";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_APP_USER,
                            DataExportCoreTable.M_SAVINGS_ACCOUNT_TRANSACTION, sqlStatement, mAppUserTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;
        case LOAN_REPAYMENT_SCHEDULE:
            String outstandingInterest = "(ifnull(`" + baseEntityName + "`.`interest_amount`, 0)"
                    + " - ifnull(`" + baseEntityName + "`.`interest_writtenoff_derived`, 0)" + " - ifnull(`"
                    + baseEntityName + "`.`interest_waived_derived`, 0)" + " - ifnull(`" + baseEntityName
                    + "`.`interest_completed_derived`, 0))";

            String outstandingPrincipal = "(ifnull(`" + baseEntityName + "`.`principal_amount`, 0)"
                    + " - ifnull(`" + baseEntityName + "`.`principal_completed_derived`, 0)" + " - ifnull(`"
                    + baseEntityName + "`.`principal_writtenoff_derived`, 0))";

            String outstandingFees = "(ifnull(`" + baseEntityName + "`.`fee_charges_amount`, 0)" + " - ifnull(`"
                    + baseEntityName + "`.`fee_charges_completed_derived`, 0)" + " - ifnull(`" + baseEntityName
                    + "`.`fee_charges_writtenoff_derived`, 0)" + " - ifnull(`" + baseEntityName
                    + "`.`fee_charges_waived_derived`, 0))";

            String outstandingPenalties = "(ifnull(`" + baseEntityName + "`.`penalty_charges_amount`, 0)"
                    + " - ifnull(`" + baseEntityName + "`.`penalty_charges_completed_derived`, 0)"
                    + " - ifnull(`" + baseEntityName + "`.`penalty_charges_writtenoff_derived`, 0)"
                    + " - ifnull(`" + baseEntityName + "`.`penalty_charges_waived_derived`, 0))";

            switch (coreColumn) {
            case REPAYMENT_SCHEDULE_TOTAL_OUTSTANDING:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "(" + outstandingInterest + " + " + outstandingPrincipal + " + "
                            + outstandingFees + " + " + outstandingPenalties + ") as `" + coreColumn.getLabel()
                            + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);
                } else if (filterValue != null) {
                    sqlStatement = "(" + outstandingInterest + " + " + outstandingPrincipal + " + "
                            + outstandingFees + " + " + outstandingPenalties + ")" + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case REPAYMENT_SCHEDULE_PRINCIPAL_OUTSTANDING:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = outstandingPrincipal + " as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);
                } else if (filterValue != null) {
                    sqlStatement = outstandingPrincipal + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;

            case REPAYMENT_SCHEDULE_INTEREST_OUTSTANDING:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = outstandingInterest + " as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);
                } else if (filterValue != null) {
                    sqlStatement = outstandingInterest + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;

            case REPAYMENT_SCHEDULE_FEES_OUTSTANDING:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = outstandingFees + " as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);
                } else if (filterValue != null) {
                    sqlStatement = outstandingFees + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;

            case REPAYMENT_SCHEDULE_PENALTIES_OUTSTANDING:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = outstandingPenalties + " as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);
                } else if (filterValue != null) {
                    sqlStatement = outstandingPenalties + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;

            case REPAYMENT_SCHEDULE_TOTAL_EXPECTED:
                // =============================================================================
                if (isSelectStatement) {
                    sqlStatement = "(ifnull(`" + baseEntityName + "`.`principal_amount`, 0) + " + "ifnull(`"
                            + baseEntityName + "`.`interest_amount`, 0) + " + "ifnull(`" + baseEntityName
                            + "`.`fee_charges_amount`, 0) + " + "ifnull(`" + baseEntityName
                            + "`.`penalty_charges_amount`, 0)) " + "as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "(ifnull(`" + baseEntityName + "`.`principal_amount`, 0) + " + "ifnull(`"
                            + baseEntityName + "`.`interest_amount`, 0) + " + "ifnull(`" + baseEntityName
                            + "`.`fee_charges_amount`, 0) + " + "ifnull(`" + baseEntityName
                            + "`.`penalty_charges_amount`, 0)) " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case REPAYMENT_SCHEDULE_INTEREST_EXPECTED:
            case REPAYMENT_SCHEDULE_FEES_EXPECTED:
            case REPAYMENT_SCHEDULE_PENALTIES_EXPECTED:
            case REPAYMENT_SCHEDULE_PRINCIPAL_EXPECTED:
                // =============================================================================
                final String actualColumnName = StringUtils.replace(coreColumn.getName(), "repayment_schedule_",
                        "");

                if (isSelectStatement) {

                    sqlStatement = "`" + baseEntityName + "`.`" + actualColumnName + "` " + "as `"
                            + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {

                    sqlStatement = "`" + baseEntityName + "`.`" + actualColumnName + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;
            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);
                mLoanTableAlias = dataExportSqlJoin.getParentTableAlias();
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `" + mLoanTableAlias + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias, mLoanTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin clientLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin groupLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_staff and m_client/m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = case when " + "isnull(`" + mLoanTableAlias
                            + "`.`group_id`) then `" + clientLoanSqlJoin.getParentTableAlias()
                            + "`.`staff_id` else `" + groupLoanSqlJoin.getParentTableAlias()
                            + "`.`staff_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_LOAN, sqlStatement, mStaffTableAlias, mLoanTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case BRANCH_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                    dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                    DataExportSqlJoin loanScheduleSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin groupLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN);

                    DataExportSqlJoin clientLoanSqlJoin = sqlJoinMap.get(sqlJoinKey);

                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mOfficeTableAlias = DataExportCoreTable.M_OFFICE.getAlias(aliasPostfixNumber.intValue());

                    // m_office and m_client/m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_OFFICE.getName() + "` `" + mOfficeTableAlias
                            + "` on `" + mOfficeTableAlias + "`.`id` = case when " + "isnull(`"
                            + loanScheduleSqlJoin.getParentTableAlias() + "`.`group_id`) then `"
                            + clientLoanSqlJoin.getParentTableAlias() + "`.`office_id` else `"
                            + groupLoanSqlJoin.getParentTableAlias() + "`.`office_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_OFFICE,
                            DataExportCoreTable.M_LOAN, sqlStatement, mOfficeTableAlias,
                            loanScheduleSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_LOAN);

                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupClientTableAlias = DataExportCoreTable.M_GROUP_CLIENT
                            .getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP_CLIENT.getName() + "` `"
                            + mGroupClientTableAlias + "` on `" + mGroupClientTableAlias + "`.`client_id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement,
                            dataExportSqlJoin.getParentTableAlias(), mGroupClientTableAlias);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_GROUP_CLIENT);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_group_client and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = case when " + "isnull(`"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`group_id`) then `"
                            + dataExportSqlJoin.getChildTableAlias() + "`.`group_id` else `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`group_id` end";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_GROUP_CLIENT, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getChildTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case LOAN_OFFICER_NAME:
            case CLIENT_NAME:
            case CLIENT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    parentTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + parentTableAlias + "` on `"
                            + parentTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, parentTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case DATE_OF_BIRTH:
            case PHONE_NUMBER:
            case GENDER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_LOAN, sqlStatement, mClientTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case REPAYMENT_SCHEDULE_PRODUCT_SHORT_NAME:
            case REPAYMENT_SCHEDULE_PRODUCT_NAME:
            case REPAYMENT_SCHEDULE_PRODUCT_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(referencedTable, DataExportCoreTable.M_LOAN);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mProductLoanTableAlias = referencedTable.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + referencedTable.getName() + "` `" + mProductLoanTableAlias + "` on `"
                            + mProductLoanTableAlias + "`.`id` = `" + dataExportSqlJoin.getParentTableAlias()
                            + "`.`" + foreignKeyIndexColumnName + "`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(referencedTable,
                            DataExportCoreTable.M_LOAN, sqlStatement, mProductLoanTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            case REPAYMENT_SCHEDULE_LOAN_ACCOUNT_NUMBER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE);

                // only add the join statement if it hasn't been previously added
                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_LOAN_REPAYMENT_SCHEDULE, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + referencedColumnName
                            + "` " + filterValue;

                    // add the WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                // =============================================================================
                break;
            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;

        case GROUP_LOAN_MEMBER_ALLOCATION:
            switch (coreColumn) {
            case CLIENT_ID:
            case CLIENT_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mClientTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            case DATE_OF_BIRTH:
            case PHONE_NUMBER:
            case GENDER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mClientTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`" + coreColumn.getName()
                            + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            case LOAN_OFFICER_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_loan table join
                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_LOAN);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`loan_officer_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_LOAN, sqlStatement, mStaffTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            case GROUP_NAME:
            case GROUP_ID:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_loan table join
                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            case GROUP_LOAN_MEMBER_ALLOCATION_LOAN_ACCOUNT_NUMBER:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_loan table join
                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            case STAFF_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_CLIENT,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mClientTableAlias = DataExportCoreTable.M_CLIENT.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_client table join
                    sqlStatement = "`" + DataExportCoreTable.M_CLIENT.getName() + "` `" + mClientTableAlias
                            + "` on `" + mClientTableAlias + "`.`id` = `" + baseEntityName + "`.`client_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_CLIENT,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mClientTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_STAFF,
                        DataExportCoreTable.M_CLIENT);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mStaffTableAlias = DataExportCoreTable.M_STAFF.getAlias(aliasPostfixNumber.intValue());

                    // m_client and m_staff table join
                    sqlStatement = "`" + DataExportCoreTable.M_STAFF.getName() + "` `" + mStaffTableAlias
                            + "` on `" + mStaffTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`staff_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_STAFF,
                            DataExportCoreTable.M_CLIENT, sqlStatement, mStaffTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            case BRANCH_NAME:
                // =============================================================================
                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_LOAN,
                        DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mLoanTableAlias = DataExportCoreTable.M_LOAN.getAlias(aliasPostfixNumber.intValue());

                    // m_group_loan_member_allocation and m_loan table join
                    sqlStatement = "`" + DataExportCoreTable.M_LOAN.getName() + "` `" + mLoanTableAlias
                            + "` on `" + mLoanTableAlias + "`.`id` = `" + baseEntityName + "`.`loan_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_LOAN,
                            DataExportCoreTable.M_GROUP_LOAN_MEMBER_ALLOCATION, sqlStatement, mLoanTableAlias,
                            baseEntityName);

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_GROUP,
                        DataExportCoreTable.M_LOAN);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mGroupTableAlias = DataExportCoreTable.M_GROUP.getAlias(aliasPostfixNumber.intValue());

                    // m_loan and m_group table join
                    sqlStatement = "`" + DataExportCoreTable.M_GROUP.getName() + "` `" + mGroupTableAlias
                            + "` on `" + mGroupTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`group_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_GROUP,
                            DataExportCoreTable.M_LOAN, sqlStatement, mGroupTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.M_OFFICE,
                        DataExportCoreTable.M_GROUP);

                if (!sqlJoinMap.containsKey(sqlJoinKey)) {
                    // increment the alias postfix number
                    aliasPostfixNumber.increment();

                    mOfficeTableAlias = DataExportCoreTable.M_OFFICE.getAlias(aliasPostfixNumber.intValue());

                    // m_group and m_office table join
                    sqlStatement = "`" + DataExportCoreTable.M_OFFICE.getName() + "` `" + mOfficeTableAlias
                            + "` on `" + mOfficeTableAlias + "`.`id` = `"
                            + dataExportSqlJoin.getParentTableAlias() + "`.`office_id`";
                    dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.M_OFFICE,
                            DataExportCoreTable.M_GROUP, sqlStatement, mOfficeTableAlias,
                            dataExportSqlJoin.getParentTableAlias());

                    sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

                    // add the join to the map
                    sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
                }
                // =============================================================================

                // =============================================================================
                dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

                if (isSelectStatement) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` as `" + coreColumn.getLabel() + "`";

                    // add the select statement
                    sqlBuilder.SELECT(sqlStatement);

                } else if (filterValue != null) {
                    sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`"
                            + coreColumn.getReferencedColumnName() + "` " + filterValue;

                    // add a WHERE clause
                    sqlBuilder.WHERE(sqlStatement);
                }
                break;

            default:
                // =============================================================================
                if (isSelectStatement) {
                    // add the select statement
                    sqlStatement = "NULL as `" + coreColumn.getLabel() + "`";

                    sqlBuilder.SELECT(sqlStatement);
                }
                // =============================================================================
                break;
            }
            break;

        default:
            break;
        }
    } else if (columnName.equals("loan_status_id")) {
        // =============================================================================
        sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.R_ENUM_VALUE, baseEntityCoreTable)
                + "_loan_status_id";

        // only add the join statement if it hasn't been previously added
        if (!sqlJoinMap.containsKey(sqlJoinKey)) {
            // increment the alias postfix number
            aliasPostfixNumber.increment();

            String rEnumValuetableAlias = DataExportCoreTable.R_ENUM_VALUE
                    .getAlias(aliasPostfixNumber.intValue());

            sqlStatement = "`" + DataExportCoreTable.R_ENUM_VALUE.getName() + "` `" + rEnumValuetableAlias
                    + "` on `" + rEnumValuetableAlias + "`.`enum_id` = `" + baseEntityName + "`.`" + columnName
                    + "` and `" + rEnumValuetableAlias + "`.`enum_name` = '" + columnName + "'";
            dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.R_ENUM_VALUE,
                    baseEntityCoreTable, sqlStatement, rEnumValuetableAlias, baseEntityName);

            // update the DataExportSqlJoin id
            dataExportSqlJoin.updateId(sqlJoinKey);

            sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

            // add the join to the map
            sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
        }
        // =============================================================================

        // =============================================================================
        dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

        if (isSelectStatement) {
            sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`enum_value` as `" + columnLabel
                    + "`";

            // add the select statement
            sqlBuilder.SELECT(sqlStatement);

        } else if (filterValue != null) {
            sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`enum_value`" + filterValue;

            // add a WHERE clause
            sqlBuilder.WHERE(sqlStatement);
        }
        // =============================================================================
    } else if (columnName.equals("loan_type_enum")) {
        // =============================================================================
        sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.R_ENUM_VALUE, baseEntityCoreTable)
                + "_loan_type_enum";

        // only add the join statement if it hasn't been previously added
        if (!sqlJoinMap.containsKey(sqlJoinKey)) {
            // increment the alias postfix number
            aliasPostfixNumber.increment();

            String rEnumValuetableAlias = DataExportCoreTable.R_ENUM_VALUE
                    .getAlias(aliasPostfixNumber.intValue());

            sqlStatement = "`" + DataExportCoreTable.R_ENUM_VALUE.getName() + "` `" + rEnumValuetableAlias
                    + "` on `" + rEnumValuetableAlias + "`.`enum_id` = `" + baseEntityName + "`.`" + columnName
                    + "` and `" + rEnumValuetableAlias + "`.`enum_name` = '" + columnName + "'";
            dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.R_ENUM_VALUE,
                    baseEntityCoreTable, sqlStatement, rEnumValuetableAlias, baseEntityName);

            // update the DataExportSqlJoin id
            dataExportSqlJoin.updateId(sqlJoinKey);

            sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

            // add the join to the map
            sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
        }
        // =============================================================================

        // =============================================================================
        dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

        if (isSelectStatement) {
            sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`enum_value` as `" + columnLabel
                    + "`";

            // add the select statement
            sqlBuilder.SELECT(sqlStatement);

        } else if (filterValue != null) {
            sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`enum_value`" + filterValue;

            // add a WHERE clause
            sqlBuilder.WHERE(sqlStatement);
        }
        // =============================================================================
    } else if (columnName.equals("status_enum")) {
        // =============================================================================
        sqlJoinKey = DataExportSqlJoin.createId(DataExportCoreTable.R_ENUM_VALUE, baseEntityCoreTable)
                + "_status_enum";

        // only add the join statement if it hasn't been previously added
        if (!sqlJoinMap.containsKey(sqlJoinKey)) {
            // increment the alias postfix number
            aliasPostfixNumber.increment();

            String rEnumValuetableAlias = DataExportCoreTable.R_ENUM_VALUE
                    .getAlias(aliasPostfixNumber.intValue());

            sqlStatement = "`" + DataExportCoreTable.R_ENUM_VALUE.getName() + "` `" + rEnumValuetableAlias
                    + "` on `" + rEnumValuetableAlias + "`.`enum_id` = `" + baseEntityName + "`.`" + columnName
                    + "` and `" + rEnumValuetableAlias + "`.`enum_name` = '" + columnName + "'";
            dataExportSqlJoin = DataExportSqlJoin.newInstance(DataExportCoreTable.R_ENUM_VALUE,
                    baseEntityCoreTable, sqlStatement, rEnumValuetableAlias, baseEntityName);

            // update the DataExportSqlJoin id
            dataExportSqlJoin.updateId(sqlJoinKey);

            sqlBuilder.LEFT_OUTER_JOIN(sqlStatement);

            // add the join to the map
            sqlJoinMap.put(dataExportSqlJoin.getId(), dataExportSqlJoin);
        }
        // =============================================================================

        // =============================================================================
        dataExportSqlJoin = sqlJoinMap.get(sqlJoinKey);

        if (isSelectStatement) {
            sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`enum_value` as `" + columnLabel
                    + "`";

            // add the select statement
            sqlBuilder.SELECT(sqlStatement);

        } else if (filterValue != null) {
            sqlStatement = "`" + dataExportSqlJoin.getParentTableAlias() + "`.`enum_value`" + filterValue;

            // add a WHERE clause
            sqlBuilder.WHERE(sqlStatement);
        }
        // =============================================================================
    } else {
        // =============================================================================
        if (isSelectStatement) {
            sqlStatement = "`" + baseEntityName + "`.`" + columnName + "` as `" + columnLabel + "`";

            // add the select statement
            sqlBuilder.SELECT(sqlStatement);

        } else if (filterValue != null) {
            sqlStatement = "`" + baseEntityName + "`.`" + columnName + "` " + filterValue;

            // add a WHERE clause
            sqlBuilder.WHERE(sqlStatement);
        }
        // =============================================================================
    }
}

From source file:org.apache.gobblin.hive.policy.HiveRegistrationPolicyBase.java

/***
 * Obtain Hive table names filtered by <code>dbPrefix</code> (if present).
 *
 * The returned {@link List} contains://from w w  w.  j  av  a  2s  .  c o  m
 *  A. If <code>dbPrefix</code> is absent:
 *    1. Table name returned by {@link #getTableName(Path)}
 *    2. Table names specified by <code>additional.hive.table.names</code>
 *  B. If dbPrefix is present:
 *    1. Table names specified by <code>dbPrefix.hive.table.names</code>
 *
 * In table names above, the {@value PRIMARY_TABLE_TOKEN} if present is also replaced by the
 * table name obtained via {@link #getTableName(Path)}.
 *
 * @param dbPrefix Prefix to the property <code>additional.table.names</code>, to obtain table names only
 *                         for the specified db. Eg. If <code>dbPrefix</code> is db, then
 *                         <code>db.hive.table.names</code> is the resolved property name.
 * @param path Path for the table on filesystem.
 * @return Table names to register.
 */
protected List<String> getTableNames(Optional<String> dbPrefix, Path path) {
    List<String> tableNames = Lists.newArrayList();

    Optional<String> primaryTableName;
    if ((primaryTableName = getTableName(path)).isPresent() && !dbPrefix.isPresent()) {
        tableNames.add(primaryTableName.get());
    }
    Optional<Config> configForTopic = Optional.<Config>absent();
    if (primaryTableName.isPresent()) {
        Timer.Context context = this.metricContext.timer(CONFIG_FOR_TOPIC_TIMER).time();
        configForTopic = ConfigStoreUtils.getConfigForTopic(this.props.getProperties(), KafkaSource.TOPIC_NAME,
                this.configClient);
        context.close();
    }

    String additionalNamesProp;
    if (dbPrefix.isPresent()) {
        additionalNamesProp = String.format("%s.%s", dbPrefix.get(), HIVE_TABLE_NAME);
    } else {
        additionalNamesProp = ADDITIONAL_HIVE_TABLE_NAMES;
    }

    if (configForTopic.isPresent() && configForTopic.get().hasPath(additionalNamesProp)) {
        for (String additionalTableName : Splitter.on(",").trimResults()
                .splitToList(configForTopic.get().getString(additionalNamesProp))) {
            String resolvedTableName = StringUtils.replace(additionalTableName, PRIMARY_TABLE_TOKEN,
                    primaryTableName.get());
            tableNames.add(this.tableNamePrefix + resolvedTableName + this.tableNameSuffix);
        }
    } else if (!Strings.isNullOrEmpty(this.props.getProp(additionalNamesProp))) {
        for (String additionalTableName : this.props.getPropAsList(additionalNamesProp)) {
            String resolvedTableName = primaryTableName.isPresent()
                    ? StringUtils.replace(additionalTableName, PRIMARY_TABLE_TOKEN, primaryTableName.get())
                    : additionalTableName;
            tableNames.add(this.tableNamePrefix + resolvedTableName + this.tableNameSuffix);
        }
    }

    return tableNames;
}

From source file:org.apache.gobblin.util.test.RetentionTestHelper.java

/**
*
* Does gobblin retention for test data. {@link DatasetCleaner} which does retention in production can not be directly called as we need to resolve some
* runtime properties like ${testNameTempPath}. This directory contains all the setup data created for a test by {@link RetentionTestDataGenerator#setup()}.
* It is unique for each test./*from  www .  j a  va  2 s.c  o m*/
* The default {@link ConfigClient} used by {@link DatasetCleaner} connects to config store configs. We need to provide a
* mock {@link ConfigClient} since the configs are in classpath and not on config store.
*
* @param retentionConfigClasspathResource this is the same jobProps/config files used while running a real retention job
* @param testNameTempPath temp path for this test where test data is generated
*/
public static void clean(FileSystem fs, Path retentionConfigClasspathResource,
        Optional<Path> additionalJobPropsClasspathResource, Path testNameTempPath) throws Exception {

    Properties additionalJobProps = new Properties();
    if (additionalJobPropsClasspathResource.isPresent()) {
        try (final InputStream stream = RetentionTestHelper.class.getClassLoader()
                .getResourceAsStream(additionalJobPropsClasspathResource.get().toString())) {
            additionalJobProps.load(stream);
        }
    }

    if (retentionConfigClasspathResource.getName().endsWith(".job")) {

        Properties jobProps = new Properties();
        try (final InputStream stream = RetentionTestHelper.class.getClassLoader()
                .getResourceAsStream(retentionConfigClasspathResource.toString())) {
            jobProps.load(stream);
            for (Entry<Object, Object> entry : jobProps.entrySet()) {
                jobProps.put(entry.getKey(), StringUtils.replace((String) entry.getValue(),
                        "${testNameTempPath}", testNameTempPath.toString()));
            }
        }

        MultiCleanableDatasetFinder finder = new MultiCleanableDatasetFinder(fs, jobProps);
        for (Dataset dataset : finder.findDatasets()) {
            ((CleanableDataset) dataset).clean();
        }
    } else {
        Config testConfig = ConfigFactory.parseResources(retentionConfigClasspathResource.toString())
                .withFallback(ConfigFactory.parseMap(ImmutableMap.of("testNameTempPath",
                        PathUtils.getPathWithoutSchemeAndAuthority(testNameTempPath).toString())))
                .resolve();

        ConfigClient client = mock(ConfigClient.class);
        when(client.getConfig(any(String.class))).thenReturn(testConfig);
        Properties jobProps = new Properties();
        jobProps.setProperty(CleanableDatasetBase.SKIP_TRASH_KEY, Boolean.toString(true));
        jobProps.setProperty(ConfigurationKeys.CONFIG_MANAGEMENT_STORE_URI, "dummy");
        jobProps.setProperty(ConfigurationKeys.CONFIG_MANAGEMENT_STORE_ENABLED, "true");

        jobProps.putAll(additionalJobProps);

        @SuppressWarnings("unchecked")
        DatasetsFinder<CleanableDataset> finder = (DatasetsFinder<CleanableDataset>) GobblinConstructorUtils
                .invokeFirstConstructor(
                        Class.forName(
                                testConfig.getString(MultiCleanableDatasetFinder.DATASET_FINDER_CLASS_KEY)),
                        ImmutableList.of(fs, jobProps, testConfig, client),
                        ImmutableList.of(fs, jobProps, client));

        for (CleanableDataset dataset : finder.findDatasets()) {
            dataset.clean();
        }
    }
}

From source file:org.apache.metron.parsing.parsers.MetronGrok.java

/**
 * Compile the {@code Grok} pattern to named regex pattern.
 *
 * @param pattern : Grok pattern (ex: %{IP})
 * @throws Exception/*from w  w  w. ja v a 2  s  . co  m*/
 */
public void compile(String pattern) throws Exception {

    if (StringUtils.isBlank(pattern)) {
        throw new Exception("{pattern} should not be empty or null");
    }

    namedRegex = pattern;
    originalGrokPattern = pattern;
    int index = 0;
    /** flag for infinite recurtion */
    int iterationLeft = 1000;
    Boolean continueIteration = true;

    // Replace %{foo} with the regex (mostly groupname regex)
    // and then compile the regex
    while (continueIteration) {
        continueIteration = false;
        if (iterationLeft <= 0) {
            throw new Exception("Deep recursion pattern compilation of " + originalGrokPattern);
        }
        iterationLeft--;

        Matcher m = GrokUtils.GROK_PATTERN.matcher(namedRegex);
        // Match %{Foo:bar} -> pattern name and subname
        // Match %{Foo=regex} -> add new regex definition
        if (m.find()) {
            continueIteration = true;
            Map<String, String> group = m.namedGroups();
            if (group.get("definition") != null) {
                try {
                    addPattern(group.get("pattern"), group.get("definition"));
                    group.put("name", group.get("name") + "=" + group.get("definition"));
                } catch (Exception e) {
                    // Log the exeception
                }
            }
            namedRegexCollection.put("name" + index,
                    (group.get("subname") != null ? group.get("subname") : group.get("name")));
            namedRegex = StringUtils.replace(namedRegex, "%{" + group.get("name") + "}",
                    "(?<name" + index + ">" + grokPatternDefinition.get(group.get("pattern")) + ")");
            // System.out.println(_expanded_pattern);
            index++;
        }
    }

    if (namedRegex.isEmpty()) {
        throw new Exception("Pattern not fount");
    }
    // Compile the regex
    compiledNamedRegex = Pattern.compile(namedRegex);
}

From source file:org.apache.nifi.processors.poi.ConvertExcelToCSVProcessor.java

/**
 * Takes the original input filename and updates it by removing the file extension and replacing it with
 * the .csv extension.//w w  w .  ja v  a 2s  . c om
 *
 * @param origFileName
 *  Original filename from the input file.
 *
 * @return
 *  The new filename with the .csv extension that should be place in the output flowfile's attributes
 */
private String updateFilenameToCSVExtension(String nifiUUID, String origFileName, String sheetName) {

    StringBuilder stringBuilder = new StringBuilder();

    if (StringUtils.isNotEmpty(origFileName)) {
        String ext = FilenameUtils.getExtension(origFileName);
        if (StringUtils.isNotEmpty(ext)) {
            stringBuilder.append(StringUtils.replace(origFileName, ("." + ext), ""));
        } else {
            stringBuilder.append(origFileName);
        }
    } else {
        stringBuilder.append(nifiUUID);
    }

    stringBuilder.append("_");
    stringBuilder.append(sheetName);
    stringBuilder.append(".");
    stringBuilder.append("csv");

    return stringBuilder.toString();
}

From source file:org.apache.nifi.scripting.JavaScriptScriptFactory.java

public String getScript(File scriptFile) throws IOException {
    StringBuilder sb = new StringBuilder();
    final String parent = StringUtils.replace(scriptFile.getParent(), "\\", "/");
    sb.append(PRELOADS).append("var $PATH = \"").append(parent).append("\"\n")
            .append(FileUtils.readFileToString(scriptFile, "UTF-8"));
    return sb.toString();
}

From source file:org.apache.nifi.scripting.ScriptEngineFactory.java

ScriptEngine getNewEngine(File scriptFile, String extension) throws ScriptException {
    ScriptEngine engine = scriptEngMgr.getEngineByExtension(extension);
    if (null == engine) {
        throw new IllegalArgumentException("No ScriptEngine exists for extension " + extension);
    }/*from  ww  w. j av a  2  s. c o m*/
    // Initialize some paths
    StringBuilder sb = new StringBuilder();
    switch (extension) {
    case "rb":
        String parent = scriptFile.getParent();
        parent = StringUtils.replace(parent, "\\", "/");
        sb.append("$:.unshift '").append(parent).append("'\n").append("$:.unshift File.join '").append(parent)
                .append("', 'lib'\n");
        engine.eval(sb.toString());

        break;
    case "py":
        parent = scriptFile.getParent();
        parent = StringUtils.replace(parent, "\\", "/");
        String lib = parent + "/lib";
        sb.append("import sys\n").append("sys.path.append('").append(parent).append("')\n")
                .append("sys.path.append('").append(lib).append("')\n").append("__file__ = '")
                .append(scriptFile.getAbsolutePath()).append("'\n");
        engine.eval(sb.toString());
        break;
    default:
        break;
    }

    Object threading = engine.getFactory().getParameter(THREADING);
    // the MULTITHREADED status means that the scripts need to be careful about sharing state
    if (THREAD_ISOLATED.equals(threading) || STATELESS.equals(threading) || MULTITHREADED.equals(threading)) {
        // replace prior instance if any
        threadSafeEngines.put(extension, engine);
    }
    return engine;
}

From source file:org.apache.rocketmq.filtersrv.filter.DynaCode.java

private String[] uploadSrcFile() throws Exception {
    List<String> srcFileAbsolutePaths = new ArrayList<String>(codeStrs.size());
    for (String code : codeStrs) {
        if (StringUtils.isNotBlank(code)) {
            String packageName = getPackageName(code);
            String className = getClassName(code);
            if (StringUtils.isNotBlank(className)) {
                File srcFile = null;
                BufferedWriter bufferWriter = null;
                try {
                    if (StringUtils.isBlank(packageName)) {
                        File pathFile = new File(sourcePath);

                        if (!pathFile.exists()) {
                            if (!pathFile.mkdirs()) {
                                throw new RuntimeException("create PathFile Error!");
                            }//from   ww w . ja  va  2 s . c  om
                        }
                        srcFile = new File(sourcePath + FILE_SP + className + ".java");
                    } else {
                        String srcPath = StringUtils.replace(packageName, ".", FILE_SP);
                        File pathFile = new File(sourcePath + FILE_SP + srcPath);

                        if (!pathFile.exists()) {
                            if (!pathFile.mkdirs()) {
                                throw new RuntimeException("create PathFile Error!");
                            }
                        }
                        srcFile = new File(pathFile.getAbsolutePath() + FILE_SP + className + ".java");
                    }
                    synchronized (loadClass) {
                        loadClass.put(getFullClassName(code), null);
                    }
                    if (null != srcFile) {
                        LOGGER.warn("Dyna Create Java Source File:---->" + srcFile.getAbsolutePath());
                        srcFileAbsolutePaths.add(srcFile.getAbsolutePath());
                        srcFile.deleteOnExit();
                    }
                    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                            new FileOutputStream(srcFile), encoding);
                    bufferWriter = new BufferedWriter(outputStreamWriter);
                    for (String lineCode : code.split(LINE_SP)) {
                        bufferWriter.write(lineCode);
                        bufferWriter.newLine();
                    }
                    bufferWriter.flush();
                } finally {
                    if (null != bufferWriter) {
                        bufferWriter.close();
                    }
                }
            }
        }
    }
    return srcFileAbsolutePaths.toArray(new String[srcFileAbsolutePaths.size()]);
}

From source file:org.apache.struts2.osgi.FelixOsgiHost.java

protected void addExportedPackages(Properties strutsConfigProps, Properties configProps) {
    String[] rootPackages = StringUtils.split((String) strutsConfigProps.get("scanning.package.includes"), ",");
    ResourceFinder finder = new ResourceFinder(StringUtils.EMPTY);
    List<String> exportedPackages = new ArrayList<String>();
    //build a list of subpackages
    for (String rootPackage : rootPackages) {
        try {//from w  ww .j a v  a  2 s .  c  om
            String version = null;
            if (rootPackage.indexOf(";") > 0) {
                String[] splitted = rootPackage.split(";");
                rootPackage = splitted[0];
                version = splitted[1];
            }
            Map<URL, Set<String>> subpackagesMap = finder
                    .findPackagesMap(StringUtils.replace(rootPackage.trim(), ".", "/"));
            for (Map.Entry<URL, Set<String>> entry : subpackagesMap.entrySet()) {
                URL url = entry.getKey();
                Set<String> packages = entry.getValue();

                //get version if not set
                if (StringUtils.isBlank(version))
                    version = getVersion(url);

                if (packages != null) {
                    for (String subpackage : packages) {
                        exportedPackages.add(subpackage + "; version=" + version);
                    }
                }
            }
        } catch (IOException e) {
            if (LOG.isErrorEnabled())
                LOG.error("Unable to find subpackages of [#0]", e, rootPackage);
        }
    }

    //make a string with the exported packages and add it to the system properties
    if (!exportedPackages.isEmpty()) {
        String systemPackages = (String) configProps.get(Constants.FRAMEWORK_SYSTEMPACKAGES);
        systemPackages = StringUtils.chomp(systemPackages, ",") + "," + StringUtils.join(exportedPackages, ",");
        configProps.put(Constants.FRAMEWORK_SYSTEMPACKAGES, systemPackages);
    }
}