EXPLAIN (ANALYZE) for queries in editor
Get the query plan/time result of a query with a button in the editor
This commit is contained in:
parent
66e904a208
commit
e1e13376a9
@ -89,7 +89,10 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
|
|||||||
|
|
||||||
# Create a button for submitting a query.
|
# Create a button for submitting a query.
|
||||||
self.submit_query_button = QPushButton("Submit Query")
|
self.submit_query_button = QPushButton("Submit Query")
|
||||||
self.submit_query_button.clicked.connect(self.execute_current_query)
|
# The function for executing the current query uses a parameter, which is None as default and should be None in
|
||||||
|
# this case. But the button click has its own parameter for a checked/an unchecked button, submitted by a click,
|
||||||
|
# so the lambda is used for ignoring this button parameter.
|
||||||
|
self.submit_query_button.clicked.connect(lambda: self.execute_current_query(None))
|
||||||
|
|
||||||
# Create a shortcut for submitting a query.
|
# Create a shortcut for submitting a query.
|
||||||
self.submit_query_shortcut = QShortcut(QKeySequence("F5"), self)
|
self.submit_query_shortcut = QShortcut(QKeySequence("F5"), self)
|
||||||
@ -97,7 +100,12 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
|
|||||||
# shows an error to the user.
|
# shows an error to the user.
|
||||||
self.submit_query_shortcut.activated.connect(self.check_for_valid_connection_and_execute_query_with_shortcut)
|
self.submit_query_shortcut.activated.connect(self.check_for_valid_connection_and_execute_query_with_shortcut)
|
||||||
|
|
||||||
# Check for enabling and disabling of the button for submitting a query.
|
# Create a button for explaining the current query (plan).
|
||||||
|
self.explain_query_button = QPushButton("Explain Query Plan")
|
||||||
|
# Connect the function for executing the explaining process with the button.
|
||||||
|
self.explain_query_button.clicked.connect(self.execute_explain_analyze_query)
|
||||||
|
|
||||||
|
# Check for enabling and disabling of the button for submitting or explaining a query.
|
||||||
self.check_enabling_of_submit_and_explain_button()
|
self.check_enabling_of_submit_and_explain_button()
|
||||||
|
|
||||||
# Create a button for stopping a query.
|
# Create a button for stopping a query.
|
||||||
@ -108,9 +116,6 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
|
|||||||
self.stop_query_shortcut.setEnabled(False)
|
self.stop_query_shortcut.setEnabled(False)
|
||||||
self.stop_query_shortcut.activated.connect(self.stop_current_query)
|
self.stop_query_shortcut.activated.connect(self.stop_current_query)
|
||||||
|
|
||||||
# TODO: Build functionality of the button
|
|
||||||
self.explain_query_button = QPushButton("Explain Query Plan")
|
|
||||||
|
|
||||||
# Set the button and the shortcut for stopping a query as disabled as default, because a query only needs to be
|
# Set the button and the shortcut for stopping a query as disabled as default, because a query only needs to be
|
||||||
# stopped when a query is currently executed.
|
# stopped when a query is currently executed.
|
||||||
self.set_stop_query_element_activate(False)
|
self.set_stop_query_element_activate(False)
|
||||||
@ -255,11 +260,12 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
|
|||||||
# Update the window title to the current status of the database connection.
|
# Update the window title to the current status of the database connection.
|
||||||
self.update_window_title_and_description()
|
self.update_window_title_and_description()
|
||||||
|
|
||||||
def execute_current_query(self):
|
def execute_current_query(self, query_to_execute=None):
|
||||||
"""
|
"""
|
||||||
Check for a valid connection and execute the current (selected) content of the editor in a separate thread. The
|
Check for a valid connection and execute the current (selected) content of the editor in a separate thread. The
|
||||||
separate thread emits signals for processing the result of the query. This process is realized by the database
|
separate thread emits signals for processing the result of the query. This process is realized by the database
|
||||||
query executor.
|
query executor. The default parameter for the query to execute is None, so the query in the input editor is used
|
||||||
|
as query. If a query is given, the given one is executed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# At this point, the query will be executed and the process will begin, so a signal for a status bar is emitted,
|
# At this point, the query will be executed and the process will begin, so a signal for a status bar is emitted,
|
||||||
@ -273,10 +279,14 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
|
|||||||
# Set the button invisible during a query.
|
# Set the button invisible during a query.
|
||||||
self.export_csv_button.setVisible(False)
|
self.export_csv_button.setVisible(False)
|
||||||
|
|
||||||
|
# If the query is None, the default parameter is used, so it is necessary to get the current query in the input
|
||||||
|
# editor.
|
||||||
|
if query_to_execute is None:
|
||||||
# Get the query for executing.
|
# Get the query for executing.
|
||||||
query_to_execute = self.get_query_in_input_editor()
|
query_to_execute = self.get_query_in_input_editor()
|
||||||
|
|
||||||
# If the query is not None for an error or abort during the check process, continue.
|
# If the query is not None, continue. An error or abort during the check process could result in a query, which
|
||||||
|
# is None.
|
||||||
if query_to_execute is not None:
|
if query_to_execute is not None:
|
||||||
# Define the query to execute as database query of the executor.
|
# Define the query to execute as database query of the executor.
|
||||||
self.database_query_executor.database_query = query_to_execute
|
self.database_query_executor.database_query = query_to_execute
|
||||||
@ -1119,6 +1129,40 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
|
|||||||
# Write a newline at the end of a data row.
|
# Write a newline at the end of a data row.
|
||||||
file_to_save.write("\n")
|
file_to_save.write("\n")
|
||||||
|
|
||||||
|
def get_explain_analyze_query(self):
|
||||||
|
"""
|
||||||
|
Get the explain (analyze) query for showing the query plan or the query execution.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Define the start of the query with an EXPLAIN.
|
||||||
|
query_start = "EXPLAIN "
|
||||||
|
# Get the current query in the input editor without a check for a single DELETE/UPDATE.
|
||||||
|
query = self.get_query_in_input_editor(check=False)
|
||||||
|
|
||||||
|
# Ask for the actual execution of the query.
|
||||||
|
analyze_question = QMessageBox.question(self, "Analyze?", "Use the EXPLAIN ANALYZE option (query will be "
|
||||||
|
"actually executed)?",
|
||||||
|
QMessageBox.Yes | QMessageBox.No)
|
||||||
|
|
||||||
|
# If the query should be executed, the ANALYZE is part of the query start.
|
||||||
|
if analyze_question == QMessageBox.Yes:
|
||||||
|
query_start = "{}ANALYZE ".format(query_start)
|
||||||
|
|
||||||
|
# Build the query.
|
||||||
|
query = "{}{}".format(query_start, query)
|
||||||
|
|
||||||
|
return query
|
||||||
|
|
||||||
|
def execute_explain_analyze_query(self):
|
||||||
|
"""
|
||||||
|
Get the explain (analyze) query and execute it.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Get the query.
|
||||||
|
query = self.get_explain_analyze_query()
|
||||||
|
# Execute the query with the database query executor and the editor execution process.
|
||||||
|
self.execute_current_query(query)
|
||||||
|
|
||||||
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
|
||||||
"""
|
"""
|
||||||
Overwrite the close event: If the configuration for opening the previous is set and the corresponding save file
|
Overwrite the close event: If the configuration for opening the previous is set and the corresponding save file
|
||||||
|
Loading…
Reference in New Issue
Block a user