В пользовательском интерфейсе есть 4 различных поля ввода пользователя, например выпадающий список Multiselect.Пользователь может предоставить различные комбинации полей ввода, чтобы сузить набор результатов.(Либо выберите все / несколько опций из опций множественного выбора).
Пример: 2 варианта множественного выбора
Вариант множественного выбора A с элементами {"10xyz1", "11xyz1", ...},
Вариант множественного выбора B с элементами {" xyz101 "," abc111 ", ...}
2 ^ 2 возможных комбинаций ввода (Подсказка: двоичныйТаблица истинности ):
1) Выберите ВСЕ элементы из варианта Multiselect A && Выберите ВСЕ элементы из варианта Multiselect B,
2) Выберите ВСЕ элементы из параметра Multiselect Option A && Выберите несколько элементовиз Multiselect Option B,
3) Выберите несколько элементов из Multiselect Option A && Выберите ВСЕ элементы из Multiselect Option B,
4) Выберите несколько элементов из Multiselect Option A && Выберите несколько элементов из MultiselectОпция B
Примечание: по крайней мере один элемент должен быть выбран из любой опции
Я использовал операторы if else для реализации моей логики (у меня есть отдельная коллекция монго для каждоговозможный выборна, для 4 полей, 16 возможных комбинаций, то есть 16 коллекций монго), но проблема в том, что код выглядит очень некрасиво с большим количеством операторов if-else, более того, если в пользовательский интерфейс добавлено еще одно поле, то я должен проверитьдобавить дополнительные условные операторы.
На данный момент количество условных операторов if-else равно 2 ^ N (где N - количество раскрывающихся полей ввода Multiselect).
Фрагмент кода:
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");
}