public inbox for [email protected]
help / color / mirror / Atom feed[pgadmin4][patch] #3244 Query elapse time granularity
3+ messages / 3 participants
[nested] [flat]
* [pgadmin4][patch] #3244 Query elapse time granularity
@ 2018-04-02 22:24 Joao De Almeida Pereira <[email protected]>
2018-04-02 22:27 ` Re: [pgadmin4][patch] #3244 Query elapse time granularity Robert Eckhardt <[email protected]>
2018-04-03 13:11 ` Re: [pgadmin4][patch] #3244 Query elapse time granularity Dave Page <[email protected]>
0 siblings, 2 replies; 3+ messages in thread
From: Joao De Almeida Pereira @ 2018-04-02 22:24 UTC (permalink / raw)
To: pgadmin-hackers
Hi Hackers,
Attached you can find a patch that increases the granularity of time
displayed for total run time of a query.
Also extracts the functionality, wraps it with tests.
An addon to this patch is the extraction of the function
call_render_after_poll that uses the function that calculates the time as
well
Thanks
Joao
Attachments:
[application/octet-stream] granularity-of-query-elapse-time.diff (17.5K, 3-granularity-of-query-elapse-time.diff)
download | inline diff:
diff --git a/web/package.json b/web/package.json
index 3ce86a11..f8d87607 100644
--- a/web/package.json
+++ b/web/package.json
@@ -84,6 +84,7 @@
"slickgrid": "git+https://github.com/6pac/SlickGrid.git#2.3.7",
"snapsvg": "^0.5.1",
"spectrum-colorpicker": "^1.8.0",
+ "sprintf-js": "^1.1.1",
"underscore": "^1.8.3",
"underscore.string": "^3.3.4",
"watchify": "~3.9.0",
diff --git a/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js b/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js
new file mode 100644
index 00000000..b9b6b0c7
--- /dev/null
+++ b/web/pgadmin/static/js/sqleditor/calculate_query_run_time.js
@@ -0,0 +1,33 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import moment from 'moment';
+
+export function calculateQueryRunTime(startTime, endTime) {
+ const tempEndDate = moment(endTime);
+ let miliseconds = tempEndDate.diff(startTime);
+ let seconds = tempEndDate.diff(startTime, 'seconds');
+ const minutes = tempEndDate.diff(startTime, 'minutes');
+
+ let result = '';
+ if (minutes > 0) {
+ result += minutes + ' min ';
+ seconds -= minutes * 60;
+ }
+
+ if (seconds > 0) {
+ result += seconds + ' secs ';
+ miliseconds -= seconds * 1000;
+ }
+
+ if(minutes <= 0) {
+ result += miliseconds + ' msec';
+ }
+ return result.trim();
+}
diff --git a/web/pgadmin/static/js/sqleditor/call_render_after_poll.js b/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
new file mode 100644
index 00000000..6d1e3836
--- /dev/null
+++ b/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
@@ -0,0 +1,52 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import {calculateQueryRunTime} from './calculate_query_run_time';
+import gettext from '../gettext';
+import {sprintf} from 'sprintf-js';
+
+function hasResultsToDisplay(res) {
+ return res.colinfo != null;
+}
+
+function isQueryTool(sqlEditor) {
+ return sqlEditor.is_query_tool;
+}
+
+function isNotificationEnabled(sqlEditor) {
+ return sqlEditor.info_notifier_timeout >= 0;
+}
+
+export function callRenderAfterPoll(sqlEditor, alertify, res) {
+ sqlEditor.query_end_time = new Date();
+ sqlEditor.rows_affected = res.rows_affected;
+ sqlEditor.has_more_rows = res.has_more_rows;
+
+ if (hasResultsToDisplay(res)) {
+ sqlEditor._render(res);
+ } else {
+ sqlEditor.total_time = calculateQueryRunTime(
+ sqlEditor.query_start_time,
+ sqlEditor.query_end_time);
+ const msg = sprintf(
+ gettext('Query returned successfully in %s.'), sqlEditor.total_time);
+ res.result += '\n\n' + msg;
+ sqlEditor.update_msg_history(true, res.result, false);
+ if (isNotificationEnabled(sqlEditor)) {
+ alertify.success(msg, sqlEditor.info_notifier_timeout);
+ }
+ }
+
+ if (isQueryTool(sqlEditor)) {
+ sqlEditor.disable_tool_buttons(false);
+ }
+
+ sqlEditor.setIsQueryRunning(false);
+ sqlEditor.trigger('pgadmin-sqleditor:loading-icon:hide');
+}
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 923ccead..56bdaf1b 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -20,6 +20,8 @@ define('tools.querytool', [
'sources/keyboard_shortcuts',
'sources/sqleditor/query_tool_actions',
'pgadmin.datagrid',
+ 'sources/sqleditor/calculate_query_run_time',
+ 'sources/sqleditor/call_render_after_poll',
'sources/../bundle/slickgrid',
'pgadmin.file_manager',
'backgrid.sizeable.columns',
@@ -32,7 +34,8 @@ define('tools.querytool', [
pgExplain, GridSelector, ActiveCellCapture, clipboard, copyData, RangeSelectionHelper, handleQueryOutputKeyboardEvent,
XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, transaction,
HistoryBundle, queryHistory, React, ReactDOM,
- keyboardShortcuts, queryToolActions, Datagrid) {
+ keyboardShortcuts, queryToolActions, Datagrid,
+ calculateQueryRunTime, callRenderAfterPoll) {
/* Return back, this has been called more than once */
if (pgAdmin.SqlEditor)
return pgAdmin.SqlEditor;
@@ -2224,37 +2227,8 @@ define('tools.querytool', [
// This is a wrapper to call_render function
// We need this because we have separated columns route & result route
// We need to combine both result here in wrapper before rendering grid
- call_render_after_poll: function(res) {
- var self = this;
- self.query_end_time = new Date();
- self.rows_affected = res.rows_affected;
- self.has_more_rows = res.has_more_rows;
-
- /* If no column information is available it means query
- runs successfully with no result to display. In this
- case no need to call render function.
- */
- if (res.colinfo != null)
- self._render(res);
- else {
- // Show message in message and history tab in case of query tool
- self.total_time = self.get_query_run_time(self.query_start_time, self.query_end_time);
- var msg = S(gettext('Query returned successfully in %s.')).sprintf(self.total_time).value();
- res.result += '\n\n' + msg;
- self.update_msg_history(true, res.result, false);
- // Display the notifier if the timeout is set to >= 0
- if (self.info_notifier_timeout >= 0) {
- alertify.success(msg, self.info_notifier_timeout);
- }
- }
-
- // Enable/Disable query tool button only if is_query_tool is true.
- if (self.is_query_tool) {
- self.disable_tool_buttons(false);
- $('#btn-cancel-query').prop('disabled', true);
- }
- is_query_running = false;
- self.trigger('pgadmin-sqleditor:loading-icon:hide');
+ call_render_after_poll: function(queryResult) {
+ callRenderAfterPoll.callRenderAfterPoll(this,alertify,queryResult);
},
@@ -2329,7 +2303,10 @@ define('tools.querytool', [
);
// Show message in message and history tab in case of query tool
- self.total_time = self.get_query_run_time(self.query_start_time, self.query_end_time);
+ self.total_time = calculateQueryRunTime.calculateQueryRunTime(
+ self.query_start_time,
+ self.query_end_time
+ );
var msg1 = S(gettext('Successfully run. Total query runtime: %s.')).sprintf(self.total_time).value();
var msg2 = S(gettext('%s rows affected.')).sprintf(self.rows_affected).value();
@@ -2570,25 +2547,6 @@ define('tools.querytool', [
}
},
- // This function will return the total query execution Time.
- get_query_run_time: function(start_time, end_time) {
- // Calculate the difference in milliseconds
- var difference_ms, miliseconds;
- difference_ms = miliseconds = end_time.getTime() - start_time.getTime();
- //take out milliseconds
- difference_ms = difference_ms / 1000;
- var seconds = Math.floor(difference_ms % 60);
- difference_ms = difference_ms / 60;
- var minutes = Math.floor(difference_ms % 60);
-
- if (minutes > 0)
- return minutes + ' min';
- else if (seconds > 0) {
- return seconds + ' secs';
- } else
- return miliseconds + ' msec';
- },
-
/* This function is used to check whether cell
* is editable or not depending on primary keys
* and staged_rows flag
diff --git a/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js b/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js
new file mode 100644
index 00000000..c1ed5c57
--- /dev/null
+++ b/web/regression/javascript/sqleditor/calculate_query_run_time_spec.js
@@ -0,0 +1,82 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import moment from 'moment';
+import {calculateQueryRunTime} from '../../../pgadmin/static/js/sqleditor/calculate_query_run_time';
+
+describe('#calculateQueryRunTime', () => {
+ describe('time difference is smaller then 1 second', () => {
+ it('displays milliseconds', () => {
+ let startDate = moment({
+ years:2018,
+ months:4,
+ date:2,
+ hours:10,
+ minutes:30,
+ seconds:20,
+ milliseconds:123}).toDate();
+ let endDate = moment({
+ years:2018,
+ months:4,
+ date:2,
+ hours:10,
+ minutes:30,
+ seconds:21,
+ milliseconds:70}).toDate();
+ expect(calculateQueryRunTime(startDate, endDate))
+ .toEqual('947 msec');
+ });
+ });
+
+ describe('time difference is smaller then 1 minute', () => {
+ it('displays milliseconds', () => {
+ let startDate = moment({
+ years:2018,
+ months:4,
+ date:2,
+ hours:10,
+ minutes:30,
+ seconds:20,
+ milliseconds:123}).toDate();
+ let endDate = moment({
+ years:2018,
+ months:4,
+ date:2,
+ hours:10,
+ minutes:31,
+ seconds:15,
+ milliseconds:70}).toDate();
+ expect(calculateQueryRunTime(startDate, endDate))
+ .toEqual('54 secs 947 msec');
+ });
+ });
+
+ describe('time difference is bigger then 1 minute', () => {
+ it('displays milliseconds', () => {
+ let startDate = moment({
+ years:2018,
+ months:4,
+ date:2,
+ hours:10,
+ minutes:30,
+ seconds:20,
+ milliseconds:123}).toDate();
+ let endDate = moment({
+ years:2018,
+ months:4,
+ date:2,
+ hours:10,
+ minutes:40,
+ seconds:15,
+ milliseconds:70}).toDate();
+ expect(calculateQueryRunTime(startDate, endDate))
+ .toEqual('9 min 54 secs');
+ });
+ });
+});
diff --git a/web/regression/javascript/sqleditor/call_render_after_poll_spec.js b/web/regression/javascript/sqleditor/call_render_after_poll_spec.js
new file mode 100644
index 00000000..9b250956
--- /dev/null
+++ b/web/regression/javascript/sqleditor/call_render_after_poll_spec.js
@@ -0,0 +1,203 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+import {callRenderAfterPoll} from '../../../pgadmin/static/js/sqleditor/call_render_after_poll';
+import moment from 'moment';
+
+describe('#callRenderAfterPoll', () => {
+ let sqlEditorSpy, queryResult, alertify;
+ beforeEach(() => {
+ let today = moment('2018-01-01 10:12:31').toDate();
+ jasmine.clock().install();
+ jasmine.clock().mockDate(today);
+ sqlEditorSpy = {
+ _render: jasmine.createSpy('SQLEditor._render'),
+ setIsQueryRunning: jasmine.createSpy('SQLEditor.setIsQueryRunning'),
+ trigger: jasmine.createSpy('SQLEditor.trigger'),
+ update_msg_history: jasmine.createSpy('SQLEditor.update_msg_history'),
+ disable_tool_buttons: jasmine.createSpy('SQLEditor.disable_tool_buttons'),
+ query_start_time: new Date(),
+ };
+ alertify = jasmine.createSpyObj('alertify', ['success']);
+ });
+
+ afterEach(function () {
+ jasmine.clock().uninstall();
+ });
+
+ describe('it is not a query tool', () => {
+ beforeEach(() => {
+ sqlEditorSpy.is_query_tool = false;
+ });
+
+ describe('query was successful but had no result to display', () => {
+ beforeEach(() => {
+ queryResult = {
+ rows_affected: 10,
+ has_more_rows: false,
+ colinfo: {},
+ };
+ });
+
+ it('renders the the editor', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy._render).toHaveBeenCalledWith(queryResult);
+ });
+
+ it('inform sqleditor that the query stopped running', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.setIsQueryRunning).toHaveBeenCalledWith(false);
+ });
+
+ it('hides the loading icon', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.trigger).toHaveBeenCalledWith('pgadmin-sqleditor:loading-icon:hide');
+ });
+ });
+
+ describe('query was successful and have results', () => {
+ beforeEach(() => {
+ queryResult = {
+ rows_affected: 10,
+ has_more_rows: false,
+ colinfo: undefined,
+ result: 'Some result',
+ };
+ });
+
+ it('saves execution information in the history', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.update_msg_history).toHaveBeenCalledWith(
+ true,
+ 'Some result\n\nQuery returned successfully in 0 msec.',
+ false
+ );
+ });
+
+ it('inform sqleditor that the query stopped running', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.setIsQueryRunning).toHaveBeenCalledWith(false);
+ });
+
+ it('hides the loading icon', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.trigger).toHaveBeenCalledWith('pgadmin-sqleditor:loading-icon:hide');
+ });
+
+ describe('notifications are enabled', () => {
+ it('display notification', () => {
+ sqlEditorSpy.info_notifier_timeout = 10;
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(alertify.success).toHaveBeenCalledWith(
+ 'Query returned successfully in 0 msec.',
+ 10
+ );
+ });
+ });
+ });
+ });
+
+ describe('it is a query tool', () => {
+ beforeEach(() => {
+ sqlEditorSpy.is_query_tool = true;
+ });
+
+ describe('query was successful but had no result to display', () => {
+ beforeEach(() => {
+ queryResult = {
+ rows_affected: 10,
+ has_more_rows: false,
+ colinfo: {},
+ };
+ });
+
+ it('renders the the editor', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy._render).toHaveBeenCalledWith(queryResult);
+ });
+
+ it('inform sqleditor that the query stopped running', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.setIsQueryRunning).toHaveBeenCalledWith(false);
+ });
+
+ it('hides the loading icon', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.trigger).toHaveBeenCalledWith('pgadmin-sqleditor:loading-icon:hide');
+ });
+
+ it('enables sqleditor tools buttons', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.disable_tool_buttons).toHaveBeenCalledWith(false);
+ });
+ });
+
+ describe('query was successful and have results', () => {
+ beforeEach(() => {
+ queryResult = {
+ rows_affected: 10,
+ has_more_rows: false,
+ colinfo: undefined,
+ result: 'Some result',
+ };
+ });
+
+ it('saves execution information in the history', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.update_msg_history).toHaveBeenCalledWith(
+ true,
+ 'Some result\n\nQuery returned successfully in 0 msec.',
+ false
+ );
+ });
+
+ it('inform sqleditor that the query stopped running', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.setIsQueryRunning).toHaveBeenCalledWith(false);
+ });
+
+ it('hides the loading icon', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.trigger).toHaveBeenCalledWith('pgadmin-sqleditor:loading-icon:hide');
+ });
+
+ it('enables sqleditor tools buttons', () => {
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(sqlEditorSpy.disable_tool_buttons).toHaveBeenCalledWith(false);
+ });
+
+ describe('notifications are enabled', () => {
+ it('display notification', () => {
+ sqlEditorSpy.info_notifier_timeout = 10;
+ callRenderAfterPoll(sqlEditorSpy, alertify, queryResult);
+
+ expect(alertify.success).toHaveBeenCalledWith(
+ 'Query returned successfully in 0 msec.',
+ 10
+ );
+ });
+ });
+ });
+ });
+});
diff --git a/web/yarn.lock b/web/yarn.lock
index 88edeb1f..da5e5f64 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -7422,7 +7422,7 @@ [email protected]:
version "1.1.0"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.0.tgz#cffcaf702daf65ea39bb4e0fa2b299cec1a1be46"
-sprintf-js@^1.0.3:
+sprintf-js@^1.0.3, sprintf-js@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: [pgadmin4][patch] #3244 Query elapse time granularity
2018-04-02 22:24 [pgadmin4][patch] #3244 Query elapse time granularity Joao De Almeida Pereira <[email protected]>
@ 2018-04-02 22:27 ` Robert Eckhardt <[email protected]>
1 sibling, 0 replies; 3+ messages in thread
From: Robert Eckhardt @ 2018-04-02 22:27 UTC (permalink / raw)
To: Joao De Almeida Pereira <[email protected]>; +Cc: pgadmin-hackers
On Mon, Apr 2, 2018 at 6:24 PM, Joao De Almeida Pereira <
[email protected]> wrote:
> Hi Hackers,
>
> Attached you can find a patch that increases the granularity of time
> displayed for total run time of a query.
> Also extracts the functionality, wraps it with tests.
> An addon to this patch is the extraction of the function
> call_render_after_poll that uses the function that calculates the time as
> well
>
>
This was an issue pointed out in an email I can't find. Basically it
pointed out something we thought we had done in the first place.
-- Rob
> Thanks
> Joao
>
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: [pgadmin4][patch] #3244 Query elapse time granularity
2018-04-02 22:24 [pgadmin4][patch] #3244 Query elapse time granularity Joao De Almeida Pereira <[email protected]>
@ 2018-04-03 13:11 ` Dave Page <[email protected]>
1 sibling, 0 replies; 3+ messages in thread
From: Dave Page @ 2018-04-03 13:11 UTC (permalink / raw)
To: Joao De Almeida Pereira <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Mon, Apr 2, 2018 at 11:24 PM, Joao De Almeida Pereira <
[email protected]> wrote:
> Hi Hackers,
>
> Attached you can find a patch that increases the granularity of time
> displayed for total run time of a query.
> Also extracts the functionality, wraps it with tests.
> An addon to this patch is the extraction of the function
> call_render_after_poll that uses the function that calculates the time as
> well
>
>
> Thanks
> Joao
>
--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake
EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
^ permalink raw reply [nested|flat] 3+ messages in thread
end of thread, other threads:[~2018-04-03 13:11 UTC | newest]
Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2018-04-02 22:24 [pgadmin4][patch] #3244 Query elapse time granularity Joao De Almeida Pereira <[email protected]>
2018-04-02 22:27 ` Robert Eckhardt <[email protected]>
2018-04-03 13:11 ` Dave Page <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox