File indexing completed on 2024-05-12 07:41:24

0001 /*
0002     File                 : DatasetModel.cpp
0003     Project              : LabPlot
0004     Description          : Wrapper class for the collections of datasets
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2019 Kovacs Ferencz <kferike98@gmail.com>
0007     SPDX-FileCopyrightText: 2019 Alexander Semke <alexander.semke@web.de>
0008 
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 
0012 #include "DatasetModel.h"
0013 #include <QVector>
0014 
0015 /*!
0016 \class DatasetModel
0017 \brief Wrapper class for datasets, and also for their categories and subcategories
0018 
0019 \ingroup kdefrontend
0020 */
0021 DatasetModel::DatasetModel(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetsMap) {
0022     initCollections(datasetsMap);
0023     initCategories(datasetsMap);
0024     initSubcategories(datasetsMap);
0025     initDatasets(datasetsMap);
0026 }
0027 
0028 DatasetModel::~DatasetModel() = default;
0029 
0030 /**
0031  * @brief Initializes the list of collections.
0032  */
0033 void DatasetModel::initCollections(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) {
0034     m_collectionList = datasetMap.keys();
0035 }
0036 
0037 /**
0038  * @brief Initializes the list of categories.
0039  */
0040 void DatasetModel::initCategories(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) {
0041     for (auto i = datasetMap.begin(); i != datasetMap.end(); ++i) {
0042         m_categories[i.key()] = i.value().keys();
0043 
0044         for (auto it = i.value().constBegin(); it != i.value().constEnd(); ++it) {
0045             const QString& category = it.key();
0046             if (!m_allCategories.contains(category))
0047                 m_allCategories.append(category);
0048         }
0049     }
0050 }
0051 
0052 /**
0053  * @brief Initializes the list of subcategories.
0054  */
0055 void DatasetModel::initSubcategories(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) {
0056     for (auto collection = datasetMap.begin(); collection != datasetMap.end(); ++collection) {
0057         const QMap<QString, QMap<QString, QVector<QString>>> collection_ = collection.value();
0058 
0059         for (auto category = collection_.begin(); category != collection_.end(); ++category) {
0060             m_subcategories[collection.key()][category.key()] = category.value().keys();
0061 
0062             for (auto it = category.value().constBegin(); it != category.value().constEnd(); ++it) {
0063                 const QString& subcategory = it.key();
0064                 if (!m_allSubcategories[category.key()].contains(subcategory))
0065                     m_allSubcategories[category.key()].append(subcategory);
0066             }
0067         }
0068     }
0069 }
0070 
0071 /**
0072  * @brief Initializes the list of datasets.
0073  */
0074 void DatasetModel::initDatasets(const QMap<QString, QMap<QString, QMap<QString, QVector<QString>>>>& datasetMap) {
0075     for (auto collection = datasetMap.begin(); collection != datasetMap.end(); ++collection) {
0076         const QMap<QString, QMap<QString, QVector<QString>>> collection_ = collection.value();
0077 
0078         for (auto category = collection_.begin(); category != collection_.end(); ++category) {
0079             const QMap<QString, QVector<QString>> category_ = category.value();
0080 
0081             for (auto subcategory = category_.begin(); subcategory != category_.end(); ++subcategory) {
0082                 m_datasets[collection.key()][category.key()][subcategory.key()] = subcategory.value().toList();
0083                 m_allDatasets[category.key()][subcategory.key()].append(subcategory.value().toList());
0084                 m_datasetList.append(subcategory.value().toList());
0085             }
0086         }
0087     }
0088 }
0089 
0090 /**
0091  * @brief Returns the list of categories.
0092  */
0093 QStringList DatasetModel::allCategories() {
0094     return QVariant(m_allCategories).toStringList();
0095 }
0096 
0097 /**
0098  * @brief Returns the list of subcategories of a given category.
0099  * @param category the category the subcategories of which will be returned
0100  */
0101 QStringList DatasetModel::allSubcategories(const QString& category) {
0102     return QVariant(m_allSubcategories[category]).toStringList();
0103 }
0104 
0105 /**
0106  * @brief Returns the list of datasets of a given category and subcategory.
0107  */
0108 QVariant DatasetModel::allDatasets(const QString& category, const QString& subcategory) {
0109     return {m_allDatasets[category][subcategory]};
0110 }
0111 
0112 /**
0113  * @brief Returns the list of every dataset.
0114  */
0115 QVariant DatasetModel::allDatasetsList() {
0116     return {m_datasetList};
0117 }
0118 
0119 /**
0120  * @brief Returns the list of categories for a given collection
0121  */
0122 QStringList DatasetModel::categories(const QString& collection) {
0123     if (!collection.isEmpty())
0124         return m_categories[collection];
0125     else
0126         return allCategories();
0127 }
0128 
0129 /**
0130  * @brief  Returns the list of subcategories of a given collection and category.
0131  */
0132 QStringList DatasetModel::subcategories(const QString& collection, const QString& category) {
0133     if (!collection.isEmpty())
0134         return m_subcategories[collection][category];
0135     else
0136         return allSubcategories(category);
0137 }
0138 
0139 /**
0140  * @brief Returns the list of datasets of a given collection, category and subcategory.
0141  */
0142 QStringList DatasetModel::datasets(const QString& collection, const QString& category, const QString& subcategory) {
0143     if (!collection.isEmpty())
0144         return m_datasets[collection][category][subcategory];
0145     else
0146         return allDatasets(category, subcategory).toStringList();
0147 }
0148 
0149 /**
0150  * @brief Returns the number of datasets belonging to the given collection
0151  */
0152 int DatasetModel::datasetCount(const QString& collection) {
0153     int count = 0;
0154     for (const QString& category : categories(collection)) {
0155         for (const QString& subcategory : subcategories(collection, category)) {
0156             count += datasets(collection, category, subcategory).size();
0157         }
0158     }
0159     return count;
0160 }
0161 
0162 /**
0163  * @brief Returns the number of datasets belonging to the given collection and category
0164  */
0165 int DatasetModel::datasetCount(const QString& collection, const QString& category) {
0166     int count = 0;
0167     for (const QString& subcategory : subcategories(collection, category))
0168         count += datasets(collection, category, subcategory).size();
0169 
0170     return count;
0171 }
0172 
0173 /**
0174  * @brief Returns the number of datasets belonging to the given collection, category and subcategory
0175  */
0176 int DatasetModel::datasetCount(const QString& collection, const QString& category, const QString& subcategory) {
0177     return datasets(collection, category, subcategory).size();
0178 }
0179 
0180 /**
0181  * @brief Returns the list of every collection.
0182  */
0183 QStringList DatasetModel::collections() {
0184     return m_collectionList;
0185 }