pgadmin3/include/ctl/ctlSQLGrid.h
lsv 425e4ede51 When building a plan with analysis, the trigger execution time is calculated as a percentage of the execution time.
Добавлен подсчёт времени в процентах от "Execution Time:" для триггеров при выполнении Shift+F7 в инструменте запросов.
Для строки "Planning Time:" - процент от общего времени запроса равного "Planning Time:"+"Execution Time:"
Для всех остальных процент времени от "Execution Time:"
2026-06-25 11:30:43 +05:00

262 lines
8.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// ctlSQLGrid.h - SQL Data Display Grid
//
//////////////////////////////////////////////////////////////////////////
#ifndef CTLSQLGRID_H
#define CTLSQLGRID_H
// wxWindows headers
#include <wx/grid.h>
#include <wx/brush.h>
#include "utils/popuphelp.h"
class GroupRows;
class ctlSQLGrid : public wxGrid
{
public:
ctlSQLGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size);
ctlSQLGrid();
wxString GetExportLine(int row);
wxString GetExportLine(int row, wxArrayInt cols);
wxString GetExportLine(int row, int col1, int col2);
virtual bool IsColText(int col)
{
return false;
}
int CopyTableToHtml(wxString htmlquery);
int Copy(int gensql);
virtual bool CheckRowPresent(int row)
{
return true;
};
bool IsSort()
{
return isSort;
};
void SetSort(bool flag)
{
isSort = flag;
};
wxString GetColumnName(int colNum);
wxSize GetBestSize(int row, int col);
void OnLabelDoubleClick(wxGridEvent& event);
void OnGridSelectCell(wxGridEvent& evt);
void OnLabelClick(wxGridEvent& event);
void OnCellRightClick(wxGridEvent& event);
void OnMouseEvent(wxMouseEvent& event);
void OnShowPopup(wxThreadEvent& event);
bool FullArrayCollapseRowsPlan(bool clear);
void AutoSizeColumn(int col, bool setAsMin = false, bool doLimit = true);
void AutoSizeColumns(bool setAsMin);
wxString GetRowLabelValue(int row);
void SetRowGroup(int row);
GroupRows* grp;
int generatesql; // 0 -copy, 1 - insert , 2 - in_list, 3 - where list
wxString sqlquerytext;
// Fast searh
wxString searchStr;
WX_DECLARE_STRING_HASH_MAP(int, ColKeySizeHashMap);
DECLARE_DYNAMIC_CLASS(ctlSQLGrid)
DECLARE_EVENT_TABLE()
private:
void setresizedpi();
void OnCopy(wxCommandEvent& event);
void OnMouseWheel(wxMouseEvent& event);
void OnGridColSize(wxGridSizeEvent& event);
void DrawColLabel(wxDC& dc, int col);
void DrawRowLabel(wxDC& dc, int row);
wxString GetColKeyValue(int col);
void AppendColumnHeader(wxString& str, int start, int end);
void AppendColumnHeader(wxString& str, wxArrayInt columns);
// Stores sizes of colums explicitly resized by user
ColKeySizeHashMap colSizes;
// Max size for each column
wxArrayInt colMaxSizes;
bool isSort;
// viewr
popuphelp* m_Popup = NULL;
int rcol, rrow;
wxPoint rpos;
//FunctionPGHelper fh;
};
class GroupRows
{
public:
GroupRows(ctlSQLGrid* grid) {
g = grid;
rowsGroup.Clear();
rowsGroup.Add(0, g->GetNumberRows());
end.Clear();
end.Add(-1, g->GetNumberRows());
run.Clear();
run.Add(0.0, g->GetNumberRows());
endsectionrow=-1;
endsectiontotal=0;
};
/**
* @brief Определяет строчный диапазон узла и время его выполнения
*
* @param rowgroup Начальная строка узла со знаком ->
* @param lastrowgroup Последняя строка узла
* @param actualtime Время выполнения узла
*/
void AddGroup(int rowgroup, int lastrowgroup, double actualtime) {
// default group open
rowsGroup[rowgroup] = -rowgroup;
//beg[rowgroup]=rowgroup;
//wxASSERT_MSG(lastrowgroup > end.Count(), " out of bounds");
end[rowgroup] = lastrowgroup;
run[rowgroup] = actualtime;
};
void SetTimeToRow(int row, double actualtime) {
// default group open
//beg[rowgroup]=rowgroup;
//wxASSERT_MSG(lastrowgroup > end.Count(), " out of bounds");
run[row] = actualtime;
};
/**
* @brief Скрывает или показывает узел плана
*
* @param row начальная строка узла
* @param visible
*/
void VisibleGroup(int row, bool visible) {
int endg = end[row];
int grp = IsGroupRow(row);
int gg;
int r = row + 1;
if (grp != 0) {
if (!visible) {
// hide group
rowsGroup[row] *= -1;
for (int i = r; i < (endg + 1); i++) {
g->HideRow(i);
}
wxGridCellAttr* pAttrg = new wxGridCellAttr;
pAttrg->SetBackgroundColour(wxColour(200, 191, 232)); // close group
g->SetRowAttr(row, pAttrg);
}
else
{
// show group
rowsGroup[row] *= -1;
int sizerow = g->GetDefaultRowSize();
//pAttr->SetBackgroundColour(wxColour(0,162,232));
wxGridCellAttr* pAttrg = new wxGridCellAttr;
if (g->GetCellValue(row, 0).Contains("(never executed)") ) {
// not higtligth this row
pAttrg->SetBackgroundColour(wxColour(224, 255, 224)); // green
} else
pAttrg->SetBackgroundColour(wxColour(248, 240, 130)); // yellow
g->SetRowAttr(row, pAttrg);
for (int i = r; i < (endg + 1); i++) {
gg = IsGroupRow(i);
if (gg <= 0) {
g->SetRowSize(i, sizerow);
}
else
{
g->SetRowSize(i, sizerow);
i = end[i];
}
}
}
}
};
// 0 - no group, -int - open group ,+int - close gruop
int IsGroupRow(int row) {
if (end[row] != -1) {
// is group
return rowsGroup[row];
}
else return 0;
};
void ColoriseRow(int row, const wxColour& color) {
//g->GetTable()->SetRowLabelValue(row-1,s);
wxGridCellAttr* pAttr = new wxGridCellAttr;
pAttr->SetBackgroundColour(color);
g->SetRowAttr(row, pAttr);
};
/**
* @brief Подсчёт времени всех узлов. Начиная со строки endsectionrow
* считается время планирования и выполнения триггеров.
* Эти расчёты не связаны с проценьами по узлам плана.
*
*/
void CalcTime() {
//g->GetTable()->SetRowLabelValue(row-1,s);
double sum = 0;
double total = 1;
for (int i = 0; i < run.Count(); i++) {
double t = run[i];
if (i == 0) {
total = abs(t);
g->GetTable()->SetRowLabelValue(i, "100");
}
else
{
wxString str;
if (i>=endsectionrow && endsectionrow!=-1)
{
total=endsectiontotal;
if (i==endsectionrow) total+=t; // % plan = plan time / (plan time + execute time)
}
if (total == 0 || t == 0) {
str = "";
}
else
{
t = (t / total) * 100;
str.Printf(wxT("%5.2f"), t);
}
g->GetTable()->SetRowLabelValue(i, str);
}
}
};
int endsectionrow; // start section after Planning time;
double endsectiontotal; // value Execution Time:
private:
ctlSQLGrid* g;
wxArrayInt rowsGroup, end;
wxArrayDouble run;
};
//#define TEST_wxGridCellAutoWrapStringRenderer
class CursorCellRenderer : public wxGridCellStringRenderer
{
protected:
wxSize GetBestSize(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
int row, int col) wxOVERRIDE;
public:
void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
const wxRect& rect, int row, int col, bool isSelected) wxOVERRIDE;
CursorCellRenderer(int thous_pixel_sep);
private:
int thousands_pixel_sep;
};
#endif