Populate table sizes

This commit is contained in:
eelke 2023-01-22 16:46:14 +01:00
parent 39dbab4d36
commit abc0dd892f
10 changed files with 47 additions and 62 deletions

View file

@ -57,10 +57,7 @@ void TablesTableModel::refresh()
if (!m_catalog) if (!m_catalog)
return; return;
// Later afscheiden naar filter functie
auto classes = m_catalog->classes(); auto classes = m_catalog->classes();
std::map<Oid, int> oidIndex;
rootNode.reset(); rootNode.reset();
auto nsfilter = GetNamespaceFilterLambda(); auto nsfilter = GetNamespaceFilterLambda();
@ -70,7 +67,8 @@ void TablesTableModel::refresh()
temp.emplace(e.oid(), e); temp.emplace(e.oid(), e);
TableTreeBuilder treeBuilder(temp, *m_catalog->inherits()); TableTreeBuilder treeBuilder(temp, *m_catalog->inherits());
rootNode = treeBuilder.Build(); auto [rn, oidIndex] = treeBuilder.Build();
rootNode = rn;
StartLoadTableSizes(std::move(oidIndex)); StartLoadTableSizes(std::move(oidIndex));
} }
@ -189,16 +187,6 @@ QVariant TablesTableModel::getData(const QModelIndex &index) const
return QVariant(); return QVariant();
} }
//PgClass TablesTableModel::getTable(int row) const
//{
// return rootNode->children[row]->_class;
//}
//Oid TablesTableModel::getTableOid(int row) const
//{
// return rootNode->children[row]->_class.oid();
//}
QVariant TablesTableModel::data(const QModelIndex &index, int role) const QVariant TablesTableModel::data(const QModelIndex &index, int role) const
{ {
if (role == Qt::DisplayRole) if (role == Qt::DisplayRole)
@ -221,7 +209,7 @@ QVariant TablesTableModel::data(const QModelIndex &index, int role) const
return QVariant(); return QVariant();
} }
void TablesTableModel::StartLoadTableSizes(std::map<Oid, int> oidIndex) void TablesTableModel::StartLoadTableSizes(OidClassIndex oidIndex)
{ {
QPointer p(this); QPointer p(this);
QtConcurrent::run([this] QtConcurrent::run([this]
@ -231,7 +219,7 @@ void TablesTableModel::StartLoadTableSizes(std::map<Oid, int> oidIndex)
.then(qApp, [p, oidIndex] (TableSizes sizes) .then(qApp, [p, oidIndex] (TableSizes sizes)
{ {
if (p) if (p)
p.data()->PopulateSizes(std::move(oidIndex), std::move(sizes)); p.data()->PopulateSizes(oidIndex, sizes);
}); });
} }
@ -280,20 +268,23 @@ TablesTableModel::TableSizes TablesTableModel::QueryTableSizes() const
return sizes; return sizes;
} }
void TablesTableModel::PopulateSizes(std::map<Oid, int> oidIndex, std::vector<TableSize> sizes) void TablesTableModel::PopulateSizes(
const OidClassIndex &oidIndex,
const std::vector<TableSize> &sizes
)
{ {
// for (auto s : sizes) for (auto s : sizes)
// { {
// auto findIter = oidIndex.find(s.oid); auto findIter = oidIndex.find(s.oid);
// if (findIter != oidIndex.end()) if (findIter != oidIndex.end())
// { {
// rootNode->children[findIter->second]->sizes = s; findIter->second->sizes = s;
// } }
// } }
// emit dataChanged( emit dataChanged(
// createIndex(0, TotalSizeCol), index(0, TotalSizeCol),
// createIndex(static_cast<int>(rootNode->children.size()), ToastSizeCol) index(static_cast<int>(rootNode->children.size()), ToastSizeCol)
// ); );
} }
const TableNode* TablesTableModel::nodeFromIndex(const QModelIndex &index) const TableNode* TablesTableModel::nodeFromIndex(const QModelIndex &index)

View file

@ -50,12 +50,10 @@ public:
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;
// PgClass getTable(int row) const;
RowItem rowItem(const QModelIndex &index) const RowItem rowItem(const QModelIndex &index) const
{ {
return nodeFromIndex(index)->_class; return nodeFromIndex(index)->_class;
} }
// Oid getTableOid(int row) const;
static const TableNode* nodeFromIndex(const QModelIndex &index); static const TableNode* nodeFromIndex(const QModelIndex &index);
@ -69,7 +67,6 @@ private:
std::shared_ptr<const PgDatabaseCatalog> m_catalog; std::shared_ptr<const PgDatabaseCatalog> m_catalog;
NamespaceFilter m_namespaceFilter = NamespaceFilter::User; NamespaceFilter m_namespaceFilter = NamespaceFilter::User;
//t_Tables m_tables;
std::shared_ptr<TableNode> rootNode; std::shared_ptr<TableNode> rootNode;
QMetaObject::Connection refreshConnection; QMetaObject::Connection refreshConnection;
std::shared_ptr<OpenDatabase> openDatabase; std::shared_ptr<OpenDatabase> openDatabase;
@ -78,9 +75,14 @@ private:
Oid getType(int column) const; Oid getType(int column) const;
QVariant getData(const QModelIndex &index) const; QVariant getData(const QModelIndex &index) const;
void StartLoadTableSizes(std::map<Oid, int> oidIndex); using OidClassIndex = std::map<Oid, std::shared_ptr<TableNode>>;
void StartLoadTableSizes(OidClassIndex oidIndex);
TableSizes QueryTableSizes() const; TableSizes QueryTableSizes() const;
void PopulateSizes(std::map<Oid, int> oidIndex, std::vector<TableSize> sizes); void PopulateSizes(
const OidClassIndex &oidIndex,
const std::vector<TableSize> &sizes
);
std::function<bool(const PgClass&)> GetNamespaceFilterLambda(); std::function<bool(const PgClass&)> GetNamespaceFilterLambda();

View file

@ -27,7 +27,7 @@ CatalogTablesPage::CatalogTablesPage(std::shared_ptr<OpenDatabase> opendatabase,
: QSplitter(Qt::Horizontal, parent) : QSplitter(Qt::Horizontal, parent)
, m_tablesTableView(this, new TablesTableModel(opendatabase, this)) , m_tablesTableView(this, new TablesTableModel(opendatabase, this))
{ {
auto tv = m_tablesTableView.tableView(); auto tv = m_tablesTableView.itemView();
tv->setSelectionMode(QAbstractItemView::SingleSelection); tv->setSelectionMode(QAbstractItemView::SingleSelection);
m_detailsTabs = new QTabWidget(this); m_detailsTabs = new QTabWidget(this);

View file

@ -12,7 +12,7 @@ DatabasesPage::DatabasesPage(std::shared_ptr<OpenDatabase> opendatabase, QWidget
: QSplitter(Qt::Horizontal, parent) : QSplitter(Qt::Horizontal, parent)
, m_databasesTableView(this, new DatabasesTableModel(opendatabase, this)) , m_databasesTableView(this, new DatabasesTableModel(opendatabase, this))
{ {
auto tv = m_databasesTableView.tableView(); auto tv = m_databasesTableView.itemView();
tv->setSelectionMode(QAbstractItemView::SingleSelection); tv->setSelectionMode(QAbstractItemView::SingleSelection);
tv->setContextMenuPolicy(Qt::ActionsContextMenu); tv->setContextMenuPolicy(Qt::ActionsContextMenu);
@ -23,7 +23,7 @@ DatabasesPage::DatabasesPage(std::shared_ptr<OpenDatabase> opendatabase, QWidget
m_tableSql = new SqlCodePreview(this); m_tableSql = new SqlCodePreview(this);
addWidget(m_tableSql); addWidget(m_tableSql);
connect(m_databasesTableView.tableView()->selectionModel(), &QItemSelectionModel::currentRowChanged, connect(m_databasesTableView.itemView()->selectionModel(), &QItemSelectionModel::currentRowChanged,
this, &DatabasesPage::databaseSelectionChanged); this, &DatabasesPage::databaseSelectionChanged);
connect(createDbAction, &QAction::triggered, connect(createDbAction, &QAction::triggered,
[this](auto checked) [this](auto checked)
@ -37,7 +37,7 @@ void DatabasesPage::setCatalog(std::shared_ptr<PgDatabaseCatalog> cat)
{ {
m_catalog = cat; m_catalog = cat;
m_databasesTableView.dataModel()->setDatabaseList(cat); m_databasesTableView.dataModel()->setDatabaseList(cat);
m_databasesTableView.tableView()->resizeColumnsToContents(); m_databasesTableView.itemView()->resizeColumnsToContents();
} }
void DatabasesPage::updateDatabaseDetails(const PgDatabase &db) void DatabasesPage::updateDatabaseDetails(const PgDatabase &db)

View file

@ -6,7 +6,7 @@ RolesPage::RolesPage(QWidget * parent)
: QSplitter(Qt::Horizontal, parent) : QSplitter(Qt::Horizontal, parent)
, m_rolesTableView(this) , m_rolesTableView(this)
{ {
auto tv = m_rolesTableView.tableView(); auto tv = m_rolesTableView.itemView();
tv->setSelectionMode(QAbstractItemView::SingleSelection); tv->setSelectionMode(QAbstractItemView::SingleSelection);
m_detailsTabs = new QTabWidget(this); m_detailsTabs = new QTabWidget(this);
@ -19,5 +19,5 @@ void RolesPage::setCatalog(std::shared_ptr<PgDatabaseCatalog> cat)
{ {
m_catalog = cat; m_catalog = cat;
m_rolesTableView.dataModel()->setRoleList(cat->authIds()); m_rolesTableView.dataModel()->setRoleList(cat->authIds());
m_rolesTableView.tableView()->resizeColumnsToContents(); m_rolesTableView.itemView()->resizeColumnsToContents();
} }

View file

@ -42,7 +42,7 @@ public:
: PgLabTableViewHelper(parent, new TableModel(parent)) : PgLabTableViewHelper(parent, new TableModel(parent))
{} {}
ViewType *tableView() const ViewType *itemView() const
{ {
return m_tableView; return m_tableView;
} }

View file

@ -12,7 +12,7 @@ TableTreeBuilder::TableTreeBuilder(
{ {
} }
std::shared_ptr<TableNode> TableTreeBuilder::Build() std::tuple<std::shared_ptr<TableNode>, std::map<Oid, std::shared_ptr<TableNode>>> TableTreeBuilder::Build()
{ {
rootNode = std::make_shared<TableNode>(); rootNode = std::make_shared<TableNode>();
@ -29,16 +29,9 @@ std::shared_ptr<TableNode> TableTreeBuilder::Build()
addNode(e.second); addNode(e.second);
} }
AssignNodeIndexesAndParents(rootNode); AssignNodeIndexesAndParents(rootNode);
auto ret = rootNode; return { rootNode, std::move(processedNodes) };
resetState();
return ret;
} }
void TableTreeBuilder::resetState()
{
rootNode.reset();
processedNodes.clear();
}
std::shared_ptr<TableNode> TableTreeBuilder::addNode(const PgClass &cls) std::shared_ptr<TableNode> TableTreeBuilder::addNode(const PgClass &cls)
{ {
@ -46,13 +39,13 @@ std::shared_ptr<TableNode> TableTreeBuilder::addNode(const PgClass &cls)
processedNodes.emplace(cls.oid(), node); processedNodes.emplace(cls.oid(), node);
std::vector<Oid> parents = inheritance.getParentsOf(cls.oid()); std::vector<Oid> parents = inheritance.getParentsOf(cls.oid());
if (parents.empty()) if (parents.empty())
addToplevelNode(node); addToToplevel(node);
else else
addToParents(node, parents); addToParents(node, parents);
return node; return node;
} }
void TableTreeBuilder::addToplevelNode(std::shared_ptr<TableNode> node) void TableTreeBuilder::addToToplevel(std::shared_ptr<TableNode> node)
{ {
rootNode->children.push_back(node); rootNode->children.push_back(node);
} }

View file

@ -13,7 +13,7 @@ class TableTreeBuilder
public: public:
TableTreeBuilder(const std::map<Oid, PgClass> &source, const IFindParents &inheritance); TableTreeBuilder(const std::map<Oid, PgClass> &source, const IFindParents &inheritance);
std::shared_ptr<TableNode> Build(); std::tuple<std::shared_ptr<TableNode>, std::map<Oid, std::shared_ptr<TableNode>>> Build();
private: private:
const std::map<Oid, PgClass> &source; const std::map<Oid, PgClass> &source;
@ -21,10 +21,9 @@ private:
std::map<Oid, std::shared_ptr<TableNode>> processedNodes; std::map<Oid, std::shared_ptr<TableNode>> processedNodes;
std::shared_ptr<TableNode> rootNode; std::shared_ptr<TableNode> rootNode;
void resetState();
bool hasParent(const PgClass &cls) const; bool hasParent(const PgClass &cls) const;
std::shared_ptr<TableNode> addNode(const PgClass &cls); std::shared_ptr<TableNode> addNode(const PgClass &cls);
void addToplevelNode(std::shared_ptr<TableNode> node); void addToToplevel(std::shared_ptr<TableNode> node);
void addToParents(std::shared_ptr<TableNode> node, const std::vector<Oid> &parents); void addToParents(std::shared_ptr<TableNode> node, const std::vector<Oid> &parents);
std::shared_ptr<TableNode> getParent(Oid oid); std::shared_ptr<TableNode> getParent(Oid oid);
void AssignNodeIndexesAndParents(std::shared_ptr<TableNode> parent); void AssignNodeIndexesAndParents(std::shared_ptr<TableNode> parent);

View file

@ -25,21 +25,21 @@ namespace Pgsql {
return *this; return *this;
} }
bool operator==(const ResultConstIterator &rhs) bool operator==(const ResultConstIterator &rhs) const
{ {
return m_row == rhs.m_row; return m_row == rhs.m_row;
} }
bool operator!=(const ResultConstIterator &rhs) bool operator!=(const ResultConstIterator &rhs) const
{ {
return !operator==(rhs); return !operator==(rhs);
} }
const Row& operator*() const Row& operator*() const
{ {
return m_row; return m_row;
} }
const Row& operator->() const Row& operator->() const
{ {
return m_row; return m_row;
} }

View file

@ -13,7 +13,7 @@ TEST(TableTreeBuilder, EmptySourceEmptyResult)
PgDatabaseCatalog catalog; PgDatabaseCatalog catalog;
PgInheritsContainer inherited(catalog); PgInheritsContainer inherited(catalog);
TableTreeBuilder builder(source, inherited); TableTreeBuilder builder(source, inherited);
auto result = builder.Build(); auto [result, index] = builder.Build();
EXPECT_EQ(result->children.size(), 0); EXPECT_EQ(result->children.size(), 0);
} }
@ -28,7 +28,7 @@ TEST(TableTreeBuilder, TopLevelOnly)
source.emplace(1000, cls1); source.emplace(1000, cls1);
PgInheritsContainer inherited(catalog); PgInheritsContainer inherited(catalog);
TableTreeBuilder builder(source, inherited); TableTreeBuilder builder(source, inherited);
auto result = builder.Build(); auto [result, index] = builder.Build();
EXPECT_EQ(result->children.size(), 1); EXPECT_EQ(result->children.size(), 1);
} }
@ -56,7 +56,7 @@ TEST(TableTreeBuilder, WithChild)
source.emplace(1002, cls2); source.emplace(1002, cls2);
PgInheritsContainer inherited(catalog); PgInheritsContainer inherited(catalog);
TableTreeBuilder builder(source, findParents); TableTreeBuilder builder(source, findParents);
auto result = builder.Build(); auto [result, index] = builder.Build();
EXPECT_EQ(result->children.size(), 1); EXPECT_EQ(result->children.size(), 1);
EXPECT_EQ(result->children[0]->children.size(), 1); EXPECT_EQ(result->children[0]->children.size(), 1);