mardi 15 mai 2018

Alternative to if-else statements or better approach

There are 4 different user input fields like Multiselect Drop downs on the UI. The user can provid different combinations of input fields to narrow the result set. (Either select all/few options from the multi-select options).

Example: 2 Multiselect options

Multiselect Option A having elements{"10xyz1","11xyz1",...},

Multiselect Option B having elements{"xyz101","abc111",...}

2^2 possible input combinations(**Hint: Binary Truth Table):

1) Select ALL elements from Multiselect Option A && Select ALL elements from Multiselect Option B,

2) Select ALL elements from Multiselect Option A && Select few elements from Multiselect Option B,

3) Select few elements from Multiselect Option A && Select ALL elements from Multiselect Option B,

4) Select few elements from Multiselect Option A && Select few elements from Multiselect Option B

Note: At least one element must be selected from either options

I have used if else statements to implement my logic(I have seperate mongo collection for each possible selection, for 4 fields, 16 possible combinations, so 16 mongo collections), but the problem is the code looks very ugly with a lot of if-else statements moreover over if there is one more field added to the UI then I have to check add additional conditional statements. For now the number of conditional if-else statements is 2^N (Where N is the number of Multiselect drop-down input fields).

Code Snippet:

    private void constructQuery(MongoQuEry query, AnalysisFilter filter)
    {
    query.addFilterField("_id.operator", MongoQuEry.OP_EQUALS, "alpha");

    query.addFilterField("_id.month_year", MongoQuEry.OP_IN, getListOfMonthYear(filter));


    String collectionName;
    if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllNode() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR.toString();
    } else if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllNode()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_PACKAGE.toString();
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllMarket() && filter.getAllCmts() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE.toString();
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
    } else if (filter.getAllMarket() && filter.getAllCmts()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_NODE_PACKAGE.toString();
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllMarket() && filter.getAllNode() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS.toString();
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
    } else if (filter.getAllMarket() && filter.getAllNode()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_PACKAGE.toString();
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllMarket() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_NODE.toString();
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
    } else if (filter.getAllMarket()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_CMTS_NODE_PACKAGE.toString();
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllCmts() && filter.getAllNode() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
    } else if (filter.getAllCmts() && filter.getAllNode()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_PACKAGE.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllCmts() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_NODE.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
    } else if (filter.getAllCmts()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_NODE_PACKAGE.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllNode() && filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
    } else if (filter.getAllNode()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_PACKAGE.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    } else if (filter.getAllPackage()) {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_NODE.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
    } else {
        collectionName = CollectionNames.ME_USAGE_MONTH_YEAR_MARKET_CMTS_NODE_PACKAGE.toString();
        query.addFilterField("_id.market", MongoQuEry.OP_IN, filter.getMarket());
        query.addFilterField("_id.cmts", MongoQuEry.OP_IN, filter.getCmts());
        query.addFilterField("_id.node", MongoQuEry.OP_IN, filter.getNode());
        query.addFilterField("_id.package", MongoQuEry.OP_IN, filter.getSubscriberPackage());
    }


    query.setCollection(collectionName);
    query.addGroupByFields("_id.operator", "_id.month_year");
    query.addAliasAggregateField("count", MongoQuEry.AGGR_SUM, "subscriber_count");

    int order = MongoQuEry.ORDER_ASC;
    query.addOrderByFields(order, "_id.month_year");

}

Aucun commentaire:

Enregistrer un commentaire