public inbox for [email protected]help / color / mirror / Atom feed
[pgAdmin][RM2172] Search Objects Functionality 12+ messages / 3 participants [nested] [flat]
* [pgAdmin][RM2172] Search Objects Functionality @ 2020-03-30 09:09 Aditya Toshniwal <[email protected]> 0 siblings, 2 replies; 12+ messages in thread From: Aditya Toshniwal @ 2020-03-30 09:09 UTC (permalink / raw) To: pgadmin-hackers Hi Hackers, Attached is the patch to implement search objects functionality in pgadmin. The feature will allow a user to search for any object in a database. Highlights of the feature: 1) Search any object with user input text with at least 3 characters. 2) Search can be done on a specific object type by selecting from the types dropdown. 3) The search results grid will show object name, object type and the object path on the browser tree. On double clicking the record, it will locate that object on the browser tree. The columns object name and type are sortable. 4) The object nodes which are disabled (hidden) using preferences will not be visible in the types dropdown. However, in the case of all types, the search records will be visible for those types greyed out. 5) You can also access search objects dialog using the button on the browser toolbar. Python and JS test cases added. Docs updated. Please review. -- Thanks and Regards, Aditya Toshniwal pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune "Don't Complain about Heat, Plant a TREE" Attachments: [application/octet-stream] RM2172.patch (519.2K, 3-RM2172.patch) download | inline diff: diff --git a/docs/en_US/getting_started.rst b/docs/en_US/getting_started.rst index 5b09c5b4c..2595505d2 100644 --- a/docs/en_US/getting_started.rst +++ b/docs/en_US/getting_started.rst @@ -64,6 +64,8 @@ display. To open the *Preferences* dialog, select *Preferences* from the *File* for the dialog. You can access additional Postgres help by navigating through the *Help* menu, and selecting the name of the resource that you wish to open. +You can search for objects in the database using the :ref:`Search objects <search_objects>` + .. toctree:: :maxdepth: 2 @@ -74,6 +76,7 @@ the *Help* menu, and selecting the name of the resource that you wish to open. tree_control preferences keyboard_shortcuts + search_objects Before using pgAdmin to manage objects that reside on a server, you must define a connection to the server; for more information please see *Connecting to a Server* diff --git a/docs/en_US/images/search_objects.png b/docs/en_US/images/search_objects.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5b4be267ab0240dc207c486057e236e18507a8 GIT binary patch literal 143936 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⋙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 literal 0 HcmV?d00001 diff --git a/docs/en_US/images/toolbar.png b/docs/en_US/images/toolbar.png index 19c4c574a905fb30ea1828b4825e85af7cdb0c0e..aac16b967b93b44576bf2a042b989aa296251648 100644 GIT binary patch literal 42931 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%0D-NlnK%<oL#WUV3Obj&<*1=JUG#xkE) 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 K<4QTJ@c#j4GvEOL literal 38057 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 diff --git a/docs/en_US/search_objects.rst b/docs/en_US/search_objects.rst new file mode 100644 index 000000000..7cf08c84f --- /dev/null +++ b/docs/en_US/search_objects.rst @@ -0,0 +1,32 @@ +.. _search_objects: + +*********************** +`Search objects`:index: +*********************** + +.. image:: images/search_objects.png + :alt: Search objects dialog + :align: center + +With this dialog, you can search for almost any kind of objects in a +database. + +You can access it by right clicking a database or any of its child nodes +and select "Search objects". You can also access it by hitting the +shortcut (default ALT+SHIFT+S). + +The minimum pattern length are 3 characters. The search performed is +non-casesensitive and will find all objets whose name contains the pattern. +You can only search for object names. + +The result is presented in the grid with object name, object type and +the object tree path in the :ref:`browser <tree_control>`. You can double +click on a result row to select the object in the +:ref:`browser <tree_control>`. If the object is grey, this means that you +have not enabled those object types in the :ref:`preferences <preferences>`, +so you can't click on it. + +You can filter based on a particular object type by selecting one from the +object type dropdown. An object type will not be visible in the dropdown +if the database server does not support it or if it is not enabled from the +:ref:`preferences <preferences>`. \ No newline at end of file diff --git a/docs/en_US/toolbar.rst b/docs/en_US/toolbar.rst index 12dc8621a..f4c685f24 100644 --- a/docs/en_US/toolbar.rst +++ b/docs/en_US/toolbar.rst @@ -18,4 +18,6 @@ the selected browser node. * Use the :ref:`View Data <editgrid>` button to view/edit the data stored in a selected table. * Use the :ref:`Filtered Rows <viewdata_filter>` button to access the Data Filter popup - to apply a filter to a set of data for viewing/editing. \ No newline at end of file + to apply a filter to a set of data for viewing/editing. +* Use the :ref:`Search objects <search_objects>` button to access the search objects + dialog. It helps you search any database object. \ No newline at end of file diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py index 09f472795..5f57f9fa1 100644 --- a/web/pgadmin/browser/register_browser_preferences.py +++ b/web/pgadmin/browser/register_browser_preferences.py @@ -249,6 +249,21 @@ def register_browser_preferences(self): fields=fields ) + self.preference.register( + 'keyboard_shortcuts', + 'sub_menu_search_objects', + gettext('Search objects'), + 'keyboardshortcut', + { + 'alt': True, + 'shift': True, + 'control': False, + 'key': {'key_code': 83, 'char': 's'} + }, + category_label=gettext('Keyboard shortcuts'), + fields=fields + ) + self.preference.register( 'keyboard_shortcuts', 'sub_menu_create', diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js index 7724ef4c4..b2127c4b0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js @@ -24,7 +24,7 @@ define('pgadmin.node.extension', [ pgAdmin.Browser.Nodes['coll-extension'] = pgAdmin.Browser.Collection.extend({ node: 'extension', - label: gettext('Extension'), + label: gettext('Extensions'), type: 'coll-extension', columns: ['name', 'owner', 'comment'], }); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql new file mode 100644 index 000000000..8b11b594a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql @@ -0,0 +1,11 @@ +SELECT + nsp.oid, nspname AS name +FROM + pg_namespace nsp +WHERE nspparent = {{scid}}::oid +{% if pkgid %} +AND nsp.oid = {{pkgid}}::oid +{% endif %} +AND nspobjecttype = 0 +AND nspcompoundtrigger = false +ORDER BY nspname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py index 2984a58e4..4b0a0918c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py @@ -54,8 +54,8 @@ class IndexConstraintModule(ConstraintTypeModule): initialized. """ - NODE_TYPE = 'Index constraint' - COLLECTION_LABEL = _('index_constraint') + NODE_TYPE = 'index_constraint' + COLLECTION_LABEL = _('Index constraint') def __init__(self, *args, **kwargs): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py index e455b8adf..9ffbe742c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py @@ -29,8 +29,11 @@ from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare def backend_supported(module, manager, **kwargs): - if 'tid' in kwargs and CollectionNodeModule.BackendSupported( - module, manager, **kwargs): + + if CollectionNodeModule.BackendSupported(module, manager, **kwargs): + if 'tid' not in kwargs: + return True + conn = manager.connection(did=kwargs['did']) template_path = 'partitions/sql/{0}/#{0}#{1}#'.format( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py index bf92e5f01..1de4de825 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py @@ -21,19 +21,19 @@ else: class TestBackendSupport(BaseTestGenerator): scenarios = [ - ('when tid is not present in arguments, should return None and no ' - 'query should be done', + ('when tid is not present in arguments, but server version' + 'is supported then return True', dict( manager=dict( - server_type="", - version="" + server_type="pg", + version="100000" ), input_arguments=dict(did=432), collection_node_active=True, connection_execution_return_value=[], - expected_return_value=None, + expected_return_value=True, expect_error_response=False, expected_number_calls_on_render_template=0 )), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql index 5f9bf9532..f1645d070 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql @@ -9,6 +9,9 @@ (SELECT 1 FROM pg_class WHERE relname = 'tables' AND relnamespace = {{ tbl }}.oid LIMIT 1)) {%- endmacro %} +{% macro IS_CATALOG_SCHEMA(schema_col_name) -%} + {{ schema_col_name }} IN ('pg_catalog', 'pgagent', 'information_schema') +{%- endmacro %} {% macro LABELS(tbl, _) -%} CASE {{ tbl }}.nspname WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' @@ -17,9 +20,24 @@ ELSE {{ tbl }}.nspname END AS name {%- endmacro %} +{% macro LABELS_SCHEMACOL(schema_col_name, _) -%} + CASE {{ schema_col_name }} + WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' + WHEN 'pgagent' THEN '{{ _( 'pgAgent Job Scheduler' ) }} (pgagent)' + WHEN 'information_schema' THEN '{{ _( 'ANSI' ) }} (information_schema)' + ELSE {{ schema_col_name }} + END +{%- endmacro %} {% macro DB_SUPPORT(tbl) -%} CASE WHEN {{ tbl }}.nspname = ANY('{information_schema}') THEN false ELSE true END {%- endmacro %} +{% macro DB_SUPPORT_SCHEMACOL(schema_col_name) -%} + CASE + WHEN {{ schema_col_name }} = ANY('{information_schema}') + THEN false + ELSE true END +{%- endmacro %} + diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql index 37fb594ed..b9fc276ef 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql @@ -13,6 +13,9 @@ (SELECT 1 FROM pg_proc WHERE pronamespace = {{ tbl }}.oid and proname = 'run_job' LIMIT 1)) {%- endmacro %} +{% macro IS_CATALOG_SCHEMA(schema_col_name) -%} + {{ schema_col_name }} IN ('pg_catalog', 'pgagent', 'information_schema', 'dbo', 'sys', 'dbms_job_procedure') +{%- endmacro %} {% macro LABELS(tbl, _) -%} CASE {{ tbl }}.nspname WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' @@ -23,9 +26,25 @@ ELSE {{ tbl }}.nspname END AS name {%- endmacro %} -{% macro DB_SUPPORT(tbl) -%} +{% macro LABELS_SCHEMACOL(schema_col_name, _) -%} + CASE {{ schema_col_name }} + WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' + WHEN 'pgagent' THEN '{{ _( 'pgAgent Job Scheduler' ) }} (pgagent)' + WHEN 'information_schema' THEN '{{ _( 'ANSI' ) }} (information_schema)' + WHEN 'dbo' THEN 'Redmond (dbo)' + WHEN 'sys' THEN 'Redwood (sys)' + ELSE {{ schema_col_name }} + END +{%- endmacro %} +{% macro DB_SUPPORT(tbl, schema_col_name) -%} CASE WHEN {{ tbl }}.nspname = ANY('{information_schema,sys,dbo}') THEN false ELSE true END {%- endmacro %} +{% macro DB_SUPPORT_SCHEMACOL(schema_col_name) -%} + CASE + WHEN {{ schema_col_name }} = ANY('{information_schema,sys,dbo}') + THEN false + ELSE true END +{%- endmacro %} diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js index 47500caf7..c7bb247ec 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js +++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js @@ -18,6 +18,7 @@ define('pgadmin.node.role', [ pgAdmin.Browser.Nodes['coll-role'] = pgAdmin.Browser.Collection.extend({ node: 'role', + label: gettext('Login/Group Roles'), type: 'coll-role', columns: [ 'rolname', 'rolvaliduntil', 'rolconnlimit', 'rolcanlogin', diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js index 2ec4fe1b5..a3c9ad96e 100644 --- a/web/pgadmin/browser/static/js/collection.js +++ b/web/pgadmin/browser/static/js/collection.js @@ -51,14 +51,23 @@ define([ }]); // show query tool only in context menu of supported nodes. - if (pgAdmin.DataGrid && pgAdmin.unsupported_nodes) { - if (_.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) { + + if (pgAdmin.unsupported_nodes && _.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) { + if ((this.type == 'database' && this.allowConn) || this.type != 'database') { pgAdmin.Browser.add_menus([{ - name: 'show_query_tool', node: this.type, module: this, + name: 'show_query_tool', node: this.type, module: pgAdmin.DataGrid, applies: ['context'], callback: 'show_query_tool', priority: 998, label: gettext('Query Tool...'), icon: 'pg-font-icon icon-query-tool', }]); + + // show search objects same as query tool + pgAdmin.Browser.add_menus([{ + name: 'search_objects', node: this.type, module: pgAdmin.SearchObjects, + applies: ['context'], callback: 'show_search_objects', + priority: 997, label: gettext('Search Objects...'), + icon: 'fa fa-search', + }]); } } }, diff --git a/web/pgadmin/browser/static/js/keyboard.js b/web/pgadmin/browser/static/js/keyboard.js index 5cd00e6a3..8705e14be 100644 --- a/web/pgadmin/browser/static/js/keyboard.js +++ b/web/pgadmin/browser/static/js/keyboard.js @@ -34,6 +34,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'tabbed_panel_forward': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'tabbed_panel_forward').value), 'sub_menu_query_tool': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_query_tool').value), 'sub_menu_view_data': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_view_data').value), + 'sub_menu_search_objects': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_search_objects').value), 'sub_menu_properties': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_properties').value), 'sub_menu_create': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_create').value), 'sub_menu_delete': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_delete').value), @@ -55,6 +56,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'bindLeftTree': {'shortcuts': this.keyboardShortcut.left_tree_shortcut}, // Main menu, 'bindSubMenuQueryTool': {'shortcuts': this.keyboardShortcut.sub_menu_query_tool}, // Sub menu - Open Query Tool, 'bindSubMenuViewData': {'shortcuts': this.keyboardShortcut.sub_menu_view_data}, // Sub menu - Open View Data, + 'bindSubMenuSearchObjects': {'shortcuts': this.keyboardShortcut.sub_menu_search_objects}, // Sub menu - Open search objects, 'bindSubMenuProperties': {'shortcuts': this.keyboardShortcut.sub_menu_properties}, // Sub menu - Edit Properties, 'bindSubMenuCreate': {'shortcuts': this.keyboardShortcut.sub_menu_create}, // Sub menu - Create Object, 'bindSubMenuDelete': {'shortcuts': this.keyboardShortcut.sub_menu_delete}, // Sub menu - Delete object, @@ -261,6 +263,15 @@ _.extend(pgBrowser.keyboardNavigation, { // Call data grid method to render view data pgAdmin.DataGrid.show_data_grid({'mnuid': 1}, tree.i); }, + bindSubMenuSearchObjects: function() { + const tree = this.getTreeDetails(); + + if (!tree.d) + return; + + // Call data grid method to render view data + pgAdmin.SearchObjects.show_search_objects('', tree.i); + }, bindSubMenuProperties: function() { const tree = this.getTreeDetails(); diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js index 029a29817..9ee0b4bf5 100644 --- a/web/pgadmin/browser/static/js/node.js +++ b/web/pgadmin/browser/static/js/node.js @@ -177,6 +177,14 @@ define('pgadmin.browser.node', [ // Show query tool only in context menu of supported nodes. if (_.indexOf(pgAdmin.unsupported_nodes, self.type) == -1) { + let enable = function(itemData) { + if (itemData._type == 'database' && itemData.allowConn) + return true; + else if (itemData._type != 'database') + return true; + else + return false; + }; pgAdmin.Browser.add_menus([{ name: 'show_query_tool', node: self.type, @@ -186,14 +194,15 @@ define('pgadmin.browser.node', [ priority: 998, label: gettext('Query Tool...'), icon: 'pg-font-icon icon-query-tool', - enable: function(itemData) { - if (itemData._type == 'database' && itemData.allowConn) - return true; - else if (itemData._type != 'database') - return true; - else - return false; - }, + enable: enable, + }]); + + // show search objects same as query tool + pgAdmin.Browser.add_menus([{ + name: 'search_objects', node: self.type, module: pgAdmin.SearchObjects, + applies: ['context'], callback: 'show_search_objects', + priority: 997, label: gettext('Search Objects...'), + icon: 'fa fa-search', enable: enable, }]); } diff --git a/web/pgadmin/browser/static/js/toolbar.js b/web/pgadmin/browser/static/js/toolbar.js index 955fe6f32..6eb1f39f4 100644 --- a/web/pgadmin/browser/static/js/toolbar.js +++ b/web/pgadmin/browser/static/js/toolbar.js @@ -46,6 +46,16 @@ let _defaultToolBarButtons = [ parentClass: 'pg-toolbar-btn btn-secondary', enabled: false, }, + { + label: gettext('Search objects'), + ariaLabel: gettext('Search objects'), + btnClass: 'fa fa-search', + text: '', + toggled: false, + toggleClass: '', + parentClass: 'pg-toolbar-btn btn-secondary', + enabled: false, + }, ]; // Place holder for non default tool bar buttons. @@ -92,6 +102,8 @@ export function initializeToolbar(panel, wcDocker) { pgAdmin.DataGrid.show_data_grid({mnuid: 3}, pgAdmin.Browser.tree.selected()); else if ('name' in data && data.name === gettext('Filtered Rows')) pgAdmin.DataGrid.show_filtered_row({mnuid: 4}, pgAdmin.Browser.tree.selected()); + else if ('name' in data && data.name === gettext('Search objects')) + pgAdmin.SearchObjects.show_search_objects('', pgAdmin.Browser.tree.selected()); }); } diff --git a/web/pgadmin/browser/templates/browser/index.html b/web/pgadmin/browser/templates/browser/index.html index 682c23d65..67a10ba89 100644 --- a/web/pgadmin/browser/templates/browser/index.html +++ b/web/pgadmin/browser/templates/browser/index.html @@ -11,7 +11,7 @@ {% block init_script %} try { require( -['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes'], +['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes', 'sources/generated/slickgrid'], function() { }, function() { diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js index 4b0ab410b..96ad3c330 100644 --- a/web/pgadmin/static/bundle/slickgrid.js +++ b/web/pgadmin/static/bundle/slickgrid.js @@ -8,7 +8,6 @@ ////////////////////////////////////////////////////////////// import 'slickgrid/lib/jquery.event.drag-2.3.0'; -import 'slickgrid/lib/jquery-ui-1.11.3'; import 'slickgrid/slick.core'; import 'slickgrid/slick.grid'; import 'slickgrid/slick.dataview'; @@ -21,5 +20,6 @@ import 'slickgrid/plugins/slick.cellrangeselector'; import 'slickgrid/plugins/slick.checkboxselectcolumn'; import 'slickgrid/plugins/slick.rowselectionmodel'; import 'sources/slickgrid/custom_header_buttons'; +import 'sources/slickgrid/plugins/slick.autocolumnsize'; export default window.Slick; diff --git a/web/pgadmin/static/css/style.css b/web/pgadmin/static/css/style.css index 6c0f84460..55e477ee1 100644 --- a/web/pgadmin/static/css/style.css +++ b/web/pgadmin/static/css/style.css @@ -5,19 +5,18 @@ @import '~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css'; @import '~bootstrap4-toggle/css/bootstrap4-toggle.css'; @import '~backgrid-filter/backgrid-filter.css'; -@import '~slickgrid/css/select2.css'; @import '~jquery-contextmenu/dist/jquery.contextMenu.css'; @import '~webcabin-docker/Build/wcDocker.css'; @import '~acitree/css/aciTree.css'; @import '~spectrum-colorpicker/spectrum.css'; @import '~leaflet/dist/leaflet.css'; +@import '../../../node_modules/select2/dist/css/select2.css'; @import '~codemirror/lib/codemirror.css'; @import '~codemirror/addon/dialog/dialog.css'; @import '~codemirror/addon/scroll/simplescrollbars.css'; @import '~slickgrid/slick.grid.css'; -@import '~slickgrid/slick-default-theme.css'; @import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css'; @import '../vendor/backgrid/backgrid.css'; diff --git a/web/pgadmin/static/js/alertify.pgadmin.defaults.js b/web/pgadmin/static/js/alertify.pgadmin.defaults.js index 84dfc12fe..daa60f696 100644 --- a/web/pgadmin/static/js/alertify.pgadmin.defaults.js +++ b/web/pgadmin/static/js/alertify.pgadmin.defaults.js @@ -271,7 +271,8 @@ define([ let container = $(self.elements.footer); commonUtils.findAndSetFocus(container.find('button:not([disabled]):last')); } - }); }); + }); + }); this.set('onresize', alertifyDialogStartResizing.bind(this, true)); this.set('onresized', alertifyDialogResized.bind(this, true)); this.set('onmaximized', alertifyDialogResized); diff --git a/web/pgadmin/static/js/alertify/dialog.js b/web/pgadmin/static/js/alertify/dialog.js index 6f4933720..8e5bdb738 100644 --- a/web/pgadmin/static/js/alertify/dialog.js +++ b/web/pgadmin/static/js/alertify/dialog.js @@ -80,6 +80,39 @@ export class Dialog { return serverInformation; } + retrieveAncestorOfTypeDatabase(item) { + let databaseInfo = null; + let aciTreeItem = item || this.pgBrowser.treeMenu.selected(); + let treeNode = this.pgBrowser.treeMenu.findNodeByDomElement(aciTreeItem); + + if (treeNode) { + if(treeNode.getData()._type === 'database') { + databaseInfo = treeNode.getData(); + } else { + let nodeData = null; + treeNode.ancestorNode( + (node) => { + nodeData = node.getData(); + if(nodeData._type === 'database') { + databaseInfo = nodeData; + return true; + } + return false; + } + ); + } + } + + if (databaseInfo === null) { + this.alertify.alert( + gettext(this.errorAlertTitle), + gettext('Please select a database or its child node from the browser.') + ); + } + + return databaseInfo; + } + hasBinariesConfiguration(serverInformation) { const module = 'paths'; let preference_name = 'pg_bin_dir'; diff --git a/web/pgadmin/static/js/alertify/dialog_factory.js b/web/pgadmin/static/js/alertify/dialog_factory.js index cb0ae1552..760fde679 100644 --- a/web/pgadmin/static/js/alertify/dialog_factory.js +++ b/web/pgadmin/static/js/alertify/dialog_factory.js @@ -9,6 +9,7 @@ import * as BackupDialog from '../../../tools/backup/static/js/backup_dialog_wrapper'; import {RestoreDialogWrapper} from '../../../tools/restore/static/js/restore_dialog_wrapper'; +import SearchObjectsDialogWrapper from '../../../tools/search_objects/static/js/search_objects_dialog_wrapper'; export class DialogFactory { constructor(pgBrowser, $, @@ -25,6 +26,8 @@ export class DialogFactory { create(dialogTitle, typeOfDialog) { if (typeOfDialog === 'restore') { return this.createRestoreDialog(dialogTitle, typeOfDialog); + } else if (typeOfDialog === 'search_objects') { + return this.createSearchObjectsDialog(dialogTitle, typeOfDialog); } else { return this.createBackupDialog(dialogTitle, typeOfDialog); } @@ -49,4 +52,14 @@ export class DialogFactory { this.dialogModel, this.backform); } + + createSearchObjectsDialog(dialogTitle, typeOfDialog) { + return new SearchObjectsDialogWrapper( + this.dialogContainerSelector, dialogTitle, typeOfDialog, + this.jquery, + this.pgBrowser, + this.alertify, + this.dialogModel, + this.backform); + } } diff --git a/web/pgadmin/static/js/alertify/dialog_wrapper.js b/web/pgadmin/static/js/alertify/dialog_wrapper.js index e4c275f3a..32d9a7a0b 100644 --- a/web/pgadmin/static/js/alertify/dialog_wrapper.js +++ b/web/pgadmin/static/js/alertify/dialog_wrapper.js @@ -58,7 +58,11 @@ export class DialogWrapper { let backform_tab = $(alertifyDialog.elements.body).find('.backform-tab'); backform_tab.attr('tabindex', -1); this.pgBrowser.keyboardNavigation.getDialogTabNavigator($(alertifyDialog.elements.dialog)); - const container = backform_tab.find('.tab-content:first > .tab-pane.active:first'); + let container = backform_tab.find('.tab-content:first > .tab-pane.active:first'); + + if(container.length === 0 && alertifyDialog.elements.content.innerHTML) { + container = $(alertifyDialog.elements.content); + } commonUtils.findAndSetFocus(container); } diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js index a57f70ebc..3cdc13d4d 100644 --- a/web/pgadmin/static/js/backform.pgadmin.js +++ b/web/pgadmin/static/js/backform.pgadmin.js @@ -2132,6 +2132,7 @@ define([ defaults: _.extend({}, Backform.SelectControl.prototype.defaults, { select2: { first_empty: true, + multiple: false, emptyOptions: false, preserveSelectionOrder: false, diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js b/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js index 40e537e1b..85b339139 100644 --- a/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js +++ b/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js @@ -98,7 +98,7 @@ function getTemplateWidth(rowEl, template) { var cell = $(rowEl.find('.slick-cell')); cell.append(template); - $(cell).find('*').css('position', 'relative'); + cell.find('*').css('position', 'relative'); return cell.outerWidth() + 1; } @@ -128,7 +128,7 @@ 'text-overflow': 'initial', 'white-space': 'nowrap', }); - var gridCanvas = $container.find('.grid-canvas'); + var gridCanvas = $container.find('.grid-canvas').first(); $(gridCanvas).append(rowEl); return rowEl; } diff --git a/web/pgadmin/static/js/tree/tree.js b/web/pgadmin/static/js/tree/tree.js index 57b6207c8..984d247d3 100644 --- a/web/pgadmin/static/js/tree/tree.js +++ b/web/pgadmin/static/js/tree/tree.js @@ -50,17 +50,50 @@ export class TreeNode { } reload(tree) { - this.unload(tree); - tree.aciTreeApi.setInode(this.domNode); - tree.aciTreeApi.deselect(this.domNode); - setTimeout(() => { - tree.selectNode(this.domNode); - }, 0); + return new Promise((resolve)=>{ + this.unload(tree) + .then(()=>{ + tree.aciTreeApi.setInode(this.domNode); + tree.aciTreeApi.deselect(this.domNode); + setTimeout(() => { + tree.selectNode(this.domNode); + }, 0); + resolve(); + }); + }); } unload(tree) { - this.children = []; - tree.aciTreeApi.unload(this.domNode); + return new Promise((resolve, reject)=>{ + this.children = []; + tree.aciTreeApi.unload(this.domNode, { + success: ()=>{ + resolve(true); + }, + fail: ()=>{ + reject(); + }, + }); + }); + } + + open(tree, suppressNoDom) { + return new Promise((resolve, reject)=>{ + if(suppressNoDom && (this.domNode == null || typeof(this.domNode) === 'undefined')) { + resolve(true); + } else if(tree.aciTreeApi.isOpen(this.domNode)) { + resolve(true); + } else { + tree.aciTreeApi.open(this.domNode, { + success: ()=>{ + resolve(true); + }, + fail: ()=>{ + reject(true); + }, + }); + } + }); } /* @@ -202,6 +235,47 @@ export class Tree { return findInTree(this.rootNode, path.join('.')); } + findNodeWithToggle(path) { + let tree = this; + path = path.join('.'); + + let onCorrectPath = function(matchPath) { + return (matchPath !== undefined && path !== undefined + && (path.startsWith(matchPath + '.') || path === matchPath)); + }; + + return (function findInNode(currentNode) { + return new Promise((resolve, reject)=>{ + if (path === null || path === undefined || path.length === 0) { + resolve(null); + } + /* No point in checking the children if + * the path for currentNode itself is not matching + */ + if (currentNode.path !== undefined && !onCorrectPath(currentNode.path)) { + reject(null); + } else if (currentNode.path === path) { + resolve(currentNode); + } else { + currentNode.open(tree, true) + .then(()=>{ + for (let i = 0, length = currentNode.children.length; i < length; i++) { + let childNode = currentNode.children[i]; + if(onCorrectPath(childNode.path)) { + resolve(findInNode(childNode)); + return; + } + } + reject(null); + }) + .catch(()=>{ + reject(null); + }); + } + }); + })(this.rootNode); + } + findNodeByDomElement(domElement) { const path = this.translateTreeNodeIdFromACITree(domElement); if(!path || !path[0]) { @@ -215,8 +289,19 @@ export class Tree { return this.aciTreeApi.selected(); } - selectNode(aciTreeIdentifier) { + /* scrollIntoView will scroll only to top and bottom + * Logic can be added for scroll to middle + */ + scrollTo(domElement) { + domElement.scrollIntoView(); + } + + selectNode(aciTreeIdentifier, scrollOnSelect) { this.aciTreeApi.select(aciTreeIdentifier); + + if(scrollOnSelect) { + this.scrollTo(aciTreeIdentifier[0]); + } } createOrUpdateNode(id, data, parent, domNode) { @@ -227,6 +312,7 @@ export class Tree { const oldNode = this.findNode(oldNodePath); if (oldNode !== null) { oldNode.data = data; + oldNode.domNode = domNode; return oldNode; } @@ -238,6 +324,18 @@ export class Tree { return node; } + unloadNode(id, data, domNode, parentPath) { + let oldNodePath = [id]; + const parent = this.findNode(parentPath); + if(parent !== null && parent !== undefined) { + oldNodePath = [parent.path, id]; + } + const oldNode = this.findNode(oldNodePath); + if(oldNode) { + oldNode.children = []; + } + } + /** * Given the JQuery object that contains the ACI Tree * this method is responsible for registering this tree class @@ -252,16 +350,20 @@ export class Tree { $treeJQuery.on('acitree', function (event, api, item, eventName) { if (api.isItem(item)) { /* If the id of node is changed, the path should also be changed */ - if (eventName === 'added' || eventName === 'idset') { + if (['added', 'idset', 'beforeunload'].indexOf(eventName) != -1) { const id = api.getId(item); const data = api.itemData(item); + const parentId = this.translateTreeNodeIdFromACITree(api.parent(item)); - if(eventName === 'added') { - this.prepareDraggable(data, item); - } + if(eventName === 'beforeunload') { + this.unloadNode(id, data, item, parentId); + } else { + if(eventName === 'added') { + this.prepareDraggable(data, item); + } - const parentId = this.translateTreeNodeIdFromACITree(api.parent(item)); - this.addNewNode(id, data, item, parentId); + this.addNewNode(id, data, item, parentId); + } if(data.errmsg) { Alertify.error(data.errmsg); } diff --git a/web/pgadmin/static/js/utils.js b/web/pgadmin/static/js/utils.js index 86dae698e..7bdddba85 100644 --- a/web/pgadmin/static/js/utils.js +++ b/web/pgadmin/static/js/utils.js @@ -32,11 +32,12 @@ export function findAndSetFocus(container) { * browser. For eg, in safari focus() works only when element has * tabindex="0", whereas in Chrome it works in any case */ + if (first_el.length == 0) { first_el = container .find(` - .pgadmin-controls:first input:enabled, .pgadmin-controls:first .btn:not(.toggle), + .pgadmin-controls:first, .ajs-commands:first, .CodeMirror-scroll`) .find('*[tabindex]:not([tabindex="-1"])'); diff --git a/web/pgadmin/static/scss/_alert.scss b/web/pgadmin/static/scss/_alert.scss index 3f2e561e3..0e7e234d1 100644 --- a/web/pgadmin/static/scss/_alert.scss +++ b/web/pgadmin/static/scss/_alert.scss @@ -119,21 +119,18 @@ } .success-in-footer { - border-radius: 5px; - border: 1px solid transparent; - - .alert-text { - border-color: $color-success-light; - } + border-radius: $border-radius; + border: 1px solid $color-success-light; + background: $color-success-light; } .info-in-footer { + border-radius: $border-radius; border: 1px solid $color-primary; - border-radius: 4px; - height: 35px; + background: $color-primary-light; - .alert-text { - border: none; + .fa { + font-size: 1rem; } } } diff --git a/web/pgadmin/static/scss/_webcabin.pgadmin.scss b/web/pgadmin/static/scss/_webcabin.pgadmin.scss index 4846a8031..ca806785a 100644 --- a/web/pgadmin/static/scss/_webcabin.pgadmin.scss +++ b/web/pgadmin/static/scss/_webcabin.pgadmin.scss @@ -166,7 +166,7 @@ .wcTabIcon { background-position: center; - padding: 0px 10px; + padding: 0rem 0.75rem; &.fa, &.pg-font-icon{ padding: 0rem 0.25rem 0rem 0rem diff --git a/web/pgadmin/tools/search_objects/__init__.py b/web/pgadmin/tools/search_objects/__init__.py new file mode 100644 index 000000000..e8bd59141 --- /dev/null +++ b/web/pgadmin/tools/search_objects/__init__.py @@ -0,0 +1,87 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +"""Implements Search Object feature""" + +from flask import request +from flask_babelex import gettext +from flask_security import login_required + +from pgadmin.utils import PgAdminModule +from pgadmin.utils.ajax import make_json_response, bad_request,\ + internal_server_error +from pgadmin.utils.preferences import Preferences +from pgadmin.tools.search_objects.utils import SearchObjectsHelper + +MODULE_NAME = 'search_objects' + + +class SearchObjectsModule(PgAdminModule): + LABEL = gettext('Search objects') + + def get_exposed_url_endpoints(self): + """ + Returns: + list: URL endpoints for search_object module + """ + return ['search_objects.search', 'search_objects.types'] + + def show_system_objects(self): + """ + return system preference objects + """ + return self.pref_show_system_objects.get() + + def register_preferences(self): + """ + Get show_system_objects preference + """ + browser_preference = Preferences.module('browser') + self.pref_show_system_objects =\ + browser_preference.preference('show_system_objects') + + +# Create blueprint for BackupModule class +blueprint = SearchObjectsModule( + MODULE_NAME, __name__, static_url_path='' +) + + [email protected]("/", endpoint='index') +@login_required +def index(): + return bad_request(errormsg=_("This URL cannot be called directly.")) + + [email protected]("types/<int:sid>/<int:did>", endpoint='types') +@login_required +def types(sid, did): + so_obj = SearchObjectsHelper(sid, did, blueprint.show_system_objects()) + return make_json_response(data=so_obj.get_supported_types()) + + [email protected]("search/<int:sid>/<int:did>", endpoint='search') +@login_required +def search(sid, did): + """ + URL args: + text <required>: search text + type <optional>: type of object to be searched. + """ + text = request.args.get('text', None) + obj_type = request.args.get('type', None) + + so_obj = SearchObjectsHelper(sid, did, blueprint.show_system_objects()) + + status, res = so_obj.search(text, obj_type) + + if not status: + return internal_server_error(errormsg=res) + + return make_json_response(data=res) diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects.js b/web/pgadmin/tools/search_objects/static/js/search_objects.js new file mode 100644 index 000000000..84e40afd1 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects.js @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +define([ + 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin.alertifyjs', + 'sources/pgadmin', 'sources/csrf', 'pgadmin.browser.toolbar', + 'pgadmin.search_objects/search_objects_dialog', +], function( + gettext, url_for, $, _, alertify, pgAdmin, csrfToken, toolBar, SearchObjectsDialog +) { + + var pgBrowser = pgAdmin.Browser; + if (pgAdmin.SearchObjects) + return pgAdmin.SearchObjects; + + pgAdmin.SearchObjects = { + init: function() { + if (this.initialized) + return; + + this.initialized = true; + csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token); + + // Define the nodes on which the menus to be appear + var menus = [{ + name: 'search_objects', + module: this, + applies: ['tools'], + callback: 'show_search_objects', + enable: this.search_objects_enabled, + priority: 1, + label: gettext('Search objects'), + }, { + name: 'search_objects', + module: this, + applies: ['context'], + callback: 'show_search_objects', + enable: this.search_objects_enabled, + priority: 1, + label: gettext('Search objects'), + }]; + + pgBrowser.add_menus(menus); + return this; + }, + + search_objects_enabled: function(obj) { + /* Same as query tool */ + var isEnabled = (() => { + if (!_.isUndefined(obj) && !_.isNull(obj)) { + if (_.indexOf(pgAdmin.unsupported_nodes, obj._type) == -1) { + if (obj._type == 'database' && obj.allowConn) { + return true; + } else if (obj._type != 'database') { + return true; + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + })(); + + toolBar.enable(gettext('Search objects'), isEnabled); + return isEnabled; + }, + + // Callback to show the dialog + show_search_objects: function(action, item) { + let dialog = new SearchObjectsDialog.default( + pgBrowser, + $, + alertify, + {}, + ); + dialog.draw(action, item, {}, pgBrowser.stdW.md, pgBrowser.stdH.md); + }, + }; + + return pgAdmin.SearchObjects; +}); diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js new file mode 100644 index 000000000..c2e24940d --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import {Dialog} from 'sources/alertify/dialog'; +import {getPanelTitle} from 'tools/datagrid/static/js/datagrid_panel_title'; + +export default class SearchObjectsDialog extends Dialog { + constructor(pgBrowser, $, alertify, BackupModel, backform = null) { + super('Search Objects Error', + '<div class=\'search_objects_dialog\'></div>', + pgBrowser, $, alertify, BackupModel, backform + ); + } + + dialogName() { + return 'search_objects'; + } + + draw(action, aciTreeItem, params, width=0, height=0) { + let dbInfo = this.retrieveAncestorOfTypeDatabase(aciTreeItem); + if (!dbInfo) { + return; + } + + let dialogTitle = getPanelTitle(this.pgBrowser, aciTreeItem); + dialogTitle = gettext('Search Objects - ') + dialogTitle; + const dialog = this.createOrGetDialog( + gettext('Search Objects...'), + 'search_objects' + ); + dialog(dialogTitle).resizeTo(width, height); + } +} diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js new file mode 100644 index 000000000..926c5cf43 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js @@ -0,0 +1,614 @@ +import {getTreeNodeHierarchyFromElement} from 'sources/tree/pgadmin_tree_node'; +import axios from 'axios/index'; +import gettext from 'sources/gettext'; +import url_for from 'sources/url_for'; +import 'select2'; +import {DialogWrapper} from 'sources/alertify/dialog_wrapper'; +import Slick from 'sources/../bundle/slickgrid'; +import pgAdmin from 'sources/pgadmin'; + + +export default class SearchObjectsDialogWrapper extends DialogWrapper { + constructor(dialogContainerSelector, dialogTitle, typeOfDialog, + jquery, pgBrowser, alertify, dialogModel, backform) { + super(dialogContainerSelector, dialogTitle, jquery, + pgBrowser, alertify, dialogModel, backform); + + this.grid = null; + this.gridContainer = null; + } + + showMessage(text, is_error, call_after_show=()=>{}) { + if(text == '' || text == null) { + this.statusBar.classList.add('d-none'); + } else { + if(is_error) { + this.statusBar.innerHTML = ` + <div class="error-in-footer"> + <div class="d-flex px-2 py-1"> + <div class="pr-2"> + <i class="fa fa-exclamation-triangle text-danger" aria-hidden="true" role="img"></i> + </div> + <div role="alert" class="alert-text">${text}</div> + <div class="ml-auto close-error-bar"> + <a class="close-error fa fa-times text-danger"></a> + </div> + </div> + </div> + `; + + this.statusBar.querySelector('.close-error').addEventListener('click', ()=>{ + this.showMessage(null); + }); + } else { + this.statusBar.innerHTML = ` + <div class="info-in-footer"> + <div class="d-flex px-2 py-1"> + <div class="pr-2"> + <i class="fa fa-info-circle text-primary" aria-hidden="true"></i> + </div> + <div class="alert-text" role="alert">${text}</div> + </div> + </div> + `; + } + this.statusBar.classList.remove('d-none'); + call_after_show(this.statusBar); + } + } + + createDialogDOM(dialogContainer) { + dialogContainer.innerHTML = ` + <div class="d-flex flex-column w-100 h-100"> + <div class="p-2"> + <div class="row"> + <div class="col-8 d-flex"> + <div class="input-group pgadmin-controls"> + <div class="input-group-prepend"> + <span class="input-group-text fa fa-search" id="labelSearch" aria-label="` + gettext('Search') + `"></span> + </div> + <input type="search" class="form-control" id="txtGridSearch" placeholder="` + gettext('Type at least 3 characters') + `" + tabindex="0" aria-describedby="labelSearch" aria-labelledby="labelSearch" autocomplete="off"> + </div> + <div class="ml-2"> + <button class="btn btn-primary btn-search" disabled>${ gettext('Search') }</button> + </div> + </div> + <div class="col-4"> + <select class="node-types"></select> + </div> + </div> + </div> + <div class="search-result-container flex-grow-1"> + <div class="pg-sp-container d-none"> + <div class="pg-sp-content"> + <div class="row"><div class="col-12 pg-sp-icon"></div></div> + <div class="row"><div class="col-12 pg-sp-text"></div></div> + </div> + </div> + <div class="search-result"></div> + </div> + <div class=\'pg-prop-status-bar pg-el-xs-12\'> + </div> + </div> + `; + + return dialogContainer; + } + + updateDimOfSearchResult() { + let dim = this.searchResultContainer.getBoundingClientRect(); + this.searchResult.style.height = dim.height + 'px'; + this.searchResult.style.width = dim.width + 'px'; + } + + setLoading(text) { + if(text != null) { + this.loader.classList.remove('d-none'); + this.loader.querySelector('.pg-sp-text').innerHTML = text; + } else { + this.loader.classList.add('d-none'); + } + } + + searchBtnEnabled(enabled) { + if(typeof(enabled) != 'undefined') { + this.searchBtn.disabled = !enabled; + } else { + return !this.searchBtn.disabled; + } + } + + searchBoxVal(val) { + if(typeof(val) != 'undefined') { + this.searchBox.value = val; + } else { + return this.searchBox.value.trim(); + } + } + + typesVal(val) { + if(typeof(val) != 'undefined') { + this.typesSelect.value = val; + } else { + return this.typesSelect.value; + } + } + + setTypes(data, enabled=true) { + this.jquery(this.typesSelect).empty().select2({ + data: data, + }); + + this.typesSelect.disabled = !enabled; + } + + showOtherInfo(rowno) { + let data = this.grid.getData(); + let rowData = data[rowno]; + rowData.name += ` (${rowData.other_info})`; + rowData.other_info = null; + data[rowno] = rowData; + this.setGridData(data); + } + + setGridData(data) { + data.getItemMetadata = (row)=>{ + if(data[row] && !data[row].show_node){ + return { + cssClasses: 'object-muted', + }; + } + return null; + }; + this.grid.setData(data); + this.grid.resizeCanvas(); + } + + prepareGrid() { + this.grid = new Slick.Grid( + this.searchResult, + [], + [ + { id: 'name', name: 'Object name', field: 'name', sortable: true, + formatter: (row, cell, value, columnDef, dataContext) => { + let ret_el = `<i class='wcTabIcon ${dataContext.icon}'></i>${value}`; + + if(dataContext.other_info != null && dataContext.other_info != '') { + ret_el += ' <span class="object-other-info">(...)</span>'; + } + + return ret_el; + }, + width: 50, + }, + { id: 'type', name: 'Type', field: 'type_label', sortable: true, width: 35 }, + { id: 'path', name: 'Path', field: 'path', sortable: false }, + ], + { + enableCellNavigation: true, + enableColumnReorder: false, + multiColumnSort: true, + explicitInitialization: true, + } + ); + + this.grid.registerPlugin(new Slick.AutoColumnSize()); + + this.grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: true})); + + this.grid.onKeyDown.subscribe((event) => { + let activeRow = this.grid.getActiveCell(); + if(activeRow && !event.ctrlKey && !event.altKey && !event.metaKey && event.keyCode == 9) { + event.preventDefault(); + event.stopImmediatePropagation(); + + if(event.shiftKey) { + this.prevToGrid.focus(); + } else { + this.nextToGrid.focus(); + } + } + }); + + this.grid.onClick.subscribe((event, args) => { + if(event.target.classList.contains('object-other-info')) { + this.showOtherInfo(args.row); + } + }); + + this.grid.onDblClick.subscribe((event, args) => { + let rowData = this.grid.getDataItem(args.row); + let treeMenu = this.pgBrowser.treeMenu; + + if(!rowData.show_node) { + this.showMessage( + gettext('%s objects are disabled in the browser.', rowData.type) + ' ' + + gettext('You can enable them in the') + ' <a class="pref-dialog-link">' + gettext('preferences dialog') + '</a>', + true, + (statusBar)=>{ + statusBar.querySelector('.pref-dialog-link').addEventListener('click', ()=>{ + if(pgAdmin.Preferences) { + pgAdmin.Preferences.show(); + } + }); + } + ); + return false; + } + this.showMessage(gettext('Locating...')); + treeMenu.findNodeWithToggle(rowData.id_path) + .then((treeItem)=>{ + treeMenu.selectNode(treeItem.domNode, true); + this.showMessage(null); + }) + .catch((args)=>{ + this.showMessage(gettext('Unable to locate this object in the browser.'), true); + console.warn(args); + }); + }); + + this.grid.onSort.subscribe((event, args) => { + let cols = args.sortCols; + let data = this.grid.getData(); + + data.sort(function (dataRow1, dataRow2) { + for (var i = 0, l = cols.length; i < l; i++) { + var field = cols[i].sortCol.field; + var sign = cols[i].sortAsc ? 1 : -1; + var value1 = dataRow1[field], value2 = dataRow2[field]; + var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign; + if (result != 0) { + return result; + } + } + return false; + }); + this.setGridData(data); + }); + } + + onDialogResize() { + this.updateDimOfSearchResult(); + + if(this.grid) { + this.grid.resizeCanvas(); + this.grid.autosizeColumns(); + } + } + + onDialogShow() { + this.focusOnDialog(this); + + setTimeout(()=>{ + if(!this.grid) { + this.prepareGrid(); + } + this.updateDimOfSearchResult(); + this.grid.init(); + this.setGridData([]); + this.onDialogResize(); + }, 500); + } + + getBaseUrl(endpoint) { + return url_for('search_objects.'+endpoint, { + sid: this.treeInfo.server._id, + did: this.treeInfo.database._id, + }); + } + + getCollNode(node_type) { + if('coll-'+node_type in this.pgBrowser.Nodes) { + return this.pgBrowser.Nodes['coll-'+node_type]; + } else if(node_type in this.pgBrowser.Nodes && + typeof(this.pgBrowser.Nodes[node_type].collection_type) === 'string') { + return this.pgBrowser.Nodes[this.pgBrowser.Nodes[node_type].collection_type]; + } + + return null; + } + + getSelectedNode() { + const tree = this.pgBrowser.treeMenu; + const selectedNode = tree.selected(); + if (selectedNode) { + return tree.findNodeByDomElement(selectedNode); + } else { + return undefined; + } + } + + finaliseData(datum) { + datum.icon = 'icon-' + datum.type; + /* finalise path */ + [datum.path, datum.id_path] = this.translateSearchObjectsPath(datum.path, datum.catalog_level); + return datum; + } + + /* This function will translate the path given by search objects API into two parts + * 1. The display path on the UI + * 2. The tree search path to locate the object on the tree. + * + * Sample path returned by search objects API + * :schema.11:/pg_catalog/:table.2604:/pg_attrdef + * + * Sample path required by tree locator + * Normal object - server_group/1.server/3.coll-database/3.database/13258.coll-schema/13258.schema/2200.coll-table/2200.table/41773 + * pg_catalog schema - server_group/1.server/3.coll-database/3.database/13258.coll-catalog/13258.catalog/11.coll-table/11.table/2600 + * Information Schema, dbo, sys - server_group/1.server/3.coll-database/3.database/13258.coll-catalog/13258.catalog/12967.coll-catalog_object/12967.catalog_object/13204 + * + * Column catalog_level has values as + * N - Not a catalog schema + * D - Catalog schema with DB support - pg_catalog + * O - Catalog schema with object support only - info schema, dbo, sys + */ + translateSearchObjectsPath(path, catalog_level) { + if (path === null) { + return path; + } + + catalog_level = catalog_level || 'N'; + + /* path required by tree locator */ + /* the path received from the backend is after the DB node, initial path setup */ + let id_path = [ + this.treeInfo.server_group.id, + this.treeInfo.server.id, + this.getCollNode('database').type + '/' + this.treeInfo.server._id, + this.treeInfo.database.id, + ]; + + let prev_node_id = this.treeInfo.database._id; + + /* add the slash to match regex, remove it from display path later */ + path = '/' + path; + /* the below regex will match all /:server_group.1:/ */ + let new_path = path.replace(/\/:[a-zA-Z_]+\.[0-9]+:\//g, (token)=>{ + let orig_token = token; + /* remove the slash and colon */ + token = token.slice(2, -2); + let [node_type, node_oid, others] = token.split('.'); + if(typeof(others) !== 'undefined') { + return token; + } + + /* schema type is "catalog" for catalog schemas */ + node_type = (['D', 'O'].indexOf(catalog_level) != -1 && node_type == 'schema') ? 'catalog' : node_type; + + /* catalog like info schema will only have views and tables AKA catalog_object except for pg_catalog */ + node_type = (catalog_level === 'O' && ['view', 'table'].indexOf(node_type) != -1) ? 'catalog_object' : node_type; + + /* If collection node present then add it */ + let coll_node = this.getCollNode(node_type); + if(coll_node) { + /* Add coll node to the path */ + if(prev_node_id != null) id_path.push(`${coll_node.type}/${prev_node_id}`); + + /* Add the node to the path */ + id_path.push(`${node_type}/${node_oid}`); + + /* This will be needed for coll node */ + prev_node_id = node_oid; + + /* This will be displayed in the grid */ + return `/${coll_node.label}/`; + } else if(node_type in this.pgBrowser.Nodes) { + /* Add the node to the path */ + id_path.push(`${node_type}/${node_oid}`); + + /* This will be need for coll node id path */ + prev_node_id = node_oid; + + /* Remove the token and replace with slash. This will be displayed in the grid */ + return '/'; + } + prev_node_id = null; + return orig_token; + }); + + /* Remove the slash we had added */ + new_path = new_path.substring(1); + return [new_path, id_path]; + } + + prepareDialog() { + this.showMessage(null); + if(this.grid) { + this.grid.destroy(); + this.grid = null; + } + + /* Load types */ + this.setTypes([{ + id: -1, + text: gettext('Loading...'), + value: null, + }], false); + + axios.get( + this.getBaseUrl('types') + ).then((res)=>{ + let types = [{ + id: 'all', + text: 'All types', + }]; + + for (const key of Object.keys(res.data.data).sort()) { + types.push({ + id: key, + text: res.data.data[key], + }); + } + this.setTypes(types); + }).catch(()=>{ + this.setTypes([{ + id: -1, + text: gettext('Failed'), + value: null, + }], false); + }); + } + + main(title) { + this.set('title', title); + } + + setup() { + return { + buttons: [{ + text: '', + key: 112, + className: 'btn btn-secondary pull-left fa fa-question pg-alertify-icon-button', + attrs: { + name: 'dialog_help', + type: 'button', + label: gettext('Help'), + 'aria-label': gettext('Help'), + url: url_for('help.static', { + 'filename': 'search_objects.html', + }), + }, + }, { + text: gettext('Close'), + key: 27, + className: 'btn btn-secondary fa fa-lg fa-times pg-alertify-button', + 'data-btn-name': 'cancel', + }], + // Set options for dialog + options: { + title: this.dialogTitle, + //disable both padding and overflow control. + padding: !1, + overflow: !1, + model: 0, + resizable: true, + maximizable: true, + pinnable: false, + closableByDimmer: false, + modal: false, + }, + }; + } + + build() { + let tmpEle = document.createElement('div'); + tmpEle.innerHTML = this.dialogContainerSelector; + let dialogContainer = tmpEle.firstChild; + + // Append the container + this.elements.content.innerHTML = ''; + this.elements.content.appendChild(dialogContainer); + + this.createDialogDOM(dialogContainer); + this.alertify.pgDialogBuild.apply(this); + + this.loader = dialogContainer.getElementsByClassName('pg-sp-container')[0]; + + this.searchBox = dialogContainer.querySelector('#txtGridSearch'); + this.searchBtn = dialogContainer.querySelector('.btn-search'); + this.typesSelect = dialogContainer.querySelector('.node-types'); + this.searchResultContainer = dialogContainer.querySelector('.search-result-container'); + this.searchResult = dialogContainer.querySelector('.search-result'); + this.statusBar = dialogContainer.querySelector('.pg-prop-status-bar'); + + /* These two values are required to come out of grid when tab is + * pressed in the grid. Slickgrid does not allow any way to come out + */ + this.nextToGrid = this.elements.footer.querySelector('.ajs-button'); + this.prevToGrid = this.typesSelect; + + /* init select2 */ + this.setTypes([{ + id: -1, + text: gettext('Loading...'), + value: null, + }], false); + + /* on search box change */ + this.searchBox.addEventListener('input', ()=>{ + if(this.searchBoxVal().length >= 3) { + this.searchBtnEnabled(true); + } else { + this.searchBtnEnabled(false); + } + }); + + /* on enter key press */ + this.searchBox.addEventListener('keypress', (e)=>{ + if(e.keyCode == 13) { + e.stopPropagation(); + if(this.searchBtnEnabled()) { + this.searchBtn.dispatchEvent(new Event('click')); + } + } + }); + + /* on search button click */ + this.searchBtn.addEventListener('click', ()=>{ + this.searchBtnEnabled(false); + this.setGridData([]); + this.showMessage(null); + + this.setLoading(gettext('Searching....')); + axios.get(this.getBaseUrl('search'), { + params: { + text: this.searchBoxVal(), + type: this.typesVal(), + }, + }).then((res)=>{ + let grid_data = res.data.data.map((row)=>{ + return this.finaliseData(row); + }); + + this.setGridData(grid_data); + }).catch((error)=>{ + let errmsg = ''; + + if (error.response) { + errmsg = error.response.statusText; + } else if (error.request) { + errmsg = gettext('No response received'); + } else { + errmsg = error.message; + } + this.showMessage(gettext('An unexpected occurred: %s', errmsg), true); + console.warn(error); + }).finally(()=>{ + this.setLoading(null); + this.searchBtnEnabled(true); + }); + }); + + this.set({ + 'onresized': this.onDialogResize.bind(this), + 'onmaximized': this.onDialogResize.bind(this), + 'onrestored': this.onDialogResize.bind(this), + 'onshow': this.onDialogShow.bind(this), + }); + } + + prepare() { + let selectedTreeNode = this.getSelectedNode(); + if (!this.getSelectedNodeData(selectedTreeNode)) { + return; + } + + this.treeInfo = getTreeNodeHierarchyFromElement(this.pgBrowser, selectedTreeNode); + this.prepareDialog(); + this.focusOnDialog(this); + } + + callback(event) { + if (this.wasHelpButtonPressed(event)) { + event.cancel = true; + this.pgBrowser.showHelp( + event.button.element.name, + event.button.element.getAttribute('url'), + null, + null, + ); + return; + } + } +} diff --git a/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss b/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss new file mode 100644 index 000000000..920c53832 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss @@ -0,0 +1,118 @@ +.search_objects_dialog { + height: 100%; + + .object-other-info { + &:hover { + font-weight: bold; + } + } + + .pref-dialog-link { + color: $color-fg !important; + text-decoration: underline !important; + cursor: pointer; + } + + .search-result-container { + width: 100%; + height: 100%; + min-height: 0; + } + + .node-types ~ .select2-container { + min-width: 100%; + } + + .ui-widget { + font-family: $font-family-primary; + font-size: $font-size-base; + + .slick-header.ui-state-default { + border: $table-border-width solid $table-border-color; + .slick-header-columns { + background: $table-bg; + color: $color-fg; + border-bottom: $panel-border; + + .slick-header-column-sorted { + font-style: unset; + } + + .ui-state-default { + background: $table-bg !important; + color: $color-fg !important; + padding: $table-header-cell-padding $table-cell-padding; + border-right: $table-border-width solid $table-border-color; + + .slick-column-name { + font-weight: bold; + } + + .slick-sort-indicator { + float: unset; + } + } + + .slick-header-sortable { + cursor: pointer !important; + + .slick-sort-indicator-asc { + background: none; + border-top: none; + border-right: 0.25rem solid transparent; + border-bottom: 0.25rem solid $color-fg; + border-left: 0.25rem solid transparent; + } + + .slick-sort-indicator-desc { + background: none; + border-top: 0.25rem solid $color-fg; + border-right: 0.25rem solid transparent; + border-bottom: none; + border-left: 0.25rem solid transparent; + } + } + } + } + .ui-widget-content { + color: $color-fg; + &.slick-row { + &.object-muted { + &.active, &.active:hover, &:hover, & { + .slick-cell { + color: $text-muted !important; + cursor: default !important; + } + } + } + + &.active, &.active:hover { + .slick-cell { + border-top: $table-border-width solid transparent !important; + background-color: $tree-bg-selected !important; + color: $tree-fg-selected !important; + } + } + + &:hover { + cursor: pointer; + .slick-cell { + border-top: $table-border-width solid transparent !important; + border-bottom: $table-border-width solid transparent !important; + background-color: $tree-bg-hover !important; + color: $tree-fg-hover !important; + cursor: pointer !important; + } + } + } + } + } + + + .pg-prop-status-bar { + position: absolute; + bottom: 0; + right: 0; + left: 0; + } +} diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql new file mode 100644 index 000000000..d00ca0d11 --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql @@ -0,0 +1,434 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + ELSE 'function' END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} ELSE {{ show_node_prefs['function'] }} END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p + left join pg_namespace n on p.pronamespace = n.oid + left join pg_type t on p.prorettype = t.oid + WHERE ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql new file mode 100644 index 000000000..bd2f94d9c --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql @@ -0,0 +1,451 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN p.prokind = 'p' THEN 'procedure' + ELSE 'function' + END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN ':trigger_function.' + WHEN p.prokind = 'p' THEN ':procedure.' + ELSE ':function.' + END || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} + WHEN p.prokind = 'p' THEN {{ show_node_prefs['procedure'] }} + ELSE {{ show_node_prefs['function'] }} + END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p join pg_namespace n + on p.pronamespace = n.oid join pg_type t + on p.prorettype = t.oid join pg_language lng + ON lng.oid=p.prolang + WHERE p.prokind IN ('f', 'w', 'p') + AND CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN lng.lanname NOT IN ('edbspl', 'sql', 'internal') + ELSE true + END + AND ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql new file mode 100644 index 000000000..b384b316d --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql @@ -0,0 +1,367 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['table', 'sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'r' THEN 'table' + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'r' THEN ':table.' + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'r' THEN {{ show_node_prefs['table'] }} + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('r','S','v','m') + {% elif obj_type == 'table' %} + WHERE c.relkind = 'r' + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + AND {{ CATALOGS.DB_SUPPORT('n') }} + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + AND {{ CATALOGS.DB_SUPPORT('n') }} + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + ELSE 'function' END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} ELSE {{ show_node_prefs['function'] }} END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p + left join pg_namespace n on p.pronamespace = n.oid + left join pg_type t on p.prorettype = t.oid + WHERE ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/:table.'|| t.oid || ':/'||t.relname|| + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server'::text AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping'::text AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table'::text AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension'::text AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation'::text AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql new file mode 100644 index 000000000..76d3f01ba --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql @@ -0,0 +1,494 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym' AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package' AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar' AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql new file mode 100644 index 000000000..82eb9cf6f --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql @@ -0,0 +1,515 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger', 'compound_trigger'] %} + select + CASE WHEN tr.tgpackageoid != 0 THEN 'compound_trigger' ELSE 'trigger' END::text AS obj_type, tr.tgname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || CASE WHEN tr.tgpackageoid != 0 THEN '/:compound_trigger.' ELSE '/:trigger.' END || tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + CASE WHEN tr.tgpackageoid != 0 THEN {{ show_node_prefs['compound_trigger'] }} ELSE {{ show_node_prefs['trigger'] }} END AS show_node, + NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} + {% if obj_type == 'compound_trigger' %} + AND tr.tgpackageoid != 0 + {% elif obj_type == 'trigger' %} + AND tr.tgpackageoid = 0 + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym' AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package' AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar' AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql new file mode 100644 index 000000000..7bb126e32 --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql @@ -0,0 +1,437 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['table', 'sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'r' THEN 'table' + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'r' THEN ':table.' + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'r' THEN {{ show_node_prefs['table'] }} + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('r','S','v','m') + {% elif obj_type == 'table' %} + WHERE c.relkind = 'r' + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/:table.'|| t.oid || ':/'||t.relname|| + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server'::text AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping'::text AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table'::text AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension'::text AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation'::text AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym'::text AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package'::text AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar'::text AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/tests/__init__.py b/web/pgadmin/tools/search_objects/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/web/pgadmin/tools/search_objects/tests/test_api_search.py b/web/pgadmin/tools/search_objects/tests/test_api_search.py new file mode 100644 index 000000000..3952006d2 --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_api_search.py @@ -0,0 +1,75 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from __future__ import print_function +import sys +import json + +from pgadmin.utils.route import BaseTestGenerator +from regression import parent_node_dict +from pgadmin.browser.server_groups.servers.databases.tests import utils as \ + database_utils +from regression.python_test_utils import test_utils as utils + +try: + from urllib import urlencode +except Exception as e: + from urllib.parse import urlencode + + +class SearchObjectsApiSearch(BaseTestGenerator): + """ This class will test search API of search objects. """ + scenarios = [ + ('Search with all types', dict(text='emp', type='all', singles=False)), + ('Search with None types', dict(text='emp', type=None, singles=False)), + ('Search for all single types', + dict(text='emp', type=None, singles=True)), + ] + + def runFor(self, text=None, type=None): + url_params = dict( + text=text + ) + if type is not None: + url_params['type'] = type + + url_params = urlencode(url_params) + response = self.tester.get(self.base_url + '?' + url_params) + + self.assertEquals(response.status_code, 200) + + def runTest(self): + database_info = parent_node_dict["database"][-1] + server_id = database_info["server_id"] + db_id = database_info["db_id"] + + db_con = database_utils.connect_database(self, + utils.SERVER_GROUP, + server_id, + db_id) + if not db_con["info"] == "Database connected.": + raise Exception("Could not connect to database to add the schema.") + + self.base_url = '/search_objects/search/' \ + + str(server_id) + '/' + str(db_id) + + if not self.singles: + self.runFor(text=self.text, type=self.type) + else: + # test for all the node types individually + types_url = '/search_objects/types/' +\ + str(server_id) + '/' + str(db_id) + response = self.tester.get(types_url) + self.assertEquals(response.status_code, 200) + types_data = json.loads(response.data.decode('utf-8'))['data'] + + for a_type in types_data: + print('Running search for type {0}'.format(a_type), + file=sys.stderr) + self.runFor(text=self.text, type=a_type) diff --git a/web/pgadmin/tools/search_objects/tests/test_api_types.py b/web/pgadmin/tools/search_objects/tests/test_api_types.py new file mode 100644 index 000000000..aed5571ad --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_api_types.py @@ -0,0 +1,47 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +import json +from pgadmin.utils.route import BaseTestGenerator +from regression import parent_node_dict +from pgadmin.browser.server_groups.servers.databases.tests import utils as \ + database_utils +from regression.python_test_utils import test_utils as utils + + +class SearchObjectsApiTypes(BaseTestGenerator): + """ This class will test types API of search objects. """ + scenarios = [ + # Fetching default URL for schema node. + ('Types API URL', dict(url='/search_objects/types')) + ] + + def runTest(self): + database_info = parent_node_dict["database"][-1] + server_id = database_info["server_id"] + + db_id = database_info["db_id"] + db_con = database_utils.connect_database(self, + utils.SERVER_GROUP, + server_id, + db_id) + if not db_con["info"] == "Database connected.": + raise Exception("Could not connect to database to add the schema.") + + url = self.url + '/' + str(server_id) + '/' + str(db_id) + response = self.tester.get(url) + self.assertEquals(response.status_code, 200) + + # repsonse data should be dict + response_data = json.loads(response.data.decode('utf-8'))['data'] + self.assertEquals(type(response_data), dict) + + # response data key values should not be None + for key, value in response_data.items(): + self.assertIsNotNone(value, 'Key {0} has value None'.format(key)) diff --git a/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py b/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py new file mode 100644 index 000000000..ec9c369b9 --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py @@ -0,0 +1,117 @@ +import sys + +from pgadmin.tools.search_objects.utils import SearchObjectsHelper, current_app +from pgadmin.utils.route import BaseTestGenerator + +if sys.version_info < (3, 3): + from mock import patch, MagicMock +else: + from unittest.mock import patch, MagicMock + + +class SearchObjectsHelperTest(BaseTestGenerator): + scenarios = [ + ('scenario', dict( + node_blueprints=[ + dict(node_type='table', coll_label='Tables', + backend_supported=True), + dict(node_type='view', coll_label='Views', + backend_supported=False), + dict(node_type='index', coll_label='Indexes', + backend_supported=True), + dict(node_type='role', coll_label='Roles', + backend_supported=True) + ], + all_node_types=['table', 'view', 'index'], + expected_show_node_prefs=dict(table=True, view=False, index=True), + expected_supported_types=dict(table='Tables', index='Indexes'), + expected_supported_types_skip=dict(table='Tables', view='Views', + index='Indexes'), + execute_dict_return_value=( + True, dict(rows=[ + dict(obj_name='name1', obj_type='table', + obj_path='some/path', show_node=True, + other_info=None, catalog_level='N'), + dict(obj_name='name2', obj_type='view', + obj_path='some1/path', show_node=True, + other_info=None, catalog_level='D'), + dict(obj_name='name3', obj_type='index', + obj_path='some2/path1', show_node=True, + other_info='oid', catalog_level='O'), + ])), + expected_search_op=( + True, [ + dict(name='name1', type='table', type_label='Tables', + path='some/path', + show_node=True, other_info=None, catalog_level='N'), + dict(name='name2', type='view', type_label='Views', + path='some1/path', + show_node=True, other_info=None, catalog_level='D'), + dict(name='name3', type='index', type_label='Indexes', + path='some2/path1', + show_node=True, other_info='oid', catalog_level='O'), + ] + ) + )) + ] + + def __create_manager(self): + connection = MagicMock( + execute_dict=MagicMock(), + db='somedb' + ) + connection.execute_dict.return_value = self.execute_dict_return_value + + def connection_function(did): + return connection + + return MagicMock( + connection=connection_function + ) + + @patch('pgadmin.tools.search_objects.utils.get_node_blueprint') + @patch('pgadmin.tools.search_objects.utils.get_driver') + def runTest(self, get_driver_mock, get_node_blueprint_mock): + manager = self.__create_manager() + + get_driver_mock.return_value = MagicMock( + connection_manager=lambda session_id: manager) + + def __get_node_blueprint_mock(node_type): + blueprints = self.node_blueprints + blueprint = None + for data in blueprints: + if node_type == data['node_type']: + blueprint = MagicMock( + BackendSupported=MagicMock( + return_value=data['backend_supported']), + collection_label=data['coll_label'], + show_node=data['backend_supported'], + ) + return blueprint + + get_node_blueprint_mock.side_effect = __get_node_blueprint_mock + + with self.app.app_context(): + + so_obj = SearchObjectsHelper(2, 18456, + node_types=self.all_node_types) + so_obj.get_sql = MagicMock(return_value='dummy query') + + # test template path + manager.server_type = 'pg' + manager.version = 906000 + self.assertEquals(so_obj.get_template_path(), + 'search_objects/sql/pg/#906000#') + + self.assertEquals(so_obj.get_show_node_prefs(), + self.expected_show_node_prefs) + + self.assertEquals(so_obj.get_supported_types(), + self.expected_supported_types) + + self.assertEquals(so_obj.get_supported_types(skip_check=True), + self.expected_supported_types_skip) + + self.assertEquals(so_obj.search('searchtext', 'all'), + self.expected_search_op) diff --git a/web/pgadmin/tools/search_objects/utils.py b/web/pgadmin/tools/search_objects/utils.py new file mode 100644 index 000000000..cf858d6e2 --- /dev/null +++ b/web/pgadmin/tools/search_objects/utils.py @@ -0,0 +1,131 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from flask import current_app, render_template +from flask_babelex import gettext + +from pgadmin.utils.driver import get_driver +from config import PG_DEFAULT_DRIVER + + +def get_node_blueprint(node_type): + blueprint = None + node_type = 'NODE-' + node_type + if node_type in current_app.blueprints: + blueprint = current_app.blueprints[node_type] + + return blueprint + + +class SearchObjectsHelper: + def __init__(self, sid, did, show_system_objects=False, node_types=None): + self.sid = sid + self.did = did + self.show_system_objects = show_system_objects + self.manager = get_driver( + PG_DEFAULT_DRIVER + ).connection_manager(sid) + + self._all_node_types = [ + 'cast', 'fts_dictionary', 'check_constraint', + 'exclusion_constraint', 'foreign_key', + 'primary_key', 'unique_constraint', 'constraints', 'trigger', + 'table', 'compound_trigger', 'rule', 'column', 'partition', + 'index', 'type', 'domain', 'domain_constraints', 'schema', + 'synonym', 'sequence', 'edbvar', 'edbfunc', 'edbproc', 'package', + 'foreign_table', 'fts_parser', 'function', 'procedure', + 'trigger_function', 'fts_template', 'collation', 'view', 'mview', + 'fts_configuration', 'extension', 'language', + 'event_trigger', 'foreign_server', 'user_mapping', + 'foreign_data_wrapper' + ] if node_types is None else node_types + + @property + def all_node_types(self): + return self._all_node_types + + def get_template_path(self): + return 'search_objects/sql/{0}/#{1}#'.format( + self.manager.server_type, self.manager.version) + + def get_show_node_prefs(self): + return_types = {} + for node_type in self.all_node_types: + blueprint = get_node_blueprint(node_type) + if blueprint is None: + continue + + return_types[node_type] = blueprint.show_node + return return_types + + def get_supported_types(self, skip_check=False): + return_types = {} + for node_type in self.all_node_types: + blueprint = get_node_blueprint(node_type) + if blueprint is None: + continue + + if blueprint.BackendSupported(self.manager, is_catalog=False, + did=self.did) or skip_check: + if node_type in ['edbfunc', 'edbproc']: + return_types[node_type] =\ + gettext('Package {0}').format( + blueprint.collection_label) + else: + return_types[node_type] = blueprint.collection_label + + return return_types + + def get_sql(self, sql_file, **kwargs): + return render_template( + "/".join([self.get_template_path(), sql_file]), + **kwargs + ) + + def finalize_id_path(self, path, base_path): + if base_path is not None: + path = '{0}/{1}'.format(base_path, path) + + return path + + def search(self, text, obj_type=None): + conn = self.manager.connection(did=self.did) + last_system_oid = (self.manager.db_info[self.did])['datlastsysoid'] \ + if self.manager.db_info is not None and self.did in \ + self.manager.db_info else 0 + + show_node_prefs = self.get_show_node_prefs() + node_labels = self.get_supported_types(skip_check=True) + # Column catalog_level has values as + # N - Not a catalog schema + # D - Catalog schema with DB support - pg_catalog + # O - Catalog schema with object support only - info schema, dbo, sys + status, res = conn.execute_dict( + self.get_sql('search.sql', search_text=text, obj_type=obj_type, + show_system_objects=self.show_system_objects, + show_node_prefs=show_node_prefs, _=gettext, + last_system_oid=last_system_oid) + ) + + if not status: + return status, res + + ret_val = [ + { + 'name': row['obj_name'], + 'type': row['obj_type'], + 'type_label': node_labels[row['obj_type']], + 'path': row['obj_path'], + 'show_node': row['show_node'], + 'other_info': row['other_info'], + 'catalog_level': row['catalog_level'], + } + for row in res['rows'] + ] + return True, ret_val diff --git a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css index 52b821d8b..f9d15b8da 100644 --- a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css +++ b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css @@ -112,7 +112,7 @@ li { font-size: 9pt; } -.slick-header-column.ui-state-default { +#datagrid .slick-header-column.ui-state-default { height: 32px !important; } diff --git a/web/regression/javascript/fake_endpoints.js b/web/regression/javascript/fake_endpoints.js index fa01b3f89..157a34863 100644 --- a/web/regression/javascript/fake_endpoints.js +++ b/web/regression/javascript/fake_endpoints.js @@ -19,5 +19,7 @@ define(function () { 'datagrid.initialize_query_tool_with_did': '/initialize/query_tool/<int:sgid>/<int:sid>/<int:did>', 'restore.create_job': '/restore/job/<int:sid>', 'datagrid.panel': '/panel/<int:trans_id>', + 'search_objects.types': '/search_objects/types/<int:sid>/<int:did>', + 'search_objects.search': '/search_objects/search/<int:sid>/<int:did>', }; }); diff --git a/web/regression/javascript/search_objects/search_objects_dialog_spec.js b/web/regression/javascript/search_objects/search_objects_dialog_spec.js new file mode 100644 index 000000000..039db1970 --- /dev/null +++ b/web/regression/javascript/search_objects/search_objects_dialog_spec.js @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// +import SearchObjectsDialog from 'tools/search_objects/static/js/search_objects_dialog'; +import {TreeFake} from '../tree/tree_fake'; +import MockAdapter from 'axios-mock-adapter'; +import axios from 'axios/index'; + +const context = describe; + +describe('SearchObjectsDialog', () => { + let soDialog; + let pgBrowser; + let jquerySpy; + let alertifySpy; + + beforeEach(() => { + pgBrowser = { + treeMenu: new TreeFake(), + Nodes: { + server: { + hasId: true, + label: 'server', + getTreeNodeHierarchy: jasmine.createSpy('server.getTreeNodeHierarchy'), + }, + database: { + hasId: true, + label: 'database', + getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'), + }, + schema: { + hasId: true, + label: 'schema', + getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'), + }, + }, + stdW: { + sm: 500, + md: 700, + lg: 900, + default: 500, + }, + stdH: { + sm: 200, + md: 400, + lg: 550, + default: 550, + }, + }; + pgBrowser.Nodes.server.hasId = true; + pgBrowser.Nodes.database.hasId = true; + jquerySpy = jasmine.createSpy('jquerySpy'); + + const hierarchy = { + children: [ + { + id: 'root', + children: [ + { + id: 'serverTreeNode', + data: { + _id: 10, + _type: 'server', + user: {name: 'username'}, + label: 'theserver', + }, + children: [ + { + id: 'some_database', + data: { + _type: 'database', + _id: 11, + label: 'thedatabase', + }, + }, + ], + }, + { + id: 'ppasServer', + data: { + _type: 'server', + server_type: 'ppas', + children: [ + {id: 'someNodeUnderneathPPASServer'}, + ], + }, + }, + ], + }, + ], + }; + + pgBrowser.treeMenu = TreeFake.build(hierarchy); + }); + + describe('#draw', () => { + let networkMock; + beforeEach(() => { + networkMock = new MockAdapter(axios); + alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']); + alertifySpy['search_objects'] = jasmine.createSpy('search_objects'); + soDialog = new SearchObjectsDialog( + pgBrowser, + jquerySpy, + alertifySpy, + null + ); + + pgBrowser.get_preference = jasmine.createSpy('get_preferences'); + }); + + afterEach(() => { + networkMock.restore(); + }); + + context('there are no ancestors of the type database', () => { + it('does not create a dialog', () => { + pgBrowser.treeMenu.selectNode([{id: 'serverTreeNode'}]); + soDialog.draw(null, null, null); + expect(alertifySpy['search_objects']).not.toHaveBeenCalled(); + }); + + it('display an alert with a Backup Error', () => { + soDialog.draw(null, [{id: 'serverTreeNode'}], null); + expect(alertifySpy.alert).toHaveBeenCalledWith( + 'Search Objects Error', + 'Please select a database or its child node from the browser.' + ); + }); + }); + + context('there is an ancestor of the type database', () => { + let soDialogResizeToSpy; + beforeEach(() => { + soDialogResizeToSpy = jasmine.createSpyObj('soDialogResizeToSpy', ['resizeTo']); + alertifySpy['search_objects'].and + .returnValue(soDialogResizeToSpy); + }); + + it('displays the dialog when database node selected', (done) => { + soDialog.draw(null, [{id: 'some_database'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md); + setTimeout(() => { + expect(alertifySpy['search_objects']).toHaveBeenCalledWith('Search Objects - thedatabase/username@theserver'); + expect(soDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md); + done(); + }, 0); + }); + }); + }); +}); diff --git a/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js b/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js new file mode 100644 index 000000000..4131e2d3a --- /dev/null +++ b/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js @@ -0,0 +1,526 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import {TreeFake} from '../tree/tree_fake'; +import SearchObjectsDialogWrapper from 'tools/search_objects/static/js/search_objects_dialog_wrapper'; +import axios from 'axios/index'; +import MockAdapter from 'axios-mock-adapter'; +import {TreeNode} from '../../../pgadmin/static/js/tree/tree'; + +let context = describe; + +describe('SearchObjectsDialogWrapper', () => { + let jquerySpy; + let pgBrowser; + let alertifySpy; + let dialogModelKlassSpy = null; + let backform; + let soDialogWrapper; + let noDataNode; + let serverTreeNode; + let databaseTreeNode; + let viewSchema; + let soJQueryContainerSpy; + let soNodeChildNodeSpy; + let soNode; + + beforeEach(() => { + pgBrowser = { + treeMenu: new TreeFake(), + Nodes: { + server: { + hasId: true, + getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'), + }, + database: { + hasId: true, + getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'), + }, + 'coll-sometype': { + type: 'coll-sometype', + hasId: false, + label: 'Some types coll', + }, + sometype: { + type: 'sometype', + hasId: true, + }, + someothertype: { + type: 'someothertype', + hasId: true, + collection_type: 'coll-sometype', + }, + 'coll-edbfunc': { + type: 'coll-edbfunc', + hasId: true, + label: 'Functions', + }, + 'coll-edbproc': { + type: 'coll-edbfunc', + hasId: true, + label: 'Procedures', + }, + 'coll-edbvar': { + type: 'coll-edbfunc', + hasId: true, + label: 'Variables', + }, + }, + keyboardNavigation: jasmine.createSpyObj('keyboardNavigation', ['getDialogTabNavigator']), + }; + noDataNode = pgBrowser.treeMenu.addNewNode('level1.1', undefined, [{id: 'level1'}]); + serverTreeNode = pgBrowser.treeMenu.addNewNode('level2.1', { + _type: 'server', + _id: 10, + label: 'some-tree-label', + }, [{id: 'level2.1'}]); + databaseTreeNode = new TreeNode('database-tree-node', { + _type: 'database', + _id: 123, + _label: 'some-database-label', + }, [{id: 'database-tree-node'}]); + pgBrowser.treeMenu.addChild(serverTreeNode, databaseTreeNode); + + jquerySpy = jasmine.createSpy('jquerySpy'); + soNode = { + __internal: { + buttons: [{}, {}, {}, { + element: { + disabled: false, + }, + }], + }, + elements: { + body: { + childNodes: [ + {}, + ], + }, + content: jasmine.createSpyObj('content', ['appendChild', 'attr']), + }, + }; + + soJQueryContainerSpy = jasmine.createSpyObj('soJQueryContainer', ['get', 'attr']); + soJQueryContainerSpy.get.and.returnValue(soJQueryContainerSpy); + + viewSchema = {}; + backform = jasmine.createSpyObj('backform', ['generateViewSchema', 'Dialog']); + backform.generateViewSchema.and.returnValue(viewSchema); + + soNodeChildNodeSpy = jasmine.createSpyObj('something', ['addClass']); + jquerySpy.and.callFake((selector) => { + if (selector === '<div class=\'search_objects_dialog\'></div>') { + return soJQueryContainerSpy; + } else if (selector === soNode.elements.body.childNodes[0]) { + return soNodeChildNodeSpy; + } + }); + alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']); + + }); + + describe('#prepare', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + soDialogWrapper = Object.assign(soDialogWrapper, soNode); + spyOn(soDialogWrapper, 'prepareDialog').and.callThrough(); + spyOn(soDialogWrapper, 'setTypes'); + }); + + context('no tree element is selected', () => { + it('does not prepare dialog', () => { + spyOn(soDialogWrapper, 'prepareDialog'); + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).not.toHaveBeenCalled(); + }); + }); + + context('selected tree node has no data', () => { + beforeEach(() => { + pgBrowser.treeMenu.selectNode(noDataNode.domNode); + }); + + it('does not prepare the dialog', () => { + spyOn(soDialogWrapper, 'prepareDialog'); + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).not.toHaveBeenCalled(); + }); + }); + + context('tree element is selected', () => { + let gridDestroySpy; + let networkMock; + + beforeEach(() => { + pgBrowser.treeMenu.selectNode(databaseTreeNode.domNode); + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['destroy']); + spyOn(soDialogWrapper, 'showMessage'); + gridDestroySpy = spyOn(soDialogWrapper.grid, 'destroy'); + + networkMock = new MockAdapter(axios); + + }); + + afterEach(() => { + networkMock.restore(); + }); + + it('creates dialog and displays it', () => { + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).toHaveBeenCalled(); + expect(soDialogWrapper.showMessage).toHaveBeenCalledWith(null); + }); + + + it('if grid set then destroy it', () => { + soDialogWrapper.prepare(); + expect(gridDestroySpy).toHaveBeenCalled(); + expect(soDialogWrapper.grid).toBe(null); + }); + + it('setTypes called after the ajax success', (done) => { + networkMock.onGet('/search_objects/types/10/123').reply(200, { + 'data': { + 'type1': 'Type Label 1', + 'type2': 'Type Label 2', + }, + }); + + soDialogWrapper.prepare(); + + expect(soDialogWrapper.setTypes.calls.argsFor(0)).toEqual([ + [{ id: -1, text: 'Loading...', value: null }], false, + ]); + + setTimeout(()=>{ + expect(soDialogWrapper.setTypes.calls.argsFor(1)).toEqual([ + [{id: 'all', text: 'All types'}, + {id: 'type1', text: 'Type Label 1'}, + {id: 'type2', text: 'Type Label 2'}], + ]); + done(); + }, 0); + }); + + it('setTypes called after the ajax fail', (done) => { + networkMock.onGet('/search_objects/types/10/123').reply(500); + + soDialogWrapper.prepare(); + + expect(soDialogWrapper.setTypes.calls.argsFor(0)).toEqual([ + [{ id: -1, text: 'Loading...', value: null }], false, + ]); + + setTimeout(()=>{ + expect(soDialogWrapper.setTypes.calls.argsFor(1)).toEqual([ + [{id: -1, text: 'Failed', value: null }], false, + ]); + done(); + }, 0); + }); + }); + }); + + describe('showMessage', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + soDialogWrapper.statusBar = document.createElement('div'); + soDialogWrapper.statusBar.classList.add('d-none'); + document.body.appendChild(soDialogWrapper.statusBar); + }); + + afterEach(() => { + document.body.removeChild(soDialogWrapper.statusBar); + }); + it('when info message', ()=>{ + soDialogWrapper.showMessage('locating', false); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.statusBar.querySelector('.error-in-footer')).toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.info-in-footer')).not.toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.alert-text').innerHTML).toEqual('locating'); + }); + + it('when error message', ()=>{ + soDialogWrapper.showMessage('some error', true); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.statusBar.querySelector('.error-in-footer')).not.toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.info-in-footer')).toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.alert-text').innerHTML).toEqual('some error'); + }); + + it('when no message', ()=>{ + soDialogWrapper.showMessage(null); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(true); + }); + }); + + describe('function', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + }); + + it('updateDimOfSearchResult', ()=>{ + soDialogWrapper.searchResultContainer = document.createElement('div'); + soDialogWrapper.searchResult = document.createElement('div'); + spyOn(soDialogWrapper.searchResultContainer, 'getBoundingClientRect').and.returnValue({height:100, width: 50}); + + soDialogWrapper.updateDimOfSearchResult(); + expect(soDialogWrapper.searchResult.style.height).toEqual('100px'); + expect(soDialogWrapper.searchResult.style.width).toEqual('50px'); + }); + + it('setLoading', ()=>{ + soDialogWrapper.loader = document.createElement('div'); + soDialogWrapper.loader.innerHTML = ` + <div class="pg-sp-text"></div> + `; + + soDialogWrapper.setLoading('loading'); + expect(soDialogWrapper.loader.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.loader.querySelector('.pg-sp-text').innerHTML).toEqual('loading'); + + soDialogWrapper.setLoading(null); + expect(soDialogWrapper.loader.classList.contains('d-none')).toBe(true); + }); + + it('searchBtnEnabled', ()=>{ + soDialogWrapper.searchBtn = document.createElement('button'); + + soDialogWrapper.searchBtnEnabled(true); + expect(soDialogWrapper.searchBtn.disabled).toEqual(false); + expect(soDialogWrapper.searchBtnEnabled()).toEqual(true); + + soDialogWrapper.searchBtnEnabled(false); + expect(soDialogWrapper.searchBtn.disabled).toEqual(true); + expect(soDialogWrapper.searchBtnEnabled()).toEqual(false); + }); + + it('searchBoxVal', ()=>{ + soDialogWrapper.searchBox = document.createElement('input'); + soDialogWrapper.searchBoxVal('abc'); + expect(soDialogWrapper.searchBox.value).toEqual('abc'); + expect(soDialogWrapper.searchBoxVal()).toEqual('abc'); + }); + + it('typesVal', ()=>{ + soDialogWrapper.typesSelect = document.createElement('select'); + let opt = document.createElement('option'); + opt.appendChild( document.createTextNode('Some type') ); + opt.value = 'sometype'; + soDialogWrapper.typesSelect.appendChild(opt); + + soDialogWrapper.typesVal('sometype'); + expect(soDialogWrapper.typesSelect.value).toEqual('sometype'); + expect(soDialogWrapper.typesVal()).toEqual('sometype'); + }); + + it('setGridData', ()=>{ + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['setData', 'resizeCanvas']); + soDialogWrapper.setGridData([{id:'somedata'}]); + expect(soDialogWrapper.grid.setData).toHaveBeenCalled(); + expect(soDialogWrapper.grid.resizeCanvas).toHaveBeenCalled(); + }); + + it('onDialogResize', ()=>{ + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['autosizeColumns', 'resizeCanvas']); + spyOn(soDialogWrapper, 'updateDimOfSearchResult'); + + soDialogWrapper.onDialogResize(); + expect(soDialogWrapper.updateDimOfSearchResult).toHaveBeenCalled(); + expect(soDialogWrapper.grid.resizeCanvas).toHaveBeenCalled(); + expect(soDialogWrapper.grid.autosizeColumns).toHaveBeenCalled(); + }); + + it('onDialogShow', (done)=>{ + spyOn(soDialogWrapper, 'prepareGrid').and.callFake(function() { + this.grid = jasmine.createSpyObj('grid', ['init']); + }); + + spyOn(soDialogWrapper, 'focusOnDialog'); + spyOn(soDialogWrapper, 'updateDimOfSearchResult'); + spyOn(soDialogWrapper, 'setGridData'); + spyOn(soDialogWrapper, 'onDialogResize'); + + + soDialogWrapper.onDialogShow(); + setTimeout(()=>{ + expect(soDialogWrapper.prepareGrid).toHaveBeenCalled(); + expect(soDialogWrapper.focusOnDialog).toHaveBeenCalled(); + expect(soDialogWrapper.setGridData).toHaveBeenCalledWith([]); + expect(soDialogWrapper.onDialogResize).toHaveBeenCalled(); + done(); + }, 750); + }); + + context('getCollNode', ()=>{ + it('type have same coll node', ()=>{ + let collNode = soDialogWrapper.getCollNode('sometype'); + expect(collNode.type).toEqual('coll-sometype'); + }); + + it('type does not same coll node', ()=>{ + let collNode = soDialogWrapper.getCollNode('someothertype'); + expect(collNode.type).toEqual('coll-sometype'); + }); + + it('type does not have coll node at all', ()=>{ + let collNode = soDialogWrapper.getCollNode('database'); + expect(collNode).toBe(null); + }); + }); + + it('finaliseData', ()=>{ + spyOn(soDialogWrapper, 'translateSearchObjectsPath').and.returnValue(['disp/path', 'id/path']); + let data = soDialogWrapper.finaliseData({ + name: 'objname', + type: 'sometype', + type_label: 'Some types coll', + path: ':some.123:/path', + show_node: true, + }); + expect(data).toEqual({ + icon: 'icon-sometype', + name: 'objname', + type: 'sometype', + type_label: 'Some types coll', + path: 'disp/path', + id_path: 'id/path', + show_node: true, + }); + }); + + context('translateSearchObjectsPath', ()=>{ + let path = null, catalog_level = null; + beforeEach(()=>{ + pgBrowser.Nodes = { + 'server_group': { + type:'server_group', + label: 'Server group', + }, + 'server': { + type:'server', + label: 'Server', + }, + 'coll-database': { + type:'coll-database', + label: 'Databases', + }, + 'database': { + type:'database', + label: 'Database', + }, + 'coll-schema': { + type:'coll-schema', + label: 'Schemas', + }, + 'schema': { + type:'schema', + label: 'Schema', + }, + 'coll-table': { + type:'coll-table', + label: 'Tables', + }, + 'table': { + type:'table', + label: 'Table', + }, + 'sometype': { + type:'sometype', + label: 'Some type', + collection_type: 'coll-table', + }, + 'coll-catalog': { + type:'coll-catalog', + label: 'Catalogs', + }, + 'catalog': { + type:'catalog', + label: 'Catalog', + }, + 'coll-catalog_object': { + type:'coll-catalog_object', + label: 'Catalog Objects', + }, + 'catalog_object': { + type:'catalog_object', + label: 'catalog object', + }, + }; + + soDialogWrapper.treeInfo = { + 'server_group': {'id': 'server_group/1', '_id': 1}, + 'server': {'id': 'server/3', '_id': 3}, + 'database': {'id': 'database/18456', '_id': 18456}, + }; + }); + it('regular schema', ()=>{ + path = ':schema.2200:/test_db/:table.2604:/sampletab'; + catalog_level = 'N'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Schemas/test_db/Tables/sampletab', + ['server_group/1','server/3','coll-database/3','database/18456','coll-schema/18456','schema/2200','coll-table/2200','table/2604'], + ]); + }); + + context('catalog schema', ()=>{ + it('with db support', ()=>{ + path = ':schema.11:/PostgreSQL Catalog (pg_catalog)/:table.2604:/pg_class'; + catalog_level = 'D'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Catalogs/PostgreSQL Catalog (pg_catalog)/Tables/pg_class', + ['server_group/1','server/3','coll-database/3','database/18456','coll-catalog/18456','catalog/11','coll-table/11','table/2604'], + ]); + }); + + it('with object support only', ()=>{ + path = ':schema.11:/ANSI (information_schema)/:table.2604:/attributes'; + catalog_level = 'O'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Catalogs/ANSI (information_schema)/Catalog Objects/attributes', + ['server_group/1','server/3','coll-database/3','database/18456','coll-catalog/18456','catalog/11','coll-catalog_object/11','catalog_object/2604'], + ]); + }); + }); + }); + }); +}); diff --git a/web/regression/javascript/tree/tree_fake.js b/web/regression/javascript/tree/tree_fake.js index c0c17796a..f476bb272 100644 --- a/web/regression/javascript/tree/tree_fake.js +++ b/web/regression/javascript/tree/tree_fake.js @@ -41,6 +41,9 @@ export class TreeFake extends Tree { this.aciTreeToOurTreeTranslator = {}; this.aciTreeApi = jasmine.createSpyObj( 'ACITreeApi', ['setInode', 'unload', 'deselect', 'select']); + this.aciTreeApi.unload.and.callFake(function(domNode, config) { + config.success(); + }); } addNewNode(id, data, domNode, path) { diff --git a/web/regression/javascript/tree/tree_spec.js b/web/regression/javascript/tree/tree_spec.js index bb607796c..038fcc24c 100644 --- a/web/regression/javascript/tree/tree_spec.js +++ b/web/regression/javascript/tree/tree_spec.js @@ -246,39 +246,70 @@ describe('tree tests', () => { tree.aciTreeApi = jasmine.createSpyObj( 'ACITreeApi', ['setInode', 'unload', 'deselect', 'select']); + tree.aciTreeApi.unload.and.callFake((domNode, config) => { + config.success(); + }); }); - it('reloads the node and its children', () => { - level2.reload(tree); - expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + it('reloads the node and its children', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); - it('does not reload the children of node', () => { - level2.reload(tree); - expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + it('does not reload the children of node', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); it('select the node', (done) => { - level2.reload(tree); - setTimeout(() => { - expect(tree.selected()).toEqual([{id: 'level2'}]); - done(); - }, 20); + level2.reload(tree) + .then(()=>{ + setTimeout(() => { + expect(tree.selected()).toEqual([{id: 'level2'}]); + done(); + }, 20); + }) + .catch((error)=>{ + fail(error); + }); }); describe('ACITree specific', () => { - it('sets the current node as a Inode, changing the Icon back to +', () => { - level2.reload(tree); - expect(tree.aciTreeApi.setInode).toHaveBeenCalledWith([{id: 'level2'}]); + it('sets the current node as a Inode, changing the Icon back to +', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.aciTreeApi.setInode).toHaveBeenCalledWith([{id: 'level2'}]); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); it('deselect the node and selects it again to trigger ACI tree' + ' events', (done) => { - level2.reload(tree); - setTimeout(() => { - expect(tree.aciTreeApi.deselect).toHaveBeenCalledWith([{id: 'level2'}]); - done(); - }, 20); + level2.reload(tree) + .then(()=>{ + setTimeout(() => { + expect(tree.aciTreeApi.deselect).toHaveBeenCalledWith([{id: 'level2'}]); + done(); + }, 20); + }) + .catch((error)=>{ + fail(error); + }); }); }); }); @@ -292,17 +323,32 @@ describe('tree tests', () => { level2 = tree.addNewNode('level2', {data: 'data'}, ['<li>level2</li>'], ['level1']); tree.addNewNode('level3', {data: 'more data'}, ['<li>level3</li>'], ['level1', 'level2']); tree.aciTreeApi = jasmine.createSpyObj('ACITreeApi', ['unload']); + tree.aciTreeApi.unload.and.callFake((domNode, config) => { + config.success(); + }); }); - it('unloads the children of the current node', () => { - level2.unload(tree); - expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); - expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + it('unloads the children of the current node', (done) => { + level2.unload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); - it('calls unload on the ACI Tree', () => { - level2.unload(tree); - expect(tree.aciTreeApi.unload).toHaveBeenCalledWith(['<li>level2</li>']); + it('calls unload on the ACI Tree', (done) => { + level2.unload(tree) + .then(()=>{ + expect(tree.aciTreeApi.unload).toHaveBeenCalledWith(['<li>level2</li>'], jasmine.any(Object)); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); }); }); diff --git a/web/webpack.config.js b/web/webpack.config.js index 9fd0a32e9..29811388a 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -494,7 +494,8 @@ module.exports = [{ ',pgadmin.tools.debugger.controller' + ',pgadmin.tools.debugger.direct' + ',pgadmin.node.pga_job' + - ',pgadmin.tools.schema_diff', + ',pgadmin.tools.schema_diff' + + ',pgadmin.tools.search_objects', }, }, { test: require.resolve('snapsvg'), diff --git a/web/webpack.shim.js b/web/webpack.shim.js index a5c73805a..0587d0498 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -281,6 +281,8 @@ var webpackShimConfig = { 'pgadmin.tools.restore': path.join(__dirname, './pgadmin/tools/restore/static/js/restore'), 'pgadmin.tools.schema_diff': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff'), 'pgadmin.tools.schema_diff_ui': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff_ui'), + 'pgadmin.tools.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js/search_objects'), + 'pgadmin.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js'), 'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'), 'pgadmin.user_management.current_user': '/user_management/current_user', 'slick.pgadmin.editors': path.join(__dirname, './pgadmin/tools/../static/js/slickgrid/editors'), diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js index 70db29125..cfa8dda02 100644 --- a/web/webpack.test.config.js +++ b/web/webpack.test.config.js @@ -105,6 +105,7 @@ module.exports = { 'pgadmin.browser.preferences': path.join(__dirname, './pgadmin/browser/static/js/preferences'), 'pgadmin.browser.activity': path.join(__dirname, './pgadmin/browser/static/js/activity'), 'bundled_codemirror': path.join(__dirname, './pgadmin/static/bundle/codemirror'), + 'tools': path.join(__dirname, './pgadmin/tools/'), }, }, }; ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-01 12:28 Akshay Joshi <[email protected]> parent: Aditya Toshniwal <[email protected]> 1 sibling, 0 replies; 12+ messages in thread From: Akshay Joshi @ 2020-04-01 12:28 UTC (permalink / raw) To: Aditya Toshniwal <[email protected]>; +Cc: pgadmin-hackers Hi Khsuboo, Can you please review it. On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < [email protected]> wrote: > Hi Hackers, > > Attached is the patch to implement search objects functionality in pgadmin. > The feature will allow a user to search for any object in a database. > Highlights of the feature: > 1) Search any object with user input text with at least 3 characters. > 2) Search can be done on a specific object type by selecting from the > types dropdown. > 3) The search results grid will show object name, object type and the > object path on the browser tree. On double clicking the record, it will > locate that object on the browser tree. The columns object name and type > are sortable. > 4) The object nodes which are disabled (hidden) using preferences will not > be visible in the types dropdown. However, in the case of all types, the > search records will be visible for those types greyed out. > 5) You can also access search objects dialog using the button on the > browser toolbar. > > Python and JS test cases added. Docs updated. > Please review. > > -- > Thanks and Regards, > Aditya Toshniwal > pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune > "Don't Complain about Heat, Plant a TREE" > -- *Thanks & Regards* *Akshay Joshi* *Sr. Software Architect* *EnterpriseDB Software India Private Limited* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-01 12:30 Akshay Joshi <[email protected]> parent: Aditya Toshniwal <[email protected]> 1 sibling, 1 reply; 12+ messages in thread From: Akshay Joshi @ 2020-04-01 12:30 UTC (permalink / raw) To: Khushboo Vashi <[email protected]>; +Cc: pgadmin-hackers; Aditya Toshniwal <[email protected]> Hi Khushboo, Can you please review it. On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < [email protected]> wrote: > Hi Hackers, > > Attached is the patch to implement search objects functionality in pgadmin. > The feature will allow a user to search for any object in a database. > Highlights of the feature: > 1) Search any object with user input text with at least 3 characters. > 2) Search can be done on a specific object type by selecting from the > types dropdown. > 3) The search results grid will show object name, object type and the > object path on the browser tree. On double clicking the record, it will > locate that object on the browser tree. The columns object name and type > are sortable. > 4) The object nodes which are disabled (hidden) using preferences will not > be visible in the types dropdown. However, in the case of all types, the > search records will be visible for those types greyed out. > 5) You can also access search objects dialog using the button on the > browser toolbar. > > Python and JS test cases added. Docs updated. > Please review. > > -- > Thanks and Regards, > Aditya Toshniwal > pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune > "Don't Complain about Heat, Plant a TREE" > -- *Thanks & Regards* *Akshay Joshi* *Sr. Software Architect* *EnterpriseDB Software India Private Limited* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-02 04:01 Khushboo Vashi <[email protected]> parent: Akshay Joshi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Khushboo Vashi @ 2020-04-02 04:01 UTC (permalink / raw) To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers; Aditya Toshniwal <[email protected]> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi <[email protected]> wrote: > Hi Khushboo, > > Can you please review it. > I am on it. > > On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < > [email protected]> wrote: > >> Hi Hackers, >> >> Attached is the patch to implement search objects functionality in >> pgadmin. >> The feature will allow a user to search for any object in a database. >> Highlights of the feature: >> 1) Search any object with user input text with at least 3 characters. >> 2) Search can be done on a specific object type by selecting from the >> types dropdown. >> 3) The search results grid will show object name, object type and the >> object path on the browser tree. On double clicking the record, it will >> locate that object on the browser tree. The columns object name and type >> are sortable. >> 4) The object nodes which are disabled (hidden) using preferences will >> not be visible in the types dropdown. However, in the case of all types, >> the search records will be visible for those types greyed out. >> 5) You can also access search objects dialog using the button on the >> browser toolbar. >> >> Python and JS test cases added. Docs updated. >> Please review. >> >> -- >> Thanks and Regards, >> Aditya Toshniwal >> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >> "Don't Complain about Heat, Plant a TREE" >> > > > -- > *Thanks & Regards* > *Akshay Joshi* > > *Sr. Software Architect* > *EnterpriseDB Software India Private Limited* > *Mobile: +91 976-788-8246* > ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-02 10:39 Khushboo Vashi <[email protected]> parent: Khushboo Vashi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Khushboo Vashi @ 2020-04-02 10:39 UTC (permalink / raw) To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers; Aditya Toshniwal <[email protected]> Hi Aditya, Review comments: *UI:* 1. When no object is found, the default message should be given, currently no message displayed. 2. Can we have a tooltip on the row "Double click to locate the object in the browser" ? 3. Full stop is missing in the message column objects are disabled in the browser. You can enable them in the preferences dialog ( :D ) and also, we should start the statement with the capital letter. 4. If possible, use the multilevel partition table symbol same as the browser tree. 5. gettext is missing from the search grid header. 6. Suggestion: The search button should be at the end (after type combobox). The current position of the controls suggest that search for the objects and then filter it out but that's not the case. After changing the type, we have to click on the search button. In the current positioning, we should fetch all the records from the backend and then filter those out depending on the type at the client side only, so that will reduce the server requests and slickgrid is efficient it do so. *Backend:* 1. We do have the list of blueprint, so we can use that list instead of taking the hard coe list in the init method of SearchObjectsHelper class. 2. While searching the object, we create an object of SearchObjectsHelper on each request. We can create it once while initializing and utilize it on every search. Note: The functionality is working fine. Thanks, Khushboo On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < [email protected]> wrote: > > > On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi <[email protected]> > wrote: > >> Hi Khushboo, >> >> Can you please review it. >> > I am on it. > >> >> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >> [email protected]> wrote: >> >>> Hi Hackers, >>> >>> Attached is the patch to implement search objects functionality in >>> pgadmin. >>> The feature will allow a user to search for any object in a database. >>> Highlights of the feature: >>> 1) Search any object with user input text with at least 3 characters. >>> 2) Search can be done on a specific object type by selecting from the >>> types dropdown. >>> 3) The search results grid will show object name, object type and the >>> object path on the browser tree. On double clicking the record, it will >>> locate that object on the browser tree. The columns object name and type >>> are sortable. >>> 4) The object nodes which are disabled (hidden) using preferences will >>> not be visible in the types dropdown. However, in the case of all types, >>> the search records will be visible for those types greyed out. >>> 5) You can also access search objects dialog using the button on the >>> browser toolbar. >>> >>> Python and JS test cases added. Docs updated. >>> Please review. >>> >>> -- >>> Thanks and Regards, >>> Aditya Toshniwal >>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>> "Don't Complain about Heat, Plant a TREE" >>> >> >> >> -- >> *Thanks & Regards* >> *Akshay Joshi* >> >> *Sr. Software Architect* >> *EnterpriseDB Software India Private Limited* >> *Mobile: +91 976-788-8246* >> > ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-02 10:59 Aditya Toshniwal <[email protected]> parent: Khushboo Vashi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Aditya Toshniwal @ 2020-04-02 10:59 UTC (permalink / raw) To: Khushboo Vashi <[email protected]>; +Cc: Akshay Joshi <[email protected]>; pgadmin-hackers Hi Khushboo, Thank you for reviewing. On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < [email protected]> wrote: > Hi Aditya, > > Review comments: > > *UI:* > > 1. When no object is found, the default message should be given, currently > no message displayed. > 2. Can we have a tooltip on the row "Double click to locate the object in > the browser" ? > 3. Full stop is missing in the message column objects are disabled in the > browser. You can enable them in the preferences dialog ( :D ) > and also, we should start the statement with the capital letter. > 4. If possible, use the multilevel partition table symbol same as the > browser tree. > 5. gettext is missing from the search grid header. > I'll fix all above. > 6. Suggestion: The search button should be at the end (after type > combobox). The current position of the controls suggest that search for > the objects and then filter it out but that's not the case. > I've actually kept the most frequently used controls together. The probability of using the types filter is less and a user would generally go for full search. This is how even we generally do. We search first and then apply filter if required > After changing the type, we have to click on the search button. > In the current positioning, we should fetch all the records from the > backend and then filter those out depending on the type at the client side > only, so that will reduce the server requests and slickgrid is efficient it > do so. > I'll look into this. My only concern is the data may be outdated, but I agree to filter in slickgrid on type change. The user can hit search again if required. > *Backend:* > > 1. We do have the list of blueprint, so we can use that list instead of > taking the hard coe list in the init method of SearchObjectsHelper class. > The reason is, we do not support all objects for search objects. Only objects under a database are supported. The probability of node type change is very less. > 2. While searching the object, we create an object of SearchObjectsHelper > on each request. We can create it once while initializing and utilize it on > every search. > The intention is to keep SearchObjectsHelper stateless. The object is created based on the request data and it is easier to maintain independently. > > Note: The functionality is working fine. > Great. Thanks. > > Thanks, > Khushboo > > > > > > On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < > [email protected]> wrote: > >> >> >> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >> [email protected]> wrote: >> >>> Hi Khushboo, >>> >>> Can you please review it. >>> >> I am on it. >> >>> >>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>> [email protected]> wrote: >>> >>>> Hi Hackers, >>>> >>>> Attached is the patch to implement search objects functionality in >>>> pgadmin. >>>> The feature will allow a user to search for any object in a database. >>>> Highlights of the feature: >>>> 1) Search any object with user input text with at least 3 characters. >>>> 2) Search can be done on a specific object type by selecting from the >>>> types dropdown. >>>> 3) The search results grid will show object name, object type and the >>>> object path on the browser tree. On double clicking the record, it will >>>> locate that object on the browser tree. The columns object name and type >>>> are sortable. >>>> 4) The object nodes which are disabled (hidden) using preferences will >>>> not be visible in the types dropdown. However, in the case of all types, >>>> the search records will be visible for those types greyed out. >>>> 5) You can also access search objects dialog using the button on the >>>> browser toolbar. >>>> >>>> Python and JS test cases added. Docs updated. >>>> Please review. >>>> >>>> -- >>>> Thanks and Regards, >>>> Aditya Toshniwal >>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>> "Don't Complain about Heat, Plant a TREE" >>>> >>> >>> >>> -- >>> *Thanks & Regards* >>> *Akshay Joshi* >>> >>> *Sr. Software Architect* >>> *EnterpriseDB Software India Private Limited* >>> *Mobile: +91 976-788-8246* >>> >> -- Thanks and Regards, Aditya Toshniwal pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune "Don't Complain about Heat, Plant a TREE" ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-02 11:19 Khushboo Vashi <[email protected]> parent: Aditya Toshniwal <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Khushboo Vashi @ 2020-04-02 11:19 UTC (permalink / raw) To: Aditya Toshniwal <[email protected]>; +Cc: Akshay Joshi <[email protected]>; pgadmin-hackers On Thu, Apr 2, 2020 at 4:30 PM Aditya Toshniwal < [email protected]> wrote: > Hi Khushboo, > > Thank you for reviewing. > > > On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < > [email protected]> wrote: > >> Hi Aditya, >> >> Review comments: >> >> *UI:* >> >> 1. When no object is found, the default message should be given, >> currently no message displayed. >> 2. Can we have a tooltip on the row "Double click to locate the object in >> the browser" ? >> 3. Full stop is missing in the message column objects are disabled in >> the browser. You can enable them in the preferences dialog ( :D ) >> and also, we should start the statement with the capital letter. >> 4. If possible, use the multilevel partition table symbol same as the >> browser tree. >> 5. gettext is missing from the search grid header. >> > I'll fix all above. > >> 6. Suggestion: The search button should be at the end (after type >> combobox). The current position of the controls suggest that search for >> the objects and then filter it out but that's not the case. >> > I've actually kept the most frequently used controls together. The > probability of using the types filter is less and a user would generally go > for full search. This is how even we generally do. We search first and then > apply filter if required > Right, so type based search on slickgrid data would be useful. > After changing the type, we have to click on the search button. >> In the current positioning, we should fetch all the records from the >> backend and then filter those out depending on the type at the client side >> only, so that will reduce the server requests and slickgrid is efficient it >> do so. >> > I'll look into this. My only concern is the data may be outdated, but I > agree to filter in slickgrid on type change. The user can hit search again > if required. > > >> *Backend:* >> >> 1. We do have the list of blueprint, so we can use that list instead of >> taking the hard coe list in the init method of SearchObjectsHelper class. >> > The reason is, we do not support all objects for search objects. Only > objects under a database are supported. The probability of node type change > is very less. > True but we can maintain the skip list (which would be less) and we do have bluprint start with NODE, so it will be easier to fetch. > 2. While searching the object, we create an object of SearchObjectsHelper >> on each request. We can create it once while initializing and utilize it on >> every search. >> > The intention is to keep SearchObjectsHelper stateless. The object is > created based on the request data and it is easier to maintain > independently. > >> >> Note: The functionality is working fine. >> > Great. Thanks. > >> >> Thanks, >> Khushboo >> >> >> >> >> >> On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < >> [email protected]> wrote: >> >>> >>> >>> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >>> [email protected]> wrote: >>> >>>> Hi Khushboo, >>>> >>>> Can you please review it. >>>> >>> I am on it. >>> >>>> >>>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>>> [email protected]> wrote: >>>> >>>>> Hi Hackers, >>>>> >>>>> Attached is the patch to implement search objects functionality in >>>>> pgadmin. >>>>> The feature will allow a user to search for any object in a database. >>>>> Highlights of the feature: >>>>> 1) Search any object with user input text with at least 3 characters. >>>>> 2) Search can be done on a specific object type by selecting from the >>>>> types dropdown. >>>>> 3) The search results grid will show object name, object type and the >>>>> object path on the browser tree. On double clicking the record, it will >>>>> locate that object on the browser tree. The columns object name and type >>>>> are sortable. >>>>> 4) The object nodes which are disabled (hidden) using preferences will >>>>> not be visible in the types dropdown. However, in the case of all types, >>>>> the search records will be visible for those types greyed out. >>>>> 5) You can also access search objects dialog using the button on the >>>>> browser toolbar. >>>>> >>>>> Python and JS test cases added. Docs updated. >>>>> Please review. >>>>> >>>>> -- >>>>> Thanks and Regards, >>>>> Aditya Toshniwal >>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>> "Don't Complain about Heat, Plant a TREE" >>>>> >>>> >>>> >>>> -- >>>> *Thanks & Regards* >>>> *Akshay Joshi* >>>> >>>> *Sr. Software Architect* >>>> *EnterpriseDB Software India Private Limited* >>>> *Mobile: +91 976-788-8246* >>>> >>> > > -- > Thanks and Regards, > Aditya Toshniwal > pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune > "Don't Complain about Heat, Plant a TREE" > ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-02 12:24 Aditya Toshniwal <[email protected]> parent: Khushboo Vashi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Aditya Toshniwal @ 2020-04-02 12:24 UTC (permalink / raw) To: Khushboo Vashi <[email protected]>; +Cc: Akshay Joshi <[email protected]>; pgadmin-hackers Hi Khushboo, On Thu, Apr 2, 2020 at 4:49 PM Khushboo Vashi < [email protected]> wrote: > > > On Thu, Apr 2, 2020 at 4:30 PM Aditya Toshniwal < > [email protected]> wrote: > >> Hi Khushboo, >> >> Thank you for reviewing. >> >> >> On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < >> [email protected]> wrote: >> >>> Hi Aditya, >>> >>> Review comments: >>> >>> *UI:* >>> >>> 1. When no object is found, the default message should be given, >>> currently no message displayed. >>> 2. Can we have a tooltip on the row "Double click to locate the object >>> in the browser" ? >>> 3. Full stop is missing in the message column objects are disabled in >>> the browser. You can enable them in the preferences dialog ( :D ) >>> and also, we should start the statement with the capital letter. >>> 4. If possible, use the multilevel partition table symbol same as the >>> browser tree. >>> 5. gettext is missing from the search grid header. >>> >> I'll fix all above. >> >>> 6. Suggestion: The search button should be at the end (after type >>> combobox). The current position of the controls suggest that search for >>> the objects and then filter it out but that's not the case. >>> >> I've actually kept the most frequently used controls together. The >> probability of using the types filter is less and a user would generally go >> for full search. This is how even we generally do. We search first and then >> apply filter if required >> > Right, so type based search on slickgrid data would be useful. > 👍 > After changing the type, we have to click on the search button. >>> In the current positioning, we should fetch all the records from the >>> backend and then filter those out depending on the type at the client side >>> only, so that will reduce the server requests and slickgrid is efficient it >>> do so. >>> >> I'll look into this. My only concern is the data may be outdated, but I >> agree to filter in slickgrid on type change. The user can hit search again >> if required. >> > >>> *Backend:* >>> >>> 1. We do have the list of blueprint, so we can use that list instead of >>> taking the hard coe list in the init method of SearchObjectsHelper >>> class. >>> >> The reason is, we do not support all objects for search objects. Only >> objects under a database are supported. The probability of node type change >> is very less. >> > True but we can maintain the skip list (which would be less) and we do > have bluprint start with NODE, so it will be easier to fetch. > I would prefer the "in" list rather than "skip" list. Each time a new node is added to pgAdmin, we will have to update the skip list in search objects. With the "in" list, search objects has better control. > 2. While searching the object, we create an object of SearchObjectsHelper >>> on each request. We can create it once while initializing and utilize it on >>> every search. >>> >> The intention is to keep SearchObjectsHelper stateless. The object is >> created based on the request data and it is easier to maintain >> independently. >> >>> >>> Note: The functionality is working fine. >>> >> Great. Thanks. >> >>> >>> Thanks, >>> Khushboo >>> >>> >>> >>> >>> >>> On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < >>> [email protected]> wrote: >>> >>>> >>>> >>>> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >>>> [email protected]> wrote: >>>> >>>>> Hi Khushboo, >>>>> >>>>> Can you please review it. >>>>> >>>> I am on it. >>>> >>>>> >>>>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi Hackers, >>>>>> >>>>>> Attached is the patch to implement search objects functionality in >>>>>> pgadmin. >>>>>> The feature will allow a user to search for any object in a database. >>>>>> Highlights of the feature: >>>>>> 1) Search any object with user input text with at least 3 characters. >>>>>> 2) Search can be done on a specific object type by selecting from the >>>>>> types dropdown. >>>>>> 3) The search results grid will show object name, object type and the >>>>>> object path on the browser tree. On double clicking the record, it will >>>>>> locate that object on the browser tree. The columns object name and type >>>>>> are sortable. >>>>>> 4) The object nodes which are disabled (hidden) using preferences >>>>>> will not be visible in the types dropdown. However, in the case of all >>>>>> types, the search records will be visible for those types greyed out. >>>>>> 5) You can also access search objects dialog using the button on the >>>>>> browser toolbar. >>>>>> >>>>>> Python and JS test cases added. Docs updated. >>>>>> Please review. >>>>>> >>>>>> -- >>>>>> Thanks and Regards, >>>>>> Aditya Toshniwal >>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>> >>>>> >>>>> >>>>> -- >>>>> *Thanks & Regards* >>>>> *Akshay Joshi* >>>>> >>>>> *Sr. Software Architect* >>>>> *EnterpriseDB Software India Private Limited* >>>>> *Mobile: +91 976-788-8246* >>>>> >>>> >> >> -- >> Thanks and Regards, >> Aditya Toshniwal >> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >> "Don't Complain about Heat, Plant a TREE" >> > -- Thanks and Regards, Aditya Toshniwal pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune "Don't Complain about Heat, Plant a TREE" ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-03 09:13 Aditya Toshniwal <[email protected]> parent: Aditya Toshniwal <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Aditya Toshniwal @ 2020-04-03 09:13 UTC (permalink / raw) To: pgadmin-hackers; +Cc: Akshay Joshi <[email protected]>; Khushboo Vashi <[email protected]> Hi Hackers, Attached is the updated patch. With this, 1) I've displayed the rows count detail at the bottom of the dialog. This will help in both cases, when there are rows and when there are none. 2) As discussed, a user can now apply object types dropdown filter on already loaded data. 3) I've not made changes for the multilevel partition icon because it would be too much to do for an icon. We're already showing the type name in the grid. Adding extra SQL joins and making the query slower for the icon is not desirable. 4) Fixed some gettext issues as mentioned in the review. Please review. On Thu, Apr 2, 2020 at 5:54 PM Aditya Toshniwal < [email protected]> wrote: > Hi Khushboo, > > On Thu, Apr 2, 2020 at 4:49 PM Khushboo Vashi < > [email protected]> wrote: > >> >> >> On Thu, Apr 2, 2020 at 4:30 PM Aditya Toshniwal < >> [email protected]> wrote: >> >>> Hi Khushboo, >>> >>> Thank you for reviewing. >>> >>> >>> On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < >>> [email protected]> wrote: >>> >>>> Hi Aditya, >>>> >>>> Review comments: >>>> >>>> *UI:* >>>> >>>> 1. When no object is found, the default message should be given, >>>> currently no message displayed. >>>> 2. Can we have a tooltip on the row "Double click to locate the object >>>> in the browser" ? >>>> 3. Full stop is missing in the message column objects are disabled in >>>> the browser. You can enable them in the preferences dialog ( :D ) >>>> and also, we should start the statement with the capital letter. >>>> 4. If possible, use the multilevel partition table symbol same as the >>>> browser tree. >>>> 5. gettext is missing from the search grid header. >>>> >>> I'll fix all above. >>> >>>> 6. Suggestion: The search button should be at the end (after type >>>> combobox). The current position of the controls suggest that search for >>>> the objects and then filter it out but that's not the case. >>>> >>> I've actually kept the most frequently used controls together. The >>> probability of using the types filter is less and a user would generally go >>> for full search. This is how even we generally do. We search first and then >>> apply filter if required >>> >> Right, so type based search on slickgrid data would be useful. >> > 👍 > >> After changing the type, we have to click on the search button. >>>> In the current positioning, we should fetch all the records from the >>>> backend and then filter those out depending on the type at the client side >>>> only, so that will reduce the server requests and slickgrid is efficient it >>>> do so. >>>> >>> I'll look into this. My only concern is the data may be outdated, but I >>> agree to filter in slickgrid on type change. The user can hit search again >>> if required. >>> >> >>>> *Backend:* >>>> >>>> 1. We do have the list of blueprint, so we can use that list instead of >>>> taking the hard coe list in the init method of SearchObjectsHelper >>>> class. >>>> >>> The reason is, we do not support all objects for search objects. Only >>> objects under a database are supported. The probability of node type change >>> is very less. >>> >> True but we can maintain the skip list (which would be less) and we do >> have bluprint start with NODE, so it will be easier to fetch. >> > I would prefer the "in" list rather than "skip" list. Each time a new node > is added to pgAdmin, we will have to update the skip list in search > objects. With the "in" list, search objects has better control. > >> 2. While searching the object, we create an object of SearchObjectsHelper >>>> on each request. We can create it once while initializing and utilize it on >>>> every search. >>>> >>> The intention is to keep SearchObjectsHelper stateless. The object is >>> created based on the request data and it is easier to maintain >>> independently. >>> >>>> >>>> Note: The functionality is working fine. >>>> >>> Great. Thanks. >>> >>>> >>>> Thanks, >>>> Khushboo >>>> >>>> >>>> >>>> >>>> >>>> On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < >>>> [email protected]> wrote: >>>> >>>>> >>>>> >>>>> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi Khushboo, >>>>>> >>>>>> Can you please review it. >>>>>> >>>>> I am on it. >>>>> >>>>>> >>>>>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hi Hackers, >>>>>>> >>>>>>> Attached is the patch to implement search objects functionality in >>>>>>> pgadmin. >>>>>>> The feature will allow a user to search for any object in a database. >>>>>>> Highlights of the feature: >>>>>>> 1) Search any object with user input text with at least 3 characters. >>>>>>> 2) Search can be done on a specific object type by selecting from >>>>>>> the types dropdown. >>>>>>> 3) The search results grid will show object name, object type and >>>>>>> the object path on the browser tree. On double clicking the record, it will >>>>>>> locate that object on the browser tree. The columns object name and type >>>>>>> are sortable. >>>>>>> 4) The object nodes which are disabled (hidden) using preferences >>>>>>> will not be visible in the types dropdown. However, in the case of all >>>>>>> types, the search records will be visible for those types greyed out. >>>>>>> 5) You can also access search objects dialog using the button on the >>>>>>> browser toolbar. >>>>>>> >>>>>>> Python and JS test cases added. Docs updated. >>>>>>> Please review. >>>>>>> >>>>>>> -- >>>>>>> Thanks and Regards, >>>>>>> Aditya Toshniwal >>>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> *Thanks & Regards* >>>>>> *Akshay Joshi* >>>>>> >>>>>> *Sr. Software Architect* >>>>>> *EnterpriseDB Software India Private Limited* >>>>>> *Mobile: +91 976-788-8246* >>>>>> >>>>> >>> >>> -- >>> Thanks and Regards, >>> Aditya Toshniwal >>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>> "Don't Complain about Heat, Plant a TREE" >>> >> > > -- > Thanks and Regards, > Aditya Toshniwal > pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune > "Don't Complain about Heat, Plant a TREE" > -- Thanks and Regards, Aditya Toshniwal pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune "Don't Complain about Heat, Plant a TREE" Attachments: [application/octet-stream] RM2172_v2.patch (596.6K, 3-RM2172_v2.patch) download | inline diff: diff --git a/docs/en_US/getting_started.rst b/docs/en_US/getting_started.rst index 5b09c5b4c..2595505d2 100644 --- a/docs/en_US/getting_started.rst +++ b/docs/en_US/getting_started.rst @@ -64,6 +64,8 @@ display. To open the *Preferences* dialog, select *Preferences* from the *File* for the dialog. You can access additional Postgres help by navigating through the *Help* menu, and selecting the name of the resource that you wish to open. +You can search for objects in the database using the :ref:`Search objects <search_objects>` + .. toctree:: :maxdepth: 2 @@ -74,6 +76,7 @@ the *Help* menu, and selecting the name of the resource that you wish to open. tree_control preferences keyboard_shortcuts + search_objects Before using pgAdmin to manage objects that reside on a server, you must define a connection to the server; for more information please see *Connecting to a Server* diff --git a/docs/en_US/images/search_objects.png b/docs/en_US/images/search_objects.png new file mode 100644 index 0000000000000000000000000000000000000000..950e813168a89fbd114a1852a2fc7d180f81df82 GIT binary patch literal 188209 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 literal 0 HcmV?d00001 diff --git a/docs/en_US/images/toolbar.png b/docs/en_US/images/toolbar.png index 19c4c574a905fb30ea1828b4825e85af7cdb0c0e..aac16b967b93b44576bf2a042b989aa296251648 100644 GIT binary patch literal 42931 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%0D-NlnK%<oL#WUV3Obj&<*1=JUG#xkE) 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 K<4QTJ@c#j4GvEOL literal 38057 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 diff --git a/docs/en_US/search_objects.rst b/docs/en_US/search_objects.rst new file mode 100644 index 000000000..885e1d756 --- /dev/null +++ b/docs/en_US/search_objects.rst @@ -0,0 +1,34 @@ +.. _search_objects: + +*********************** +`Search objects`:index: +*********************** + +.. image:: images/search_objects.png + :alt: Search objects dialog + :align: center + +With this dialog, you can search for almost any kind of objects in a +database. + +You can access it by right clicking a database or any of its child nodes +and select "Search objects". You can also access it by hitting the +shortcut (default ALT+SHIFT+S). + +The minimum pattern length are 3 characters. The search performed is +non-casesensitive and will find all objets whose name contains the pattern. +You can only search for object names. + +The result is presented in the grid with object name, object type and +the object tree path in the :ref:`browser <tree_control>`. You can double +click on a result row to select the object in the +:ref:`browser <tree_control>`. If the object is greyed out, this means that you +have not enabled those object types in the :ref:`preferences <preferences>`, +so you can't double click on it. + +You can filter based on a particular object type by selecting one from the +object type dropdown. If the search button is hit when one of the object type +is selected then only those types will be fetch from the database. +An object type will not be visible in the dropdown if the database server +does not support it or if it is not enabled from the +:ref:`preferences <preferences>`. \ No newline at end of file diff --git a/docs/en_US/toolbar.rst b/docs/en_US/toolbar.rst index 12dc8621a..f4c685f24 100644 --- a/docs/en_US/toolbar.rst +++ b/docs/en_US/toolbar.rst @@ -18,4 +18,6 @@ the selected browser node. * Use the :ref:`View Data <editgrid>` button to view/edit the data stored in a selected table. * Use the :ref:`Filtered Rows <viewdata_filter>` button to access the Data Filter popup - to apply a filter to a set of data for viewing/editing. \ No newline at end of file + to apply a filter to a set of data for viewing/editing. +* Use the :ref:`Search objects <search_objects>` button to access the search objects + dialog. It helps you search any database object. \ No newline at end of file diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py index 09f472795..5f57f9fa1 100644 --- a/web/pgadmin/browser/register_browser_preferences.py +++ b/web/pgadmin/browser/register_browser_preferences.py @@ -249,6 +249,21 @@ def register_browser_preferences(self): fields=fields ) + self.preference.register( + 'keyboard_shortcuts', + 'sub_menu_search_objects', + gettext('Search objects'), + 'keyboardshortcut', + { + 'alt': True, + 'shift': True, + 'control': False, + 'key': {'key_code': 83, 'char': 's'} + }, + category_label=gettext('Keyboard shortcuts'), + fields=fields + ) + self.preference.register( 'keyboard_shortcuts', 'sub_menu_create', diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js index 7724ef4c4..b2127c4b0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js @@ -24,7 +24,7 @@ define('pgadmin.node.extension', [ pgAdmin.Browser.Nodes['coll-extension'] = pgAdmin.Browser.Collection.extend({ node: 'extension', - label: gettext('Extension'), + label: gettext('Extensions'), type: 'coll-extension', columns: ['name', 'owner', 'comment'], }); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql new file mode 100644 index 000000000..8b11b594a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql @@ -0,0 +1,11 @@ +SELECT + nsp.oid, nspname AS name +FROM + pg_namespace nsp +WHERE nspparent = {{scid}}::oid +{% if pkgid %} +AND nsp.oid = {{pkgid}}::oid +{% endif %} +AND nspobjecttype = 0 +AND nspcompoundtrigger = false +ORDER BY nspname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py index 2984a58e4..4b0a0918c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py @@ -54,8 +54,8 @@ class IndexConstraintModule(ConstraintTypeModule): initialized. """ - NODE_TYPE = 'Index constraint' - COLLECTION_LABEL = _('index_constraint') + NODE_TYPE = 'index_constraint' + COLLECTION_LABEL = _('Index constraint') def __init__(self, *args, **kwargs): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py index e455b8adf..9ffbe742c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py @@ -29,8 +29,11 @@ from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare def backend_supported(module, manager, **kwargs): - if 'tid' in kwargs and CollectionNodeModule.BackendSupported( - module, manager, **kwargs): + + if CollectionNodeModule.BackendSupported(module, manager, **kwargs): + if 'tid' not in kwargs: + return True + conn = manager.connection(did=kwargs['did']) template_path = 'partitions/sql/{0}/#{0}#{1}#'.format( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py index bf92e5f01..1de4de825 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py @@ -21,19 +21,19 @@ else: class TestBackendSupport(BaseTestGenerator): scenarios = [ - ('when tid is not present in arguments, should return None and no ' - 'query should be done', + ('when tid is not present in arguments, but server version' + 'is supported then return True', dict( manager=dict( - server_type="", - version="" + server_type="pg", + version="100000" ), input_arguments=dict(did=432), collection_node_active=True, connection_execution_return_value=[], - expected_return_value=None, + expected_return_value=True, expect_error_response=False, expected_number_calls_on_render_template=0 )), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql index 5f9bf9532..f1645d070 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql @@ -9,6 +9,9 @@ (SELECT 1 FROM pg_class WHERE relname = 'tables' AND relnamespace = {{ tbl }}.oid LIMIT 1)) {%- endmacro %} +{% macro IS_CATALOG_SCHEMA(schema_col_name) -%} + {{ schema_col_name }} IN ('pg_catalog', 'pgagent', 'information_schema') +{%- endmacro %} {% macro LABELS(tbl, _) -%} CASE {{ tbl }}.nspname WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' @@ -17,9 +20,24 @@ ELSE {{ tbl }}.nspname END AS name {%- endmacro %} +{% macro LABELS_SCHEMACOL(schema_col_name, _) -%} + CASE {{ schema_col_name }} + WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' + WHEN 'pgagent' THEN '{{ _( 'pgAgent Job Scheduler' ) }} (pgagent)' + WHEN 'information_schema' THEN '{{ _( 'ANSI' ) }} (information_schema)' + ELSE {{ schema_col_name }} + END +{%- endmacro %} {% macro DB_SUPPORT(tbl) -%} CASE WHEN {{ tbl }}.nspname = ANY('{information_schema}') THEN false ELSE true END {%- endmacro %} +{% macro DB_SUPPORT_SCHEMACOL(schema_col_name) -%} + CASE + WHEN {{ schema_col_name }} = ANY('{information_schema}') + THEN false + ELSE true END +{%- endmacro %} + diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql index 37fb594ed..b9fc276ef 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql @@ -13,6 +13,9 @@ (SELECT 1 FROM pg_proc WHERE pronamespace = {{ tbl }}.oid and proname = 'run_job' LIMIT 1)) {%- endmacro %} +{% macro IS_CATALOG_SCHEMA(schema_col_name) -%} + {{ schema_col_name }} IN ('pg_catalog', 'pgagent', 'information_schema', 'dbo', 'sys', 'dbms_job_procedure') +{%- endmacro %} {% macro LABELS(tbl, _) -%} CASE {{ tbl }}.nspname WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' @@ -23,9 +26,25 @@ ELSE {{ tbl }}.nspname END AS name {%- endmacro %} -{% macro DB_SUPPORT(tbl) -%} +{% macro LABELS_SCHEMACOL(schema_col_name, _) -%} + CASE {{ schema_col_name }} + WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' + WHEN 'pgagent' THEN '{{ _( 'pgAgent Job Scheduler' ) }} (pgagent)' + WHEN 'information_schema' THEN '{{ _( 'ANSI' ) }} (information_schema)' + WHEN 'dbo' THEN 'Redmond (dbo)' + WHEN 'sys' THEN 'Redwood (sys)' + ELSE {{ schema_col_name }} + END +{%- endmacro %} +{% macro DB_SUPPORT(tbl, schema_col_name) -%} CASE WHEN {{ tbl }}.nspname = ANY('{information_schema,sys,dbo}') THEN false ELSE true END {%- endmacro %} +{% macro DB_SUPPORT_SCHEMACOL(schema_col_name) -%} + CASE + WHEN {{ schema_col_name }} = ANY('{information_schema,sys,dbo}') + THEN false + ELSE true END +{%- endmacro %} diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js index 47500caf7..c7bb247ec 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js +++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js @@ -18,6 +18,7 @@ define('pgadmin.node.role', [ pgAdmin.Browser.Nodes['coll-role'] = pgAdmin.Browser.Collection.extend({ node: 'role', + label: gettext('Login/Group Roles'), type: 'coll-role', columns: [ 'rolname', 'rolvaliduntil', 'rolconnlimit', 'rolcanlogin', diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js index 2ec4fe1b5..a3c9ad96e 100644 --- a/web/pgadmin/browser/static/js/collection.js +++ b/web/pgadmin/browser/static/js/collection.js @@ -51,14 +51,23 @@ define([ }]); // show query tool only in context menu of supported nodes. - if (pgAdmin.DataGrid && pgAdmin.unsupported_nodes) { - if (_.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) { + + if (pgAdmin.unsupported_nodes && _.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) { + if ((this.type == 'database' && this.allowConn) || this.type != 'database') { pgAdmin.Browser.add_menus([{ - name: 'show_query_tool', node: this.type, module: this, + name: 'show_query_tool', node: this.type, module: pgAdmin.DataGrid, applies: ['context'], callback: 'show_query_tool', priority: 998, label: gettext('Query Tool...'), icon: 'pg-font-icon icon-query-tool', }]); + + // show search objects same as query tool + pgAdmin.Browser.add_menus([{ + name: 'search_objects', node: this.type, module: pgAdmin.SearchObjects, + applies: ['context'], callback: 'show_search_objects', + priority: 997, label: gettext('Search Objects...'), + icon: 'fa fa-search', + }]); } } }, diff --git a/web/pgadmin/browser/static/js/keyboard.js b/web/pgadmin/browser/static/js/keyboard.js index 5cd00e6a3..8705e14be 100644 --- a/web/pgadmin/browser/static/js/keyboard.js +++ b/web/pgadmin/browser/static/js/keyboard.js @@ -34,6 +34,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'tabbed_panel_forward': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'tabbed_panel_forward').value), 'sub_menu_query_tool': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_query_tool').value), 'sub_menu_view_data': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_view_data').value), + 'sub_menu_search_objects': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_search_objects').value), 'sub_menu_properties': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_properties').value), 'sub_menu_create': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_create').value), 'sub_menu_delete': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_delete').value), @@ -55,6 +56,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'bindLeftTree': {'shortcuts': this.keyboardShortcut.left_tree_shortcut}, // Main menu, 'bindSubMenuQueryTool': {'shortcuts': this.keyboardShortcut.sub_menu_query_tool}, // Sub menu - Open Query Tool, 'bindSubMenuViewData': {'shortcuts': this.keyboardShortcut.sub_menu_view_data}, // Sub menu - Open View Data, + 'bindSubMenuSearchObjects': {'shortcuts': this.keyboardShortcut.sub_menu_search_objects}, // Sub menu - Open search objects, 'bindSubMenuProperties': {'shortcuts': this.keyboardShortcut.sub_menu_properties}, // Sub menu - Edit Properties, 'bindSubMenuCreate': {'shortcuts': this.keyboardShortcut.sub_menu_create}, // Sub menu - Create Object, 'bindSubMenuDelete': {'shortcuts': this.keyboardShortcut.sub_menu_delete}, // Sub menu - Delete object, @@ -261,6 +263,15 @@ _.extend(pgBrowser.keyboardNavigation, { // Call data grid method to render view data pgAdmin.DataGrid.show_data_grid({'mnuid': 1}, tree.i); }, + bindSubMenuSearchObjects: function() { + const tree = this.getTreeDetails(); + + if (!tree.d) + return; + + // Call data grid method to render view data + pgAdmin.SearchObjects.show_search_objects('', tree.i); + }, bindSubMenuProperties: function() { const tree = this.getTreeDetails(); diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js index 029a29817..9ee0b4bf5 100644 --- a/web/pgadmin/browser/static/js/node.js +++ b/web/pgadmin/browser/static/js/node.js @@ -177,6 +177,14 @@ define('pgadmin.browser.node', [ // Show query tool only in context menu of supported nodes. if (_.indexOf(pgAdmin.unsupported_nodes, self.type) == -1) { + let enable = function(itemData) { + if (itemData._type == 'database' && itemData.allowConn) + return true; + else if (itemData._type != 'database') + return true; + else + return false; + }; pgAdmin.Browser.add_menus([{ name: 'show_query_tool', node: self.type, @@ -186,14 +194,15 @@ define('pgadmin.browser.node', [ priority: 998, label: gettext('Query Tool...'), icon: 'pg-font-icon icon-query-tool', - enable: function(itemData) { - if (itemData._type == 'database' && itemData.allowConn) - return true; - else if (itemData._type != 'database') - return true; - else - return false; - }, + enable: enable, + }]); + + // show search objects same as query tool + pgAdmin.Browser.add_menus([{ + name: 'search_objects', node: self.type, module: pgAdmin.SearchObjects, + applies: ['context'], callback: 'show_search_objects', + priority: 997, label: gettext('Search Objects...'), + icon: 'fa fa-search', enable: enable, }]); } diff --git a/web/pgadmin/browser/static/js/toolbar.js b/web/pgadmin/browser/static/js/toolbar.js index 955fe6f32..6eb1f39f4 100644 --- a/web/pgadmin/browser/static/js/toolbar.js +++ b/web/pgadmin/browser/static/js/toolbar.js @@ -46,6 +46,16 @@ let _defaultToolBarButtons = [ parentClass: 'pg-toolbar-btn btn-secondary', enabled: false, }, + { + label: gettext('Search objects'), + ariaLabel: gettext('Search objects'), + btnClass: 'fa fa-search', + text: '', + toggled: false, + toggleClass: '', + parentClass: 'pg-toolbar-btn btn-secondary', + enabled: false, + }, ]; // Place holder for non default tool bar buttons. @@ -92,6 +102,8 @@ export function initializeToolbar(panel, wcDocker) { pgAdmin.DataGrid.show_data_grid({mnuid: 3}, pgAdmin.Browser.tree.selected()); else if ('name' in data && data.name === gettext('Filtered Rows')) pgAdmin.DataGrid.show_filtered_row({mnuid: 4}, pgAdmin.Browser.tree.selected()); + else if ('name' in data && data.name === gettext('Search objects')) + pgAdmin.SearchObjects.show_search_objects('', pgAdmin.Browser.tree.selected()); }); } diff --git a/web/pgadmin/browser/templates/browser/index.html b/web/pgadmin/browser/templates/browser/index.html index 682c23d65..67a10ba89 100644 --- a/web/pgadmin/browser/templates/browser/index.html +++ b/web/pgadmin/browser/templates/browser/index.html @@ -11,7 +11,7 @@ {% block init_script %} try { require( -['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes'], +['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes', 'sources/generated/slickgrid'], function() { }, function() { diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js index 4b0ab410b..96ad3c330 100644 --- a/web/pgadmin/static/bundle/slickgrid.js +++ b/web/pgadmin/static/bundle/slickgrid.js @@ -8,7 +8,6 @@ ////////////////////////////////////////////////////////////// import 'slickgrid/lib/jquery.event.drag-2.3.0'; -import 'slickgrid/lib/jquery-ui-1.11.3'; import 'slickgrid/slick.core'; import 'slickgrid/slick.grid'; import 'slickgrid/slick.dataview'; @@ -21,5 +20,6 @@ import 'slickgrid/plugins/slick.cellrangeselector'; import 'slickgrid/plugins/slick.checkboxselectcolumn'; import 'slickgrid/plugins/slick.rowselectionmodel'; import 'sources/slickgrid/custom_header_buttons'; +import 'sources/slickgrid/plugins/slick.autocolumnsize'; export default window.Slick; diff --git a/web/pgadmin/static/css/style.css b/web/pgadmin/static/css/style.css index 6c0f84460..55e477ee1 100644 --- a/web/pgadmin/static/css/style.css +++ b/web/pgadmin/static/css/style.css @@ -5,19 +5,18 @@ @import '~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css'; @import '~bootstrap4-toggle/css/bootstrap4-toggle.css'; @import '~backgrid-filter/backgrid-filter.css'; -@import '~slickgrid/css/select2.css'; @import '~jquery-contextmenu/dist/jquery.contextMenu.css'; @import '~webcabin-docker/Build/wcDocker.css'; @import '~acitree/css/aciTree.css'; @import '~spectrum-colorpicker/spectrum.css'; @import '~leaflet/dist/leaflet.css'; +@import '../../../node_modules/select2/dist/css/select2.css'; @import '~codemirror/lib/codemirror.css'; @import '~codemirror/addon/dialog/dialog.css'; @import '~codemirror/addon/scroll/simplescrollbars.css'; @import '~slickgrid/slick.grid.css'; -@import '~slickgrid/slick-default-theme.css'; @import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css'; @import '../vendor/backgrid/backgrid.css'; diff --git a/web/pgadmin/static/js/alertify.pgadmin.defaults.js b/web/pgadmin/static/js/alertify.pgadmin.defaults.js index 84dfc12fe..daa60f696 100644 --- a/web/pgadmin/static/js/alertify.pgadmin.defaults.js +++ b/web/pgadmin/static/js/alertify.pgadmin.defaults.js @@ -271,7 +271,8 @@ define([ let container = $(self.elements.footer); commonUtils.findAndSetFocus(container.find('button:not([disabled]):last')); } - }); }); + }); + }); this.set('onresize', alertifyDialogStartResizing.bind(this, true)); this.set('onresized', alertifyDialogResized.bind(this, true)); this.set('onmaximized', alertifyDialogResized); diff --git a/web/pgadmin/static/js/alertify/dialog.js b/web/pgadmin/static/js/alertify/dialog.js index 6f4933720..8e5bdb738 100644 --- a/web/pgadmin/static/js/alertify/dialog.js +++ b/web/pgadmin/static/js/alertify/dialog.js @@ -80,6 +80,39 @@ export class Dialog { return serverInformation; } + retrieveAncestorOfTypeDatabase(item) { + let databaseInfo = null; + let aciTreeItem = item || this.pgBrowser.treeMenu.selected(); + let treeNode = this.pgBrowser.treeMenu.findNodeByDomElement(aciTreeItem); + + if (treeNode) { + if(treeNode.getData()._type === 'database') { + databaseInfo = treeNode.getData(); + } else { + let nodeData = null; + treeNode.ancestorNode( + (node) => { + nodeData = node.getData(); + if(nodeData._type === 'database') { + databaseInfo = nodeData; + return true; + } + return false; + } + ); + } + } + + if (databaseInfo === null) { + this.alertify.alert( + gettext(this.errorAlertTitle), + gettext('Please select a database or its child node from the browser.') + ); + } + + return databaseInfo; + } + hasBinariesConfiguration(serverInformation) { const module = 'paths'; let preference_name = 'pg_bin_dir'; diff --git a/web/pgadmin/static/js/alertify/dialog_factory.js b/web/pgadmin/static/js/alertify/dialog_factory.js index cb0ae1552..760fde679 100644 --- a/web/pgadmin/static/js/alertify/dialog_factory.js +++ b/web/pgadmin/static/js/alertify/dialog_factory.js @@ -9,6 +9,7 @@ import * as BackupDialog from '../../../tools/backup/static/js/backup_dialog_wrapper'; import {RestoreDialogWrapper} from '../../../tools/restore/static/js/restore_dialog_wrapper'; +import SearchObjectsDialogWrapper from '../../../tools/search_objects/static/js/search_objects_dialog_wrapper'; export class DialogFactory { constructor(pgBrowser, $, @@ -25,6 +26,8 @@ export class DialogFactory { create(dialogTitle, typeOfDialog) { if (typeOfDialog === 'restore') { return this.createRestoreDialog(dialogTitle, typeOfDialog); + } else if (typeOfDialog === 'search_objects') { + return this.createSearchObjectsDialog(dialogTitle, typeOfDialog); } else { return this.createBackupDialog(dialogTitle, typeOfDialog); } @@ -49,4 +52,14 @@ export class DialogFactory { this.dialogModel, this.backform); } + + createSearchObjectsDialog(dialogTitle, typeOfDialog) { + return new SearchObjectsDialogWrapper( + this.dialogContainerSelector, dialogTitle, typeOfDialog, + this.jquery, + this.pgBrowser, + this.alertify, + this.dialogModel, + this.backform); + } } diff --git a/web/pgadmin/static/js/alertify/dialog_wrapper.js b/web/pgadmin/static/js/alertify/dialog_wrapper.js index e4c275f3a..32d9a7a0b 100644 --- a/web/pgadmin/static/js/alertify/dialog_wrapper.js +++ b/web/pgadmin/static/js/alertify/dialog_wrapper.js @@ -58,7 +58,11 @@ export class DialogWrapper { let backform_tab = $(alertifyDialog.elements.body).find('.backform-tab'); backform_tab.attr('tabindex', -1); this.pgBrowser.keyboardNavigation.getDialogTabNavigator($(alertifyDialog.elements.dialog)); - const container = backform_tab.find('.tab-content:first > .tab-pane.active:first'); + let container = backform_tab.find('.tab-content:first > .tab-pane.active:first'); + + if(container.length === 0 && alertifyDialog.elements.content.innerHTML) { + container = $(alertifyDialog.elements.content); + } commonUtils.findAndSetFocus(container); } diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js b/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js index 40e537e1b..85b339139 100644 --- a/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js +++ b/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js @@ -98,7 +98,7 @@ function getTemplateWidth(rowEl, template) { var cell = $(rowEl.find('.slick-cell')); cell.append(template); - $(cell).find('*').css('position', 'relative'); + cell.find('*').css('position', 'relative'); return cell.outerWidth() + 1; } @@ -128,7 +128,7 @@ 'text-overflow': 'initial', 'white-space': 'nowrap', }); - var gridCanvas = $container.find('.grid-canvas'); + var gridCanvas = $container.find('.grid-canvas').first(); $(gridCanvas).append(rowEl); return rowEl; } diff --git a/web/pgadmin/static/js/tree/tree.js b/web/pgadmin/static/js/tree/tree.js index 57b6207c8..984d247d3 100644 --- a/web/pgadmin/static/js/tree/tree.js +++ b/web/pgadmin/static/js/tree/tree.js @@ -50,17 +50,50 @@ export class TreeNode { } reload(tree) { - this.unload(tree); - tree.aciTreeApi.setInode(this.domNode); - tree.aciTreeApi.deselect(this.domNode); - setTimeout(() => { - tree.selectNode(this.domNode); - }, 0); + return new Promise((resolve)=>{ + this.unload(tree) + .then(()=>{ + tree.aciTreeApi.setInode(this.domNode); + tree.aciTreeApi.deselect(this.domNode); + setTimeout(() => { + tree.selectNode(this.domNode); + }, 0); + resolve(); + }); + }); } unload(tree) { - this.children = []; - tree.aciTreeApi.unload(this.domNode); + return new Promise((resolve, reject)=>{ + this.children = []; + tree.aciTreeApi.unload(this.domNode, { + success: ()=>{ + resolve(true); + }, + fail: ()=>{ + reject(); + }, + }); + }); + } + + open(tree, suppressNoDom) { + return new Promise((resolve, reject)=>{ + if(suppressNoDom && (this.domNode == null || typeof(this.domNode) === 'undefined')) { + resolve(true); + } else if(tree.aciTreeApi.isOpen(this.domNode)) { + resolve(true); + } else { + tree.aciTreeApi.open(this.domNode, { + success: ()=>{ + resolve(true); + }, + fail: ()=>{ + reject(true); + }, + }); + } + }); } /* @@ -202,6 +235,47 @@ export class Tree { return findInTree(this.rootNode, path.join('.')); } + findNodeWithToggle(path) { + let tree = this; + path = path.join('.'); + + let onCorrectPath = function(matchPath) { + return (matchPath !== undefined && path !== undefined + && (path.startsWith(matchPath + '.') || path === matchPath)); + }; + + return (function findInNode(currentNode) { + return new Promise((resolve, reject)=>{ + if (path === null || path === undefined || path.length === 0) { + resolve(null); + } + /* No point in checking the children if + * the path for currentNode itself is not matching + */ + if (currentNode.path !== undefined && !onCorrectPath(currentNode.path)) { + reject(null); + } else if (currentNode.path === path) { + resolve(currentNode); + } else { + currentNode.open(tree, true) + .then(()=>{ + for (let i = 0, length = currentNode.children.length; i < length; i++) { + let childNode = currentNode.children[i]; + if(onCorrectPath(childNode.path)) { + resolve(findInNode(childNode)); + return; + } + } + reject(null); + }) + .catch(()=>{ + reject(null); + }); + } + }); + })(this.rootNode); + } + findNodeByDomElement(domElement) { const path = this.translateTreeNodeIdFromACITree(domElement); if(!path || !path[0]) { @@ -215,8 +289,19 @@ export class Tree { return this.aciTreeApi.selected(); } - selectNode(aciTreeIdentifier) { + /* scrollIntoView will scroll only to top and bottom + * Logic can be added for scroll to middle + */ + scrollTo(domElement) { + domElement.scrollIntoView(); + } + + selectNode(aciTreeIdentifier, scrollOnSelect) { this.aciTreeApi.select(aciTreeIdentifier); + + if(scrollOnSelect) { + this.scrollTo(aciTreeIdentifier[0]); + } } createOrUpdateNode(id, data, parent, domNode) { @@ -227,6 +312,7 @@ export class Tree { const oldNode = this.findNode(oldNodePath); if (oldNode !== null) { oldNode.data = data; + oldNode.domNode = domNode; return oldNode; } @@ -238,6 +324,18 @@ export class Tree { return node; } + unloadNode(id, data, domNode, parentPath) { + let oldNodePath = [id]; + const parent = this.findNode(parentPath); + if(parent !== null && parent !== undefined) { + oldNodePath = [parent.path, id]; + } + const oldNode = this.findNode(oldNodePath); + if(oldNode) { + oldNode.children = []; + } + } + /** * Given the JQuery object that contains the ACI Tree * this method is responsible for registering this tree class @@ -252,16 +350,20 @@ export class Tree { $treeJQuery.on('acitree', function (event, api, item, eventName) { if (api.isItem(item)) { /* If the id of node is changed, the path should also be changed */ - if (eventName === 'added' || eventName === 'idset') { + if (['added', 'idset', 'beforeunload'].indexOf(eventName) != -1) { const id = api.getId(item); const data = api.itemData(item); + const parentId = this.translateTreeNodeIdFromACITree(api.parent(item)); - if(eventName === 'added') { - this.prepareDraggable(data, item); - } + if(eventName === 'beforeunload') { + this.unloadNode(id, data, item, parentId); + } else { + if(eventName === 'added') { + this.prepareDraggable(data, item); + } - const parentId = this.translateTreeNodeIdFromACITree(api.parent(item)); - this.addNewNode(id, data, item, parentId); + this.addNewNode(id, data, item, parentId); + } if(data.errmsg) { Alertify.error(data.errmsg); } diff --git a/web/pgadmin/static/js/utils.js b/web/pgadmin/static/js/utils.js index 86dae698e..7bdddba85 100644 --- a/web/pgadmin/static/js/utils.js +++ b/web/pgadmin/static/js/utils.js @@ -32,11 +32,12 @@ export function findAndSetFocus(container) { * browser. For eg, in safari focus() works only when element has * tabindex="0", whereas in Chrome it works in any case */ + if (first_el.length == 0) { first_el = container .find(` - .pgadmin-controls:first input:enabled, .pgadmin-controls:first .btn:not(.toggle), + .pgadmin-controls:first, .ajs-commands:first, .CodeMirror-scroll`) .find('*[tabindex]:not([tabindex="-1"])'); diff --git a/web/pgadmin/static/scss/_alert.scss b/web/pgadmin/static/scss/_alert.scss index 3f2e561e3..0e7e234d1 100644 --- a/web/pgadmin/static/scss/_alert.scss +++ b/web/pgadmin/static/scss/_alert.scss @@ -119,21 +119,18 @@ } .success-in-footer { - border-radius: 5px; - border: 1px solid transparent; - - .alert-text { - border-color: $color-success-light; - } + border-radius: $border-radius; + border: 1px solid $color-success-light; + background: $color-success-light; } .info-in-footer { + border-radius: $border-radius; border: 1px solid $color-primary; - border-radius: 4px; - height: 35px; + background: $color-primary-light; - .alert-text { - border: none; + .fa { + font-size: 1rem; } } } diff --git a/web/pgadmin/static/scss/_webcabin.pgadmin.scss b/web/pgadmin/static/scss/_webcabin.pgadmin.scss index 4846a8031..ca806785a 100644 --- a/web/pgadmin/static/scss/_webcabin.pgadmin.scss +++ b/web/pgadmin/static/scss/_webcabin.pgadmin.scss @@ -166,7 +166,7 @@ .wcTabIcon { background-position: center; - padding: 0px 10px; + padding: 0rem 0.75rem; &.fa, &.pg-font-icon{ padding: 0rem 0.25rem 0rem 0rem diff --git a/web/pgadmin/tools/search_objects/__init__.py b/web/pgadmin/tools/search_objects/__init__.py new file mode 100644 index 000000000..e8bd59141 --- /dev/null +++ b/web/pgadmin/tools/search_objects/__init__.py @@ -0,0 +1,87 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +"""Implements Search Object feature""" + +from flask import request +from flask_babelex import gettext +from flask_security import login_required + +from pgadmin.utils import PgAdminModule +from pgadmin.utils.ajax import make_json_response, bad_request,\ + internal_server_error +from pgadmin.utils.preferences import Preferences +from pgadmin.tools.search_objects.utils import SearchObjectsHelper + +MODULE_NAME = 'search_objects' + + +class SearchObjectsModule(PgAdminModule): + LABEL = gettext('Search objects') + + def get_exposed_url_endpoints(self): + """ + Returns: + list: URL endpoints for search_object module + """ + return ['search_objects.search', 'search_objects.types'] + + def show_system_objects(self): + """ + return system preference objects + """ + return self.pref_show_system_objects.get() + + def register_preferences(self): + """ + Get show_system_objects preference + """ + browser_preference = Preferences.module('browser') + self.pref_show_system_objects =\ + browser_preference.preference('show_system_objects') + + +# Create blueprint for BackupModule class +blueprint = SearchObjectsModule( + MODULE_NAME, __name__, static_url_path='' +) + + [email protected]("/", endpoint='index') +@login_required +def index(): + return bad_request(errormsg=_("This URL cannot be called directly.")) + + [email protected]("types/<int:sid>/<int:did>", endpoint='types') +@login_required +def types(sid, did): + so_obj = SearchObjectsHelper(sid, did, blueprint.show_system_objects()) + return make_json_response(data=so_obj.get_supported_types()) + + [email protected]("search/<int:sid>/<int:did>", endpoint='search') +@login_required +def search(sid, did): + """ + URL args: + text <required>: search text + type <optional>: type of object to be searched. + """ + text = request.args.get('text', None) + obj_type = request.args.get('type', None) + + so_obj = SearchObjectsHelper(sid, did, blueprint.show_system_objects()) + + status, res = so_obj.search(text, obj_type) + + if not status: + return internal_server_error(errormsg=res) + + return make_json_response(data=res) diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects.js b/web/pgadmin/tools/search_objects/static/js/search_objects.js new file mode 100644 index 000000000..98a415e94 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects.js @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +define([ + 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin.alertifyjs', + 'sources/pgadmin', 'sources/csrf', 'pgadmin.browser.toolbar', + 'pgadmin.search_objects/search_objects_dialog', +], function( + gettext, url_for, $, _, alertify, pgAdmin, csrfToken, toolBar, SearchObjectsDialog +) { + + var pgBrowser = pgAdmin.Browser; + if (pgAdmin.SearchObjects) + return pgAdmin.SearchObjects; + + pgAdmin.SearchObjects = { + init: function() { + if (this.initialized) + return; + + this.initialized = true; + csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token); + + // Define the nodes on which the menus to be appear + var menus = [{ + name: 'search_objects', + module: this, + applies: ['tools'], + callback: 'show_search_objects', + enable: this.search_objects_enabled, + priority: 1, + label: gettext('Search objects'), + }, { + name: 'search_objects', + module: this, + applies: ['context'], + callback: 'show_search_objects', + enable: this.search_objects_enabled, + priority: 1, + label: gettext('Search objects'), + }]; + + pgBrowser.add_menus(menus); + return this; + }, + + search_objects_enabled: function(obj) { + /* Same as query tool */ + var isEnabled = (() => { + if (!_.isUndefined(obj) && !_.isNull(obj)) { + if (_.indexOf(pgAdmin.unsupported_nodes, obj._type) == -1) { + if (obj._type == 'database' && obj.allowConn) { + return true; + } else if (obj._type != 'database') { + return true; + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + })(); + + toolBar.enable(gettext('Search objects'), isEnabled); + return isEnabled; + }, + + // Callback to show the dialog + show_search_objects: function(action, item) { + let dialog = new SearchObjectsDialog.default( + pgBrowser, + $, + alertify, + {}, + ); + dialog.draw(action, item, {}, pgBrowser.stdW.md, pgBrowser.stdH.lg); + }, + }; + + return pgAdmin.SearchObjects; +}); diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js new file mode 100644 index 000000000..4482f7eb4 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import {Dialog} from 'sources/alertify/dialog'; +import {getPanelTitle} from 'tools/datagrid/static/js/datagrid_panel_title'; + +export default class SearchObjectsDialog extends Dialog { + constructor(pgBrowser, $, alertify, BackupModel, backform = null) { + super(gettext('Search Objects Error'), + '<div class=\'search_objects_dialog\'></div>', + pgBrowser, $, alertify, BackupModel, backform + ); + } + + dialogName() { + return 'search_objects'; + } + + draw(action, aciTreeItem, params, width=0, height=0) { + let dbInfo = this.retrieveAncestorOfTypeDatabase(aciTreeItem); + if (!dbInfo) { + return; + } + + let dialogTitle = getPanelTitle(this.pgBrowser, aciTreeItem); + dialogTitle = gettext('Search Objects - ') + dialogTitle; + const dialog = this.createOrGetDialog( + gettext('Search Objects...'), + 'search_objects' + ); + dialog(dialogTitle).resizeTo(width, height); + } +} diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js new file mode 100644 index 000000000..b7f4b81e4 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js @@ -0,0 +1,648 @@ +import {getTreeNodeHierarchyFromElement} from 'sources/tree/pgadmin_tree_node'; +import axios from 'axios/index'; +import gettext from 'sources/gettext'; +import url_for from 'sources/url_for'; +import 'select2'; +import {DialogWrapper} from 'sources/alertify/dialog_wrapper'; +import Slick from 'sources/../bundle/slickgrid'; +import pgAdmin from 'sources/pgadmin'; + + +export default class SearchObjectsDialogWrapper extends DialogWrapper { + constructor(dialogContainerSelector, dialogTitle, typeOfDialog, + jquery, pgBrowser, alertify, dialogModel, backform) { + super(dialogContainerSelector, dialogTitle, jquery, + pgBrowser, alertify, dialogModel, backform); + + this.grid = null; + this.dataview = null; + this.gridContainer = null; + } + + showMessage(text, is_error, call_after_show=()=>{}) { + if(text == '' || text == null) { + this.statusBar.classList.add('d-none'); + } else { + if(is_error) { + this.statusBar.innerHTML = ` + <div class="error-in-footer"> + <div class="d-flex px-2 py-1"> + <div class="pr-2"> + <i class="fa fa-exclamation-triangle text-danger" aria-hidden="true" role="img"></i> + </div> + <div role="alert" class="alert-text">${text}</div> + <div class="ml-auto close-error-bar"> + <a class="close-error fa fa-times text-danger"></a> + </div> + </div> + </div> + `; + + this.statusBar.querySelector('.close-error').addEventListener('click', ()=>{ + this.showMessage(null); + }); + } else { + this.statusBar.innerHTML = ` + <div class="info-in-footer"> + <div class="d-flex px-2 py-1"> + <div class="pr-2"> + <i class="fa fa-info-circle text-primary" aria-hidden="true"></i> + </div> + <div class="alert-text" role="alert">${text}</div> + </div> + </div> + `; + } + this.statusBar.classList.remove('d-none'); + call_after_show(this.statusBar); + } + } + + createDialogDOM(dialogContainer) { + dialogContainer.innerHTML = ` + <div class="d-flex flex-column w-100 h-100"> + <div class="p-2"> + <div class="row"> + <div class="col-8 d-flex"> + <div class="input-group pgadmin-controls"> + <div class="input-group-prepend"> + <span class="input-group-text fa fa-search" id="labelSearch" aria-label="` + gettext('Search') + `"></span> + </div> + <input type="search" class="form-control" id="txtGridSearch" placeholder="` + gettext('Type at least 3 characters') + `" + tabindex="0" aria-describedby="labelSearch" aria-labelledby="labelSearch" autocomplete="off"> + </div> + <div class="ml-2"> + <button class="btn btn-primary btn-search" disabled>`+ gettext('Search') +`</button> + </div> + </div> + <div class="col-4"> + <select aria-label="` + gettext('Object types') + `" class="node-types"></select> + </div> + </div> + </div> + <div class="search-result-container flex-grow-1"> + <div class="pg-sp-container d-none"> + <div class="pg-sp-content"> + <div class="row"><div class="col-12 pg-sp-icon"></div></div> + <div class="row"><div class="col-12 pg-sp-text"></div></div> + </div> + </div> + <div class="search-result"></div> + </div> + <div class='search-result-count p-1'> + </div> + <div class="pg-prop-status-bar"> + </div> + </div> + `; + + return dialogContainer; + } + + updateDimOfSearchResult() { + let dim = this.searchResultContainer.getBoundingClientRect(); + this.searchResult.style.height = dim.height + 'px'; + this.searchResult.style.width = dim.width + 'px'; + } + + setLoading(text) { + if(text != null) { + this.loader.classList.remove('d-none'); + this.loader.querySelector('.pg-sp-text').innerHTML = text; + } else { + this.loader.classList.add('d-none'); + } + } + + searchBtnEnabled(enabled) { + if(typeof(enabled) != 'undefined') { + this.searchBtn.disabled = !enabled; + } else { + return !this.searchBtn.disabled; + } + } + + searchBoxVal(val) { + if(typeof(val) != 'undefined') { + this.searchBox.value = val; + } else { + return this.searchBox.value.trim(); + } + } + + typesVal(val) { + if(typeof(val) != 'undefined') { + this.typesSelect.value = val; + } else { + return this.typesSelect.value; + } + } + + setTypes(data, enabled=true) { + this.jquery(this.typesSelect).empty().select2({ + data: data, + }); + + this.typesSelect.disabled = !enabled; + } + + setResultCount(count) { + if(count != 0 && !count) { + count = gettext('Unknown'); + } + this.searchResultCount.innerHTML = count + ' ' + gettext('matches found') + '.'; + } + + showOtherInfo(rowno) { + let rowData = this.dataview.getItem(rowno); + rowData.name += ` (${rowData.other_info})`; + rowData.other_info = null; + this.dataview.updateItem(rowData.id, rowData); + } + + setGridData(data) { + this.dataview.setItems(data); + } + + prepareGrid() { + this.dataview = new Slick.Data.DataView(); + + this.dataview.getItemMetadata = (row)=>{ + let rowData = this.dataview.getItem(row); + if(!rowData.show_node){ + return { + cssClasses: 'object-muted', + }; + } + return null; + }; + + this.dataview.setFilter((item, args)=>{ + return !(args && args.type != 'all' && item.type != args.type); + }); + + /* jquery required for select2 */ + this.jquery(this.typesSelect).on('change', ()=>{ + this.dataview.setFilterArgs({ type: this.typesVal() }); + this.dataview.refresh(); + }); + + this.dataview.onRowCountChanged.subscribe((e, args) => { + this.grid.updateRowCount(); + this.grid.render(); + this.setResultCount(args.current); + }); + + this.dataview.onRowsChanged.subscribe((e, args) => { + this.grid.invalidateRows(args.rows); + this.grid.render(); + }); + + this.grid = new Slick.Grid( + this.searchResult, + this.dataview, + [ + { id: 'name', name: gettext('Object name'), field: 'name', sortable: true, + formatter: (row, cell, value, columnDef, dataContext) => { + let ret_el = `<i class='wcTabIcon ${dataContext.icon}'></i>${value}`; + + if(dataContext.other_info != null && dataContext.other_info != '') { + ret_el += ' <span class="object-other-info">(...)</span>'; + } + + return ret_el; + }, + width: 50, + }, + { id: 'type', name: gettext('Type'), field: 'type_label', sortable: true, width: 35 }, + { id: 'path', name: gettext('Browser path'), field: 'path', sortable: false }, + ], + { + enableCellNavigation: true, + enableColumnReorder: false, + multiColumnSort: true, + explicitInitialization: true, + } + ); + + this.grid.registerPlugin(new Slick.AutoColumnSize()); + + this.grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: true})); + + this.grid.onKeyDown.subscribe((event) => { + let activeRow = this.grid.getActiveCell(); + if(activeRow && !event.ctrlKey && !event.altKey && !event.metaKey && event.keyCode == 9) { + event.preventDefault(); + event.stopImmediatePropagation(); + + if(event.shiftKey) { + this.prevToGrid.focus(); + } else { + this.nextToGrid.focus(); + } + } + }); + + this.grid.onClick.subscribe((event, args) => { + if(event.target.classList.contains('object-other-info')) { + this.showOtherInfo(args.row); + } + }); + + this.grid.onDblClick.subscribe((event, args) => { + let rowData = this.dataview.getItem(args.row); + let treeMenu = this.pgBrowser.treeMenu; + + if(!rowData.show_node) { + this.showMessage( + gettext('%s objects are disabled in the browser.', rowData.type_label) + ' ' + + gettext('You can enable them in the') + ' <a class="pref-dialog-link">' + gettext('preferences dialog') + '</a>.', + true, + (statusBar)=>{ + statusBar.querySelector('.pref-dialog-link').addEventListener('click', ()=>{ + if(pgAdmin.Preferences) { + pgAdmin.Preferences.show(); + } + }); + } + ); + return false; + } + this.showMessage(gettext('Locating...')); + treeMenu.findNodeWithToggle(rowData.id_path) + .then((treeItem)=>{ + treeMenu.selectNode(treeItem.domNode, true); + this.showMessage(null); + }) + .catch((args)=>{ + this.showMessage(gettext('Unable to locate this object in the browser.'), true); + console.warn(args); + }); + }); + + this.grid.onSort.subscribe((event, args) => { + let cols = args.sortCols; + + this.dataview.sort(function (dataRow1, dataRow2) { + for (var i = 0, l = cols.length; i < l; i++) { + var field = cols[i].sortCol.field; + var sign = cols[i].sortAsc ? 1 : -1; + var value1 = dataRow1[field], value2 = dataRow2[field]; + var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign; + if (result != 0) { + return result; + } + } + return false; + }, true); + }); + } + + onDialogResize() { + this.updateDimOfSearchResult(); + + if(this.grid) { + this.grid.resizeCanvas(); + this.grid.autosizeColumns(); + } + } + + onDialogShow() { + this.focusOnDialog(this); + + setTimeout(()=>{ + if(!this.grid) { + this.prepareGrid(); + } + this.updateDimOfSearchResult(); + this.grid.init(); + this.setGridData([]); + this.onDialogResize(); + }, 500); + } + + getBaseUrl(endpoint) { + return url_for('search_objects.'+endpoint, { + sid: this.treeInfo.server._id, + did: this.treeInfo.database._id, + }); + } + + getCollNode(node_type) { + if('coll-'+node_type in this.pgBrowser.Nodes) { + return this.pgBrowser.Nodes['coll-'+node_type]; + } else if(node_type in this.pgBrowser.Nodes && + typeof(this.pgBrowser.Nodes[node_type].collection_type) === 'string') { + return this.pgBrowser.Nodes[this.pgBrowser.Nodes[node_type].collection_type]; + } + + return null; + } + + getSelectedNode() { + const tree = this.pgBrowser.treeMenu; + const selectedNode = tree.selected(); + if (selectedNode) { + return tree.findNodeByDomElement(selectedNode); + } else { + return undefined; + } + } + + finaliseData(datum) { + datum.icon = 'icon-' + datum.type; + /* finalise path */ + [datum.path, datum.id_path] = this.translateSearchObjectsPath(datum.path, datum.catalog_level); + /* id is required by slickgrid dataview */ + datum.id = datum.id_path; + return datum; + } + + /* This function will translate the path given by search objects API into two parts + * 1. The display path on the UI + * 2. The tree search path to locate the object on the tree. + * + * Sample path returned by search objects API + * :schema.11:/pg_catalog/:table.2604:/pg_attrdef + * + * Sample path required by tree locator + * Normal object - server_group/1.server/3.coll-database/3.database/13258.coll-schema/13258.schema/2200.coll-table/2200.table/41773 + * pg_catalog schema - server_group/1.server/3.coll-database/3.database/13258.coll-catalog/13258.catalog/11.coll-table/11.table/2600 + * Information Schema, dbo, sys - server_group/1.server/3.coll-database/3.database/13258.coll-catalog/13258.catalog/12967.coll-catalog_object/12967.catalog_object/13204 + * + * Column catalog_level has values as + * N - Not a catalog schema + * D - Catalog schema with DB support - pg_catalog + * O - Catalog schema with object support only - info schema, dbo, sys + */ + translateSearchObjectsPath(path, catalog_level) { + if (path === null) { + return path; + } + + catalog_level = catalog_level || 'N'; + + /* path required by tree locator */ + /* the path received from the backend is after the DB node, initial path setup */ + let id_path = [ + this.treeInfo.server_group.id, + this.treeInfo.server.id, + this.getCollNode('database').type + '/' + this.treeInfo.server._id, + this.treeInfo.database.id, + ]; + + let prev_node_id = this.treeInfo.database._id; + + /* add the slash to match regex, remove it from display path later */ + path = '/' + path; + /* the below regex will match all /:server_group.1:/ */ + let new_path = path.replace(/\/:[a-zA-Z_]+\.[0-9]+:\//g, (token)=>{ + let orig_token = token; + /* remove the slash and colon */ + token = token.slice(2, -2); + let [node_type, node_oid, others] = token.split('.'); + if(typeof(others) !== 'undefined') { + return token; + } + + /* schema type is "catalog" for catalog schemas */ + node_type = (['D', 'O'].indexOf(catalog_level) != -1 && node_type == 'schema') ? 'catalog' : node_type; + + /* catalog like info schema will only have views and tables AKA catalog_object except for pg_catalog */ + node_type = (catalog_level === 'O' && ['view', 'table'].indexOf(node_type) != -1) ? 'catalog_object' : node_type; + + /* If collection node present then add it */ + let coll_node = this.getCollNode(node_type); + if(coll_node) { + /* Add coll node to the path */ + if(prev_node_id != null) id_path.push(`${coll_node.type}/${prev_node_id}`); + + /* Add the node to the path */ + id_path.push(`${node_type}/${node_oid}`); + + /* This will be needed for coll node */ + prev_node_id = node_oid; + + /* This will be displayed in the grid */ + return `/${coll_node.label}/`; + } else if(node_type in this.pgBrowser.Nodes) { + /* Add the node to the path */ + id_path.push(`${node_type}/${node_oid}`); + + /* This will be need for coll node id path */ + prev_node_id = node_oid; + + /* Remove the token and replace with slash. This will be displayed in the grid */ + return '/'; + } + prev_node_id = null; + return orig_token; + }); + + /* Remove the slash we had added */ + new_path = new_path.substring(1); + return [new_path, id_path]; + } + + prepareDialog() { + this.showMessage(null); + this.setResultCount(0); + if(this.grid) { + this.grid.destroy(); + this.grid = null; + } + + /* Load types */ + this.setTypes([{ + id: -1, + text: gettext('Loading...'), + value: null, + }], false); + + axios.get( + this.getBaseUrl('types') + ).then((res)=>{ + let types = [{ + id: 'all', + text: 'All types', + }]; + + for (const key of Object.keys(res.data.data).sort()) { + types.push({ + id: key, + text: res.data.data[key], + }); + } + this.setTypes(types); + }).catch(()=>{ + this.setTypes([{ + id: -1, + text: gettext('Failed'), + value: null, + }], false); + }); + } + + main(title) { + this.set('title', title); + } + + setup() { + return { + buttons: [{ + text: '', + key: 112, + className: 'btn btn-secondary pull-left fa fa-question pg-alertify-icon-button', + attrs: { + name: 'dialog_help', + type: 'button', + label: gettext('Help'), + 'aria-label': gettext('Help'), + url: url_for('help.static', { + 'filename': 'search_objects.html', + }), + }, + }, { + text: gettext('Close'), + key: 27, + className: 'btn btn-secondary fa fa-lg fa-times pg-alertify-button', + 'data-btn-name': 'cancel', + }], + // Set options for dialog + options: { + title: this.dialogTitle, + //disable both padding and overflow control. + padding: !1, + overflow: !1, + model: 0, + resizable: true, + maximizable: true, + pinnable: false, + closableByDimmer: false, + modal: false, + }, + }; + } + + build() { + let tmpEle = document.createElement('div'); + tmpEle.innerHTML = this.dialogContainerSelector; + let dialogContainer = tmpEle.firstChild; + + // Append the container + this.elements.content.innerHTML = ''; + this.elements.content.appendChild(dialogContainer); + + this.createDialogDOM(dialogContainer); + this.alertify.pgDialogBuild.apply(this); + + this.loader = dialogContainer.getElementsByClassName('pg-sp-container')[0]; + + this.searchBox = dialogContainer.querySelector('#txtGridSearch'); + this.searchBtn = dialogContainer.querySelector('.btn-search'); + this.typesSelect = dialogContainer.querySelector('.node-types'); + this.searchResultContainer = dialogContainer.querySelector('.search-result-container'); + this.searchResult = dialogContainer.querySelector('.search-result'); + this.searchResultCount = dialogContainer.querySelector('.search-result-count'); + this.statusBar = dialogContainer.querySelector('.pg-prop-status-bar'); + + /* These two values are required to come out of grid when tab is + * pressed in the grid. Slickgrid does not allow any way to come out + */ + this.nextToGrid = this.elements.footer.querySelector('.ajs-button'); + this.prevToGrid = this.typesSelect; + + /* init select2 */ + this.setTypes([{ + id: -1, + text: gettext('Loading...'), + value: null, + }], false); + + /* on search box change */ + this.searchBox.addEventListener('input', ()=>{ + if(this.searchBoxVal().length >= 3) { + this.searchBtnEnabled(true); + } else { + this.searchBtnEnabled(false); + } + }); + + /* on enter key press */ + this.searchBox.addEventListener('keypress', (e)=>{ + if(e.keyCode == 13) { + e.stopPropagation(); + if(this.searchBtnEnabled()) { + this.searchBtn.dispatchEvent(new Event('click')); + } + } + }); + + /* on search button click */ + this.searchBtn.addEventListener('click', ()=>{ + this.searchBtnEnabled(false); + this.setGridData([]); + this.showMessage(null); + + this.setLoading(gettext('Searching....')); + axios.get(this.getBaseUrl('search'), { + params: { + text: this.searchBoxVal(), + type: this.typesVal(), + }, + }).then((res)=>{ + let grid_data = res.data.data.map((row)=>{ + return this.finaliseData(row); + }); + + this.setGridData(grid_data); + }).catch((error)=>{ + let errmsg = ''; + + if (error.response) { + errmsg = error.response.statusText; + } else if (error.request) { + errmsg = gettext('No response received'); + } else { + errmsg = error.message; + } + this.showMessage(gettext('An unexpected occurred: %s', errmsg), true); + console.warn(error); + }).finally(()=>{ + this.setLoading(null); + this.searchBtnEnabled(true); + }); + }); + + this.set({ + 'onresized': this.onDialogResize.bind(this), + 'onmaximized': this.onDialogResize.bind(this), + 'onrestored': this.onDialogResize.bind(this), + 'onshow': this.onDialogShow.bind(this), + }); + } + + prepare() { + let selectedTreeNode = this.getSelectedNode(); + if (!this.getSelectedNodeData(selectedTreeNode)) { + return; + } + + this.treeInfo = getTreeNodeHierarchyFromElement(this.pgBrowser, selectedTreeNode); + this.prepareDialog(); + this.focusOnDialog(this); + } + + callback(event) { + if (this.wasHelpButtonPressed(event)) { + event.cancel = true; + this.pgBrowser.showHelp( + event.button.element.name, + event.button.element.getAttribute('url'), + null, + null, + ); + return; + } + } +} diff --git a/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss b/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss new file mode 100644 index 000000000..86f3eb8a7 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss @@ -0,0 +1,122 @@ +.search_objects_dialog { + height: 100%; + + .object-other-info { + &:hover { + font-weight: bold; + } + } + + .pref-dialog-link { + color: $color-fg !important; + text-decoration: underline !important; + cursor: pointer; + } + + .search-result-container { + width: 100%; + height: 100%; + min-height: 0; + } + + .node-types ~ .select2-container { + min-width: 100%; + } + + .search-result-count { + border-top: $panel-border; + } + + .ui-widget { + font-family: $font-family-primary; + font-size: $font-size-base; + + .slick-header.ui-state-default { + border: $table-border-width solid $table-border-color; + .slick-header-columns { + background: $table-bg; + color: $color-fg; + border-bottom: $panel-border; + + .slick-header-column-sorted { + font-style: unset; + } + + .ui-state-default { + background: $table-bg !important; + color: $color-fg !important; + padding: $table-header-cell-padding $table-cell-padding; + border-right: $table-border-width solid $table-border-color; + + .slick-column-name { + font-weight: bold; + } + + .slick-sort-indicator { + float: unset; + } + } + + .slick-header-sortable { + cursor: pointer !important; + + .slick-sort-indicator-asc { + background: none; + border-top: none; + border-right: 0.25rem solid transparent; + border-bottom: 0.25rem solid $color-fg; + border-left: 0.25rem solid transparent; + } + + .slick-sort-indicator-desc { + background: none; + border-top: 0.25rem solid $color-fg; + border-right: 0.25rem solid transparent; + border-bottom: none; + border-left: 0.25rem solid transparent; + } + } + } + } + .ui-widget-content { + color: $color-fg; + &.slick-row { + &.object-muted { + &.active, &.active:hover, &:hover, & { + .slick-cell { + color: $text-muted !important; + cursor: default !important; + } + } + } + + &.active, &.active:hover { + .slick-cell { + border-top: $table-border-width solid transparent !important; + background-color: $tree-bg-selected !important; + color: $tree-fg-selected !important; + } + } + + &:hover { + cursor: pointer; + .slick-cell { + border-top: $table-border-width solid transparent !important; + border-bottom: $table-border-width solid transparent !important; + background-color: $tree-bg-hover !important; + color: $tree-fg-hover !important; + cursor: pointer !important; + } + } + } + } + } + + + .pg-prop-status-bar { + position: absolute; + bottom: 0; + right: 0; + left: 0; + } +} diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql new file mode 100644 index 000000000..d00ca0d11 --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql @@ -0,0 +1,434 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + ELSE 'function' END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} ELSE {{ show_node_prefs['function'] }} END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p + left join pg_namespace n on p.pronamespace = n.oid + left join pg_type t on p.prorettype = t.oid + WHERE ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql new file mode 100644 index 000000000..5ec54956f --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql @@ -0,0 +1,451 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN p.prokind = 'p' THEN 'procedure' + ELSE 'function' + END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN ':trigger_function.' + WHEN p.prokind = 'p' THEN ':procedure.' + ELSE ':function.' + END || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} + WHEN p.prokind = 'p' THEN {{ show_node_prefs['procedure'] }} + ELSE {{ show_node_prefs['function'] }} + END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p join pg_namespace n + on p.pronamespace = n.oid join pg_type t + on p.prorettype = t.oid join pg_language lng + ON lng.oid=p.prolang + WHERE p.prokind IN ('f', 'w', 'p') + AND CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN lng.lanname NOT IN ('edbspl', 'sql', 'internal') + ELSE true + END + AND ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql new file mode 100644 index 000000000..b384b316d --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql @@ -0,0 +1,367 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['table', 'sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'r' THEN 'table' + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'r' THEN ':table.' + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'r' THEN {{ show_node_prefs['table'] }} + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('r','S','v','m') + {% elif obj_type == 'table' %} + WHERE c.relkind = 'r' + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + AND {{ CATALOGS.DB_SUPPORT('n') }} + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + AND {{ CATALOGS.DB_SUPPORT('n') }} + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + ELSE 'function' END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} ELSE {{ show_node_prefs['function'] }} END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p + left join pg_namespace n on p.pronamespace = n.oid + left join pg_type t on p.prorettype = t.oid + WHERE ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/:table.'|| t.oid || ':/'||t.relname|| + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server'::text AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping'::text AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table'::text AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension'::text AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation'::text AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql new file mode 100644 index 000000000..76d3f01ba --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql @@ -0,0 +1,494 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym' AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package' AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar' AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql new file mode 100644 index 000000000..82eb9cf6f --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql @@ -0,0 +1,515 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger', 'compound_trigger'] %} + select + CASE WHEN tr.tgpackageoid != 0 THEN 'compound_trigger' ELSE 'trigger' END::text AS obj_type, tr.tgname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || CASE WHEN tr.tgpackageoid != 0 THEN '/:compound_trigger.' ELSE '/:trigger.' END || tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + CASE WHEN tr.tgpackageoid != 0 THEN {{ show_node_prefs['compound_trigger'] }} ELSE {{ show_node_prefs['trigger'] }} END AS show_node, + NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} + {% if obj_type == 'compound_trigger' %} + AND tr.tgpackageoid != 0 + {% elif obj_type == 'trigger' %} + AND tr.tgpackageoid = 0 + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym' AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package' AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar' AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql new file mode 100644 index 000000000..7bb126e32 --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql @@ -0,0 +1,437 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['table', 'sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'r' THEN 'table' + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'r' THEN ':table.' + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'r' THEN {{ show_node_prefs['table'] }} + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('r','S','v','m') + {% elif obj_type == 'table' %} + WHERE c.relkind = 'r' + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/:table.'|| t.oid || ':/'||t.relname|| + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server'::text AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping'::text AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table'::text AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension'::text AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation'::text AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym'::text AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package'::text AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar'::text AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/tests/__init__.py b/web/pgadmin/tools/search_objects/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/web/pgadmin/tools/search_objects/tests/test_api_search.py b/web/pgadmin/tools/search_objects/tests/test_api_search.py new file mode 100644 index 000000000..3952006d2 --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_api_search.py @@ -0,0 +1,75 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from __future__ import print_function +import sys +import json + +from pgadmin.utils.route import BaseTestGenerator +from regression import parent_node_dict +from pgadmin.browser.server_groups.servers.databases.tests import utils as \ + database_utils +from regression.python_test_utils import test_utils as utils + +try: + from urllib import urlencode +except Exception as e: + from urllib.parse import urlencode + + +class SearchObjectsApiSearch(BaseTestGenerator): + """ This class will test search API of search objects. """ + scenarios = [ + ('Search with all types', dict(text='emp', type='all', singles=False)), + ('Search with None types', dict(text='emp', type=None, singles=False)), + ('Search for all single types', + dict(text='emp', type=None, singles=True)), + ] + + def runFor(self, text=None, type=None): + url_params = dict( + text=text + ) + if type is not None: + url_params['type'] = type + + url_params = urlencode(url_params) + response = self.tester.get(self.base_url + '?' + url_params) + + self.assertEquals(response.status_code, 200) + + def runTest(self): + database_info = parent_node_dict["database"][-1] + server_id = database_info["server_id"] + db_id = database_info["db_id"] + + db_con = database_utils.connect_database(self, + utils.SERVER_GROUP, + server_id, + db_id) + if not db_con["info"] == "Database connected.": + raise Exception("Could not connect to database to add the schema.") + + self.base_url = '/search_objects/search/' \ + + str(server_id) + '/' + str(db_id) + + if not self.singles: + self.runFor(text=self.text, type=self.type) + else: + # test for all the node types individually + types_url = '/search_objects/types/' +\ + str(server_id) + '/' + str(db_id) + response = self.tester.get(types_url) + self.assertEquals(response.status_code, 200) + types_data = json.loads(response.data.decode('utf-8'))['data'] + + for a_type in types_data: + print('Running search for type {0}'.format(a_type), + file=sys.stderr) + self.runFor(text=self.text, type=a_type) diff --git a/web/pgadmin/tools/search_objects/tests/test_api_types.py b/web/pgadmin/tools/search_objects/tests/test_api_types.py new file mode 100644 index 000000000..aed5571ad --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_api_types.py @@ -0,0 +1,47 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +import json +from pgadmin.utils.route import BaseTestGenerator +from regression import parent_node_dict +from pgadmin.browser.server_groups.servers.databases.tests import utils as \ + database_utils +from regression.python_test_utils import test_utils as utils + + +class SearchObjectsApiTypes(BaseTestGenerator): + """ This class will test types API of search objects. """ + scenarios = [ + # Fetching default URL for schema node. + ('Types API URL', dict(url='/search_objects/types')) + ] + + def runTest(self): + database_info = parent_node_dict["database"][-1] + server_id = database_info["server_id"] + + db_id = database_info["db_id"] + db_con = database_utils.connect_database(self, + utils.SERVER_GROUP, + server_id, + db_id) + if not db_con["info"] == "Database connected.": + raise Exception("Could not connect to database to add the schema.") + + url = self.url + '/' + str(server_id) + '/' + str(db_id) + response = self.tester.get(url) + self.assertEquals(response.status_code, 200) + + # repsonse data should be dict + response_data = json.loads(response.data.decode('utf-8'))['data'] + self.assertEquals(type(response_data), dict) + + # response data key values should not be None + for key, value in response_data.items(): + self.assertIsNotNone(value, 'Key {0} has value None'.format(key)) diff --git a/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py b/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py new file mode 100644 index 000000000..ec9c369b9 --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py @@ -0,0 +1,117 @@ +import sys + +from pgadmin.tools.search_objects.utils import SearchObjectsHelper, current_app +from pgadmin.utils.route import BaseTestGenerator + +if sys.version_info < (3, 3): + from mock import patch, MagicMock +else: + from unittest.mock import patch, MagicMock + + +class SearchObjectsHelperTest(BaseTestGenerator): + scenarios = [ + ('scenario', dict( + node_blueprints=[ + dict(node_type='table', coll_label='Tables', + backend_supported=True), + dict(node_type='view', coll_label='Views', + backend_supported=False), + dict(node_type='index', coll_label='Indexes', + backend_supported=True), + dict(node_type='role', coll_label='Roles', + backend_supported=True) + ], + all_node_types=['table', 'view', 'index'], + expected_show_node_prefs=dict(table=True, view=False, index=True), + expected_supported_types=dict(table='Tables', index='Indexes'), + expected_supported_types_skip=dict(table='Tables', view='Views', + index='Indexes'), + execute_dict_return_value=( + True, dict(rows=[ + dict(obj_name='name1', obj_type='table', + obj_path='some/path', show_node=True, + other_info=None, catalog_level='N'), + dict(obj_name='name2', obj_type='view', + obj_path='some1/path', show_node=True, + other_info=None, catalog_level='D'), + dict(obj_name='name3', obj_type='index', + obj_path='some2/path1', show_node=True, + other_info='oid', catalog_level='O'), + ])), + expected_search_op=( + True, [ + dict(name='name1', type='table', type_label='Tables', + path='some/path', + show_node=True, other_info=None, catalog_level='N'), + dict(name='name2', type='view', type_label='Views', + path='some1/path', + show_node=True, other_info=None, catalog_level='D'), + dict(name='name3', type='index', type_label='Indexes', + path='some2/path1', + show_node=True, other_info='oid', catalog_level='O'), + ] + ) + )) + ] + + def __create_manager(self): + connection = MagicMock( + execute_dict=MagicMock(), + db='somedb' + ) + connection.execute_dict.return_value = self.execute_dict_return_value + + def connection_function(did): + return connection + + return MagicMock( + connection=connection_function + ) + + @patch('pgadmin.tools.search_objects.utils.get_node_blueprint') + @patch('pgadmin.tools.search_objects.utils.get_driver') + def runTest(self, get_driver_mock, get_node_blueprint_mock): + manager = self.__create_manager() + + get_driver_mock.return_value = MagicMock( + connection_manager=lambda session_id: manager) + + def __get_node_blueprint_mock(node_type): + blueprints = self.node_blueprints + blueprint = None + for data in blueprints: + if node_type == data['node_type']: + blueprint = MagicMock( + BackendSupported=MagicMock( + return_value=data['backend_supported']), + collection_label=data['coll_label'], + show_node=data['backend_supported'], + ) + return blueprint + + get_node_blueprint_mock.side_effect = __get_node_blueprint_mock + + with self.app.app_context(): + + so_obj = SearchObjectsHelper(2, 18456, + node_types=self.all_node_types) + so_obj.get_sql = MagicMock(return_value='dummy query') + + # test template path + manager.server_type = 'pg' + manager.version = 906000 + self.assertEquals(so_obj.get_template_path(), + 'search_objects/sql/pg/#906000#') + + self.assertEquals(so_obj.get_show_node_prefs(), + self.expected_show_node_prefs) + + self.assertEquals(so_obj.get_supported_types(), + self.expected_supported_types) + + self.assertEquals(so_obj.get_supported_types(skip_check=True), + self.expected_supported_types_skip) + + self.assertEquals(so_obj.search('searchtext', 'all'), + self.expected_search_op) diff --git a/web/pgadmin/tools/search_objects/utils.py b/web/pgadmin/tools/search_objects/utils.py new file mode 100644 index 000000000..cf858d6e2 --- /dev/null +++ b/web/pgadmin/tools/search_objects/utils.py @@ -0,0 +1,131 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from flask import current_app, render_template +from flask_babelex import gettext + +from pgadmin.utils.driver import get_driver +from config import PG_DEFAULT_DRIVER + + +def get_node_blueprint(node_type): + blueprint = None + node_type = 'NODE-' + node_type + if node_type in current_app.blueprints: + blueprint = current_app.blueprints[node_type] + + return blueprint + + +class SearchObjectsHelper: + def __init__(self, sid, did, show_system_objects=False, node_types=None): + self.sid = sid + self.did = did + self.show_system_objects = show_system_objects + self.manager = get_driver( + PG_DEFAULT_DRIVER + ).connection_manager(sid) + + self._all_node_types = [ + 'cast', 'fts_dictionary', 'check_constraint', + 'exclusion_constraint', 'foreign_key', + 'primary_key', 'unique_constraint', 'constraints', 'trigger', + 'table', 'compound_trigger', 'rule', 'column', 'partition', + 'index', 'type', 'domain', 'domain_constraints', 'schema', + 'synonym', 'sequence', 'edbvar', 'edbfunc', 'edbproc', 'package', + 'foreign_table', 'fts_parser', 'function', 'procedure', + 'trigger_function', 'fts_template', 'collation', 'view', 'mview', + 'fts_configuration', 'extension', 'language', + 'event_trigger', 'foreign_server', 'user_mapping', + 'foreign_data_wrapper' + ] if node_types is None else node_types + + @property + def all_node_types(self): + return self._all_node_types + + def get_template_path(self): + return 'search_objects/sql/{0}/#{1}#'.format( + self.manager.server_type, self.manager.version) + + def get_show_node_prefs(self): + return_types = {} + for node_type in self.all_node_types: + blueprint = get_node_blueprint(node_type) + if blueprint is None: + continue + + return_types[node_type] = blueprint.show_node + return return_types + + def get_supported_types(self, skip_check=False): + return_types = {} + for node_type in self.all_node_types: + blueprint = get_node_blueprint(node_type) + if blueprint is None: + continue + + if blueprint.BackendSupported(self.manager, is_catalog=False, + did=self.did) or skip_check: + if node_type in ['edbfunc', 'edbproc']: + return_types[node_type] =\ + gettext('Package {0}').format( + blueprint.collection_label) + else: + return_types[node_type] = blueprint.collection_label + + return return_types + + def get_sql(self, sql_file, **kwargs): + return render_template( + "/".join([self.get_template_path(), sql_file]), + **kwargs + ) + + def finalize_id_path(self, path, base_path): + if base_path is not None: + path = '{0}/{1}'.format(base_path, path) + + return path + + def search(self, text, obj_type=None): + conn = self.manager.connection(did=self.did) + last_system_oid = (self.manager.db_info[self.did])['datlastsysoid'] \ + if self.manager.db_info is not None and self.did in \ + self.manager.db_info else 0 + + show_node_prefs = self.get_show_node_prefs() + node_labels = self.get_supported_types(skip_check=True) + # Column catalog_level has values as + # N - Not a catalog schema + # D - Catalog schema with DB support - pg_catalog + # O - Catalog schema with object support only - info schema, dbo, sys + status, res = conn.execute_dict( + self.get_sql('search.sql', search_text=text, obj_type=obj_type, + show_system_objects=self.show_system_objects, + show_node_prefs=show_node_prefs, _=gettext, + last_system_oid=last_system_oid) + ) + + if not status: + return status, res + + ret_val = [ + { + 'name': row['obj_name'], + 'type': row['obj_type'], + 'type_label': node_labels[row['obj_type']], + 'path': row['obj_path'], + 'show_node': row['show_node'], + 'other_info': row['other_info'], + 'catalog_level': row['catalog_level'], + } + for row in res['rows'] + ] + return True, ret_val diff --git a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css index 52b821d8b..f9d15b8da 100644 --- a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css +++ b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css @@ -112,7 +112,7 @@ li { font-size: 9pt; } -.slick-header-column.ui-state-default { +#datagrid .slick-header-column.ui-state-default { height: 32px !important; } diff --git a/web/regression/javascript/fake_endpoints.js b/web/regression/javascript/fake_endpoints.js index fa01b3f89..157a34863 100644 --- a/web/regression/javascript/fake_endpoints.js +++ b/web/regression/javascript/fake_endpoints.js @@ -19,5 +19,7 @@ define(function () { 'datagrid.initialize_query_tool_with_did': '/initialize/query_tool/<int:sgid>/<int:sid>/<int:did>', 'restore.create_job': '/restore/job/<int:sid>', 'datagrid.panel': '/panel/<int:trans_id>', + 'search_objects.types': '/search_objects/types/<int:sid>/<int:did>', + 'search_objects.search': '/search_objects/search/<int:sid>/<int:did>', }; }); diff --git a/web/regression/javascript/search_objects/search_objects_dialog_spec.js b/web/regression/javascript/search_objects/search_objects_dialog_spec.js new file mode 100644 index 000000000..039db1970 --- /dev/null +++ b/web/regression/javascript/search_objects/search_objects_dialog_spec.js @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// +import SearchObjectsDialog from 'tools/search_objects/static/js/search_objects_dialog'; +import {TreeFake} from '../tree/tree_fake'; +import MockAdapter from 'axios-mock-adapter'; +import axios from 'axios/index'; + +const context = describe; + +describe('SearchObjectsDialog', () => { + let soDialog; + let pgBrowser; + let jquerySpy; + let alertifySpy; + + beforeEach(() => { + pgBrowser = { + treeMenu: new TreeFake(), + Nodes: { + server: { + hasId: true, + label: 'server', + getTreeNodeHierarchy: jasmine.createSpy('server.getTreeNodeHierarchy'), + }, + database: { + hasId: true, + label: 'database', + getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'), + }, + schema: { + hasId: true, + label: 'schema', + getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'), + }, + }, + stdW: { + sm: 500, + md: 700, + lg: 900, + default: 500, + }, + stdH: { + sm: 200, + md: 400, + lg: 550, + default: 550, + }, + }; + pgBrowser.Nodes.server.hasId = true; + pgBrowser.Nodes.database.hasId = true; + jquerySpy = jasmine.createSpy('jquerySpy'); + + const hierarchy = { + children: [ + { + id: 'root', + children: [ + { + id: 'serverTreeNode', + data: { + _id: 10, + _type: 'server', + user: {name: 'username'}, + label: 'theserver', + }, + children: [ + { + id: 'some_database', + data: { + _type: 'database', + _id: 11, + label: 'thedatabase', + }, + }, + ], + }, + { + id: 'ppasServer', + data: { + _type: 'server', + server_type: 'ppas', + children: [ + {id: 'someNodeUnderneathPPASServer'}, + ], + }, + }, + ], + }, + ], + }; + + pgBrowser.treeMenu = TreeFake.build(hierarchy); + }); + + describe('#draw', () => { + let networkMock; + beforeEach(() => { + networkMock = new MockAdapter(axios); + alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']); + alertifySpy['search_objects'] = jasmine.createSpy('search_objects'); + soDialog = new SearchObjectsDialog( + pgBrowser, + jquerySpy, + alertifySpy, + null + ); + + pgBrowser.get_preference = jasmine.createSpy('get_preferences'); + }); + + afterEach(() => { + networkMock.restore(); + }); + + context('there are no ancestors of the type database', () => { + it('does not create a dialog', () => { + pgBrowser.treeMenu.selectNode([{id: 'serverTreeNode'}]); + soDialog.draw(null, null, null); + expect(alertifySpy['search_objects']).not.toHaveBeenCalled(); + }); + + it('display an alert with a Backup Error', () => { + soDialog.draw(null, [{id: 'serverTreeNode'}], null); + expect(alertifySpy.alert).toHaveBeenCalledWith( + 'Search Objects Error', + 'Please select a database or its child node from the browser.' + ); + }); + }); + + context('there is an ancestor of the type database', () => { + let soDialogResizeToSpy; + beforeEach(() => { + soDialogResizeToSpy = jasmine.createSpyObj('soDialogResizeToSpy', ['resizeTo']); + alertifySpy['search_objects'].and + .returnValue(soDialogResizeToSpy); + }); + + it('displays the dialog when database node selected', (done) => { + soDialog.draw(null, [{id: 'some_database'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md); + setTimeout(() => { + expect(alertifySpy['search_objects']).toHaveBeenCalledWith('Search Objects - thedatabase/username@theserver'); + expect(soDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md); + done(); + }, 0); + }); + }); + }); +}); diff --git a/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js b/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js new file mode 100644 index 000000000..6799eec0c --- /dev/null +++ b/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js @@ -0,0 +1,532 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import {TreeFake} from '../tree/tree_fake'; +import SearchObjectsDialogWrapper from 'tools/search_objects/static/js/search_objects_dialog_wrapper'; +import axios from 'axios/index'; +import MockAdapter from 'axios-mock-adapter'; +import {TreeNode} from '../../../pgadmin/static/js/tree/tree'; + +let context = describe; + +describe('SearchObjectsDialogWrapper', () => { + let jquerySpy; + let pgBrowser; + let alertifySpy; + let dialogModelKlassSpy = null; + let backform; + let soDialogWrapper; + let noDataNode; + let serverTreeNode; + let databaseTreeNode; + let viewSchema; + let soJQueryContainerSpy; + let soNodeChildNodeSpy; + let soNode; + + beforeEach(() => { + pgBrowser = { + treeMenu: new TreeFake(), + Nodes: { + server: { + hasId: true, + getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'), + }, + database: { + hasId: true, + getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'), + }, + 'coll-sometype': { + type: 'coll-sometype', + hasId: false, + label: 'Some types coll', + }, + sometype: { + type: 'sometype', + hasId: true, + }, + someothertype: { + type: 'someothertype', + hasId: true, + collection_type: 'coll-sometype', + }, + 'coll-edbfunc': { + type: 'coll-edbfunc', + hasId: true, + label: 'Functions', + }, + 'coll-edbproc': { + type: 'coll-edbfunc', + hasId: true, + label: 'Procedures', + }, + 'coll-edbvar': { + type: 'coll-edbfunc', + hasId: true, + label: 'Variables', + }, + }, + keyboardNavigation: jasmine.createSpyObj('keyboardNavigation', ['getDialogTabNavigator']), + }; + noDataNode = pgBrowser.treeMenu.addNewNode('level1.1', undefined, [{id: 'level1'}]); + serverTreeNode = pgBrowser.treeMenu.addNewNode('level2.1', { + _type: 'server', + _id: 10, + label: 'some-tree-label', + }, [{id: 'level2.1'}]); + databaseTreeNode = new TreeNode('database-tree-node', { + _type: 'database', + _id: 123, + _label: 'some-database-label', + }, [{id: 'database-tree-node'}]); + pgBrowser.treeMenu.addChild(serverTreeNode, databaseTreeNode); + + jquerySpy = jasmine.createSpy('jquerySpy'); + soNode = { + __internal: { + buttons: [{}, {}, {}, { + element: { + disabled: false, + }, + }], + }, + elements: { + body: { + childNodes: [ + {}, + ], + }, + content: jasmine.createSpyObj('content', ['appendChild', 'attr']), + }, + }; + + soJQueryContainerSpy = jasmine.createSpyObj('soJQueryContainer', ['get', 'attr']); + soJQueryContainerSpy.get.and.returnValue(soJQueryContainerSpy); + + viewSchema = {}; + backform = jasmine.createSpyObj('backform', ['generateViewSchema', 'Dialog']); + backform.generateViewSchema.and.returnValue(viewSchema); + + soNodeChildNodeSpy = jasmine.createSpyObj('something', ['addClass']); + jquerySpy.and.callFake((selector) => { + if (selector === '<div class=\'search_objects_dialog\'></div>') { + return soJQueryContainerSpy; + } else if (selector === soNode.elements.body.childNodes[0]) { + return soNodeChildNodeSpy; + } + }); + alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']); + + }); + + describe('#prepare', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + soDialogWrapper = Object.assign(soDialogWrapper, soNode); + spyOn(soDialogWrapper, 'prepareDialog').and.callThrough(); + spyOn(soDialogWrapper, 'setTypes'); + spyOn(soDialogWrapper, 'setResultCount'); + }); + + context('no tree element is selected', () => { + it('does not prepare dialog', () => { + spyOn(soDialogWrapper, 'prepareDialog'); + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).not.toHaveBeenCalled(); + }); + }); + + context('selected tree node has no data', () => { + beforeEach(() => { + pgBrowser.treeMenu.selectNode(noDataNode.domNode); + }); + + it('does not prepare the dialog', () => { + spyOn(soDialogWrapper, 'prepareDialog'); + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).not.toHaveBeenCalled(); + }); + }); + + context('tree element is selected', () => { + let gridDestroySpy; + let networkMock; + + beforeEach(() => { + pgBrowser.treeMenu.selectNode(databaseTreeNode.domNode); + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['destroy']); + spyOn(soDialogWrapper, 'showMessage'); + gridDestroySpy = spyOn(soDialogWrapper.grid, 'destroy'); + + networkMock = new MockAdapter(axios); + + }); + + afterEach(() => { + networkMock.restore(); + }); + + it('creates dialog and displays it', () => { + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).toHaveBeenCalled(); + expect(soDialogWrapper.showMessage).toHaveBeenCalledWith(null); + }); + + + it('if grid set then destroy it', () => { + soDialogWrapper.prepare(); + expect(gridDestroySpy).toHaveBeenCalled(); + expect(soDialogWrapper.grid).toBe(null); + }); + + it('set result count to 0', () => { + soDialogWrapper.prepare(); + expect(soDialogWrapper.setResultCount).toHaveBeenCalledWith(0); + }); + + it('setTypes called before and after the ajax success', (done) => { + networkMock.onGet('/search_objects/types/10/123').reply(200, { + 'data': { + 'type1': 'Type Label 1', + 'type2': 'Type Label 2', + }, + }); + + soDialogWrapper.prepare(); + + expect(soDialogWrapper.setTypes.calls.argsFor(0)).toEqual([ + [{ id: -1, text: 'Loading...', value: null }], false, + ]); + + setTimeout(()=>{ + expect(soDialogWrapper.setTypes.calls.argsFor(1)).toEqual([ + [{id: 'all', text: 'All types'}, + {id: 'type1', text: 'Type Label 1'}, + {id: 'type2', text: 'Type Label 2'}], + ]); + done(); + }, 0); + }); + + it('setTypes called after the ajax fail', (done) => { + networkMock.onGet('/search_objects/types/10/123').reply(500); + + soDialogWrapper.prepare(); + + expect(soDialogWrapper.setTypes.calls.argsFor(0)).toEqual([ + [{ id: -1, text: 'Loading...', value: null }], false, + ]); + + setTimeout(()=>{ + expect(soDialogWrapper.setTypes.calls.argsFor(1)).toEqual([ + [{id: -1, text: 'Failed', value: null }], false, + ]); + done(); + }, 0); + }); + }); + }); + + describe('showMessage', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + soDialogWrapper.statusBar = document.createElement('div'); + soDialogWrapper.statusBar.classList.add('d-none'); + document.body.appendChild(soDialogWrapper.statusBar); + }); + + afterEach(() => { + document.body.removeChild(soDialogWrapper.statusBar); + }); + it('when info message', ()=>{ + soDialogWrapper.showMessage('locating', false); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.statusBar.querySelector('.error-in-footer')).toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.info-in-footer')).not.toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.alert-text').innerHTML).toEqual('locating'); + }); + + it('when error message', ()=>{ + soDialogWrapper.showMessage('some error', true); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.statusBar.querySelector('.error-in-footer')).not.toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.info-in-footer')).toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.alert-text').innerHTML).toEqual('some error'); + }); + + it('when no message', ()=>{ + soDialogWrapper.showMessage(null); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(true); + }); + }); + + describe('function', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + }); + + it('updateDimOfSearchResult', ()=>{ + soDialogWrapper.searchResultContainer = document.createElement('div'); + soDialogWrapper.searchResult = document.createElement('div'); + spyOn(soDialogWrapper.searchResultContainer, 'getBoundingClientRect').and.returnValue({height:100, width: 50}); + + soDialogWrapper.updateDimOfSearchResult(); + expect(soDialogWrapper.searchResult.style.height).toEqual('100px'); + expect(soDialogWrapper.searchResult.style.width).toEqual('50px'); + }); + + it('setLoading', ()=>{ + soDialogWrapper.loader = document.createElement('div'); + soDialogWrapper.loader.innerHTML = ` + <div class="pg-sp-text"></div> + `; + + soDialogWrapper.setLoading('loading'); + expect(soDialogWrapper.loader.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.loader.querySelector('.pg-sp-text').innerHTML).toEqual('loading'); + + soDialogWrapper.setLoading(null); + expect(soDialogWrapper.loader.classList.contains('d-none')).toBe(true); + }); + + it('searchBtnEnabled', ()=>{ + soDialogWrapper.searchBtn = document.createElement('button'); + + soDialogWrapper.searchBtnEnabled(true); + expect(soDialogWrapper.searchBtn.disabled).toEqual(false); + expect(soDialogWrapper.searchBtnEnabled()).toEqual(true); + + soDialogWrapper.searchBtnEnabled(false); + expect(soDialogWrapper.searchBtn.disabled).toEqual(true); + expect(soDialogWrapper.searchBtnEnabled()).toEqual(false); + }); + + it('searchBoxVal', ()=>{ + soDialogWrapper.searchBox = document.createElement('input'); + soDialogWrapper.searchBoxVal('abc'); + expect(soDialogWrapper.searchBox.value).toEqual('abc'); + expect(soDialogWrapper.searchBoxVal()).toEqual('abc'); + }); + + it('typesVal', ()=>{ + soDialogWrapper.typesSelect = document.createElement('select'); + let opt = document.createElement('option'); + opt.appendChild( document.createTextNode('Some type') ); + opt.value = 'sometype'; + soDialogWrapper.typesSelect.appendChild(opt); + + soDialogWrapper.typesVal('sometype'); + expect(soDialogWrapper.typesSelect.value).toEqual('sometype'); + expect(soDialogWrapper.typesVal()).toEqual('sometype'); + }); + + it('setGridData', ()=>{ + soDialogWrapper.dataview = jasmine.createSpyObj('dataview', ['setItems']); + soDialogWrapper.setGridData([{id:'somedata'}]); + expect(soDialogWrapper.dataview.setItems).toHaveBeenCalled(); + }); + + it('onDialogResize', ()=>{ + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['autosizeColumns', 'resizeCanvas']); + spyOn(soDialogWrapper, 'updateDimOfSearchResult'); + + soDialogWrapper.onDialogResize(); + expect(soDialogWrapper.updateDimOfSearchResult).toHaveBeenCalled(); + expect(soDialogWrapper.grid.resizeCanvas).toHaveBeenCalled(); + expect(soDialogWrapper.grid.autosizeColumns).toHaveBeenCalled(); + }); + + it('onDialogShow', (done)=>{ + spyOn(soDialogWrapper, 'prepareGrid').and.callFake(function() { + this.grid = jasmine.createSpyObj('grid', ['init']); + }); + + spyOn(soDialogWrapper, 'focusOnDialog'); + spyOn(soDialogWrapper, 'updateDimOfSearchResult'); + spyOn(soDialogWrapper, 'setGridData'); + spyOn(soDialogWrapper, 'onDialogResize'); + + + soDialogWrapper.onDialogShow(); + setTimeout(()=>{ + expect(soDialogWrapper.prepareGrid).toHaveBeenCalled(); + expect(soDialogWrapper.focusOnDialog).toHaveBeenCalled(); + expect(soDialogWrapper.setGridData).toHaveBeenCalledWith([]); + expect(soDialogWrapper.onDialogResize).toHaveBeenCalled(); + done(); + }, 750); + }); + + context('getCollNode', ()=>{ + it('type have same coll node', ()=>{ + let collNode = soDialogWrapper.getCollNode('sometype'); + expect(collNode.type).toEqual('coll-sometype'); + }); + + it('type does not same coll node', ()=>{ + let collNode = soDialogWrapper.getCollNode('someothertype'); + expect(collNode.type).toEqual('coll-sometype'); + }); + + it('type does not have coll node at all', ()=>{ + let collNode = soDialogWrapper.getCollNode('database'); + expect(collNode).toBe(null); + }); + }); + + it('finaliseData', ()=>{ + spyOn(soDialogWrapper, 'translateSearchObjectsPath').and.returnValue(['disp/path', 'id/path']); + let data = soDialogWrapper.finaliseData({ + name: 'objname', + type: 'sometype', + type_label: 'Some types coll', + path: ':some.123:/path', + show_node: true, + }); + expect(data).toEqual({ + id: 'id/path', + icon: 'icon-sometype', + name: 'objname', + type: 'sometype', + type_label: 'Some types coll', + path: 'disp/path', + id_path: 'id/path', + show_node: true, + }); + }); + + context('translateSearchObjectsPath', ()=>{ + let path = null, catalog_level = null; + beforeEach(()=>{ + pgBrowser.Nodes = { + 'server_group': { + type:'server_group', + label: 'Server group', + }, + 'server': { + type:'server', + label: 'Server', + }, + 'coll-database': { + type:'coll-database', + label: 'Databases', + }, + 'database': { + type:'database', + label: 'Database', + }, + 'coll-schema': { + type:'coll-schema', + label: 'Schemas', + }, + 'schema': { + type:'schema', + label: 'Schema', + }, + 'coll-table': { + type:'coll-table', + label: 'Tables', + }, + 'table': { + type:'table', + label: 'Table', + }, + 'sometype': { + type:'sometype', + label: 'Some type', + collection_type: 'coll-table', + }, + 'coll-catalog': { + type:'coll-catalog', + label: 'Catalogs', + }, + 'catalog': { + type:'catalog', + label: 'Catalog', + }, + 'coll-catalog_object': { + type:'coll-catalog_object', + label: 'Catalog Objects', + }, + 'catalog_object': { + type:'catalog_object', + label: 'catalog object', + }, + }; + + soDialogWrapper.treeInfo = { + 'server_group': {'id': 'server_group/1', '_id': 1}, + 'server': {'id': 'server/3', '_id': 3}, + 'database': {'id': 'database/18456', '_id': 18456}, + }; + }); + it('regular schema', ()=>{ + path = ':schema.2200:/test_db/:table.2604:/sampletab'; + catalog_level = 'N'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Schemas/test_db/Tables/sampletab', + ['server_group/1','server/3','coll-database/3','database/18456','coll-schema/18456','schema/2200','coll-table/2200','table/2604'], + ]); + }); + + context('catalog schema', ()=>{ + it('with db support', ()=>{ + path = ':schema.11:/PostgreSQL Catalog (pg_catalog)/:table.2604:/pg_class'; + catalog_level = 'D'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Catalogs/PostgreSQL Catalog (pg_catalog)/Tables/pg_class', + ['server_group/1','server/3','coll-database/3','database/18456','coll-catalog/18456','catalog/11','coll-table/11','table/2604'], + ]); + }); + + it('with object support only', ()=>{ + path = ':schema.11:/ANSI (information_schema)/:table.2604:/attributes'; + catalog_level = 'O'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Catalogs/ANSI (information_schema)/Catalog Objects/attributes', + ['server_group/1','server/3','coll-database/3','database/18456','coll-catalog/18456','catalog/11','coll-catalog_object/11','catalog_object/2604'], + ]); + }); + }); + }); + }); +}); diff --git a/web/regression/javascript/tree/tree_fake.js b/web/regression/javascript/tree/tree_fake.js index c0c17796a..f476bb272 100644 --- a/web/regression/javascript/tree/tree_fake.js +++ b/web/regression/javascript/tree/tree_fake.js @@ -41,6 +41,9 @@ export class TreeFake extends Tree { this.aciTreeToOurTreeTranslator = {}; this.aciTreeApi = jasmine.createSpyObj( 'ACITreeApi', ['setInode', 'unload', 'deselect', 'select']); + this.aciTreeApi.unload.and.callFake(function(domNode, config) { + config.success(); + }); } addNewNode(id, data, domNode, path) { diff --git a/web/regression/javascript/tree/tree_spec.js b/web/regression/javascript/tree/tree_spec.js index bb607796c..038fcc24c 100644 --- a/web/regression/javascript/tree/tree_spec.js +++ b/web/regression/javascript/tree/tree_spec.js @@ -246,39 +246,70 @@ describe('tree tests', () => { tree.aciTreeApi = jasmine.createSpyObj( 'ACITreeApi', ['setInode', 'unload', 'deselect', 'select']); + tree.aciTreeApi.unload.and.callFake((domNode, config) => { + config.success(); + }); }); - it('reloads the node and its children', () => { - level2.reload(tree); - expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + it('reloads the node and its children', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); - it('does not reload the children of node', () => { - level2.reload(tree); - expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + it('does not reload the children of node', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); it('select the node', (done) => { - level2.reload(tree); - setTimeout(() => { - expect(tree.selected()).toEqual([{id: 'level2'}]); - done(); - }, 20); + level2.reload(tree) + .then(()=>{ + setTimeout(() => { + expect(tree.selected()).toEqual([{id: 'level2'}]); + done(); + }, 20); + }) + .catch((error)=>{ + fail(error); + }); }); describe('ACITree specific', () => { - it('sets the current node as a Inode, changing the Icon back to +', () => { - level2.reload(tree); - expect(tree.aciTreeApi.setInode).toHaveBeenCalledWith([{id: 'level2'}]); + it('sets the current node as a Inode, changing the Icon back to +', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.aciTreeApi.setInode).toHaveBeenCalledWith([{id: 'level2'}]); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); it('deselect the node and selects it again to trigger ACI tree' + ' events', (done) => { - level2.reload(tree); - setTimeout(() => { - expect(tree.aciTreeApi.deselect).toHaveBeenCalledWith([{id: 'level2'}]); - done(); - }, 20); + level2.reload(tree) + .then(()=>{ + setTimeout(() => { + expect(tree.aciTreeApi.deselect).toHaveBeenCalledWith([{id: 'level2'}]); + done(); + }, 20); + }) + .catch((error)=>{ + fail(error); + }); }); }); }); @@ -292,17 +323,32 @@ describe('tree tests', () => { level2 = tree.addNewNode('level2', {data: 'data'}, ['<li>level2</li>'], ['level1']); tree.addNewNode('level3', {data: 'more data'}, ['<li>level3</li>'], ['level1', 'level2']); tree.aciTreeApi = jasmine.createSpyObj('ACITreeApi', ['unload']); + tree.aciTreeApi.unload.and.callFake((domNode, config) => { + config.success(); + }); }); - it('unloads the children of the current node', () => { - level2.unload(tree); - expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); - expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + it('unloads the children of the current node', (done) => { + level2.unload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); - it('calls unload on the ACI Tree', () => { - level2.unload(tree); - expect(tree.aciTreeApi.unload).toHaveBeenCalledWith(['<li>level2</li>']); + it('calls unload on the ACI Tree', (done) => { + level2.unload(tree) + .then(()=>{ + expect(tree.aciTreeApi.unload).toHaveBeenCalledWith(['<li>level2</li>'], jasmine.any(Object)); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); }); }); diff --git a/web/webpack.config.js b/web/webpack.config.js index 9fd0a32e9..29811388a 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -494,7 +494,8 @@ module.exports = [{ ',pgadmin.tools.debugger.controller' + ',pgadmin.tools.debugger.direct' + ',pgadmin.node.pga_job' + - ',pgadmin.tools.schema_diff', + ',pgadmin.tools.schema_diff' + + ',pgadmin.tools.search_objects', }, }, { test: require.resolve('snapsvg'), diff --git a/web/webpack.shim.js b/web/webpack.shim.js index a5c73805a..0587d0498 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -281,6 +281,8 @@ var webpackShimConfig = { 'pgadmin.tools.restore': path.join(__dirname, './pgadmin/tools/restore/static/js/restore'), 'pgadmin.tools.schema_diff': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff'), 'pgadmin.tools.schema_diff_ui': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff_ui'), + 'pgadmin.tools.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js/search_objects'), + 'pgadmin.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js'), 'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'), 'pgadmin.user_management.current_user': '/user_management/current_user', 'slick.pgadmin.editors': path.join(__dirname, './pgadmin/tools/../static/js/slickgrid/editors'), diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js index 70db29125..cfa8dda02 100644 --- a/web/webpack.test.config.js +++ b/web/webpack.test.config.js @@ -105,6 +105,7 @@ module.exports = { 'pgadmin.browser.preferences': path.join(__dirname, './pgadmin/browser/static/js/preferences'), 'pgadmin.browser.activity': path.join(__dirname, './pgadmin/browser/static/js/activity'), 'bundled_codemirror': path.join(__dirname, './pgadmin/static/bundle/codemirror'), + 'tools': path.join(__dirname, './pgadmin/tools/'), }, }, }; diff --git a/web/yarn.lock b/web/yarn.lock index 677a2fffa..86c4ca04f 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -836,11 +836,6 @@ JSONStream@^1.0.3: jsonparse "^1.2.0" through ">=2.2.7 <3" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@~1.3.4, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -977,7 +972,7 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: +aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== @@ -994,14 +989,6 @@ archive-type@^4.0.0: dependencies: file-type "^4.2.0" -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.6, argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2312,11 +2299,6 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - codemirror@^5.50.0: version "5.52.0" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.52.0.tgz#4dbd6aef7f0e63db826b9a23922f0c03ac75c0a7" @@ -2453,11 +2435,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - console-stream@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" @@ -2931,11 +2908,6 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -2975,11 +2947,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3013,11 +2980,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" @@ -3958,13 +3920,6 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -4010,20 +3965,6 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - geometry-interfaces@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/geometry-interfaces/-/geometry-interfaces-1.1.4.tgz#9e82af6700ca639a675299f08e1f5fbc4a79d48d" @@ -4289,11 +4230,6 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -4445,7 +4381,7 @@ iconfont-webpack-plugin@^4.2.1: svgicons2svgfont "9.1.1" ttf2woff "2.0.1" [email protected], iconv-lite@^0.4.24, iconv-lite@^0.4.4: [email protected], iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4474,13 +4410,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -4685,7 +4614,7 @@ [email protected]: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -4922,13 +4851,6 @@ is-finite@^1.0.0: resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -5830,14 +5752,6 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - minipass@^3.0.0, minipass@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" @@ -5845,13 +5759,6 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -6003,15 +5910,6 @@ neatequal@^1.0.0: dependencies: varstream "^0.3.2" -needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - [email protected]: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -6056,22 +5954,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.52: version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" @@ -6079,14 +5961,6 @@ node-releases@^1.1.52: dependencies: semver "^6.3.0" -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -6128,13 +6002,6 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-conf@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" @@ -6143,20 +6010,6 @@ npm-conf@^1.1.0: config-chain "^1.1.11" pify "^3.0.0" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6164,16 +6017,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -6191,11 +6034,6 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6347,11 +6185,6 @@ os-filter-obj@^2.0.0: dependencies: arch "^2.1.0" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -6366,19 +6199,11 @@ os-shim@^0.1.3: resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" @@ -7266,16 +7091,6 @@ raw-loader@^1.0.0: loader-utils "^1.1.0" schema-utils "^1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" @@ -7300,7 +7115,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7583,7 +7398,7 @@ [email protected]: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -7782,7 +7597,7 @@ [email protected]: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -8219,15 +8034,6 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^1.0.1, "string-width@^1.0.2 || 2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -8290,7 +8096,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= @@ -8337,7 +8143,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -8500,19 +8306,6 @@ tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -9183,13 +8976,6 @@ which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - wkx@^0.4.6: version "0.4.8" resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.8.tgz#a092cf088d112683fdc7182fd31493b2c5820003" @@ -9276,7 +9062,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-06 09:52 Khushboo Vashi <[email protected]> parent: Aditya Toshniwal <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Khushboo Vashi @ 2020-04-06 09:52 UTC (permalink / raw) To: Aditya Toshniwal <[email protected]>; +Cc: pgadmin-hackers; Akshay Joshi <[email protected]> Hi Aditya, Please resend the rebased patch, it does not apply. Thanks, Khushboo On Fri, Apr 3, 2020 at 2:44 PM Aditya Toshniwal < [email protected]> wrote: > Hi Hackers, > > Attached is the updated patch. > With this, > 1) I've displayed the rows count detail at the bottom of the dialog. This > will help in both cases, when there are rows and when there are none. > 2) As discussed, a user can now apply object types dropdown filter on > already loaded data. > 3) I've not made changes for the multilevel partition icon because it > would be too much to do for an icon. We're already showing the type name in > the grid. Adding extra SQL joins and making the query slower for the icon > is not desirable. > 4) Fixed some gettext issues as mentioned in the review. > > Please review. > > > On Thu, Apr 2, 2020 at 5:54 PM Aditya Toshniwal < > [email protected]> wrote: > >> Hi Khushboo, >> >> On Thu, Apr 2, 2020 at 4:49 PM Khushboo Vashi < >> [email protected]> wrote: >> >>> >>> >>> On Thu, Apr 2, 2020 at 4:30 PM Aditya Toshniwal < >>> [email protected]> wrote: >>> >>>> Hi Khushboo, >>>> >>>> Thank you for reviewing. >>>> >>>> >>>> On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < >>>> [email protected]> wrote: >>>> >>>>> Hi Aditya, >>>>> >>>>> Review comments: >>>>> >>>>> *UI:* >>>>> >>>>> 1. When no object is found, the default message should be given, >>>>> currently no message displayed. >>>>> 2. Can we have a tooltip on the row "Double click to locate the object >>>>> in the browser" ? >>>>> 3. Full stop is missing in the message column objects are disabled in >>>>> the browser. You can enable them in the preferences dialog ( :D ) >>>>> and also, we should start the statement with the capital letter. >>>>> 4. If possible, use the multilevel partition table symbol same as the >>>>> browser tree. >>>>> 5. gettext is missing from the search grid header. >>>>> >>>> I'll fix all above. >>>> >>>>> 6. Suggestion: The search button should be at the end (after type >>>>> combobox). The current position of the controls suggest that search for >>>>> the objects and then filter it out but that's not the case. >>>>> >>>> I've actually kept the most frequently used controls together. The >>>> probability of using the types filter is less and a user would generally go >>>> for full search. This is how even we generally do. We search first and then >>>> apply filter if required >>>> >>> Right, so type based search on slickgrid data would be useful. >>> >> 👍 >> >>> After changing the type, we have to click on the search button. >>>>> In the current positioning, we should fetch all the records from the >>>>> backend and then filter those out depending on the type at the client side >>>>> only, so that will reduce the server requests and slickgrid is efficient it >>>>> do so. >>>>> >>>> I'll look into this. My only concern is the data may be outdated, but I >>>> agree to filter in slickgrid on type change. The user can hit search again >>>> if required. >>>> >>> >>>>> *Backend:* >>>>> >>>>> 1. We do have the list of blueprint, so we can use that list instead >>>>> of taking the hard coe list in the init method of SearchObjectsHelper >>>>> class. >>>>> >>>> The reason is, we do not support all objects for search objects. Only >>>> objects under a database are supported. The probability of node type change >>>> is very less. >>>> >>> True but we can maintain the skip list (which would be less) and we do >>> have bluprint start with NODE, so it will be easier to fetch. >>> >> I would prefer the "in" list rather than "skip" list. Each time a new >> node is added to pgAdmin, we will have to update the skip list in search >> objects. With the "in" list, search objects has better control. >> >>> 2. While searching the object, we create an object of SearchObjectsHelper >>>>> on each request. We can create it once while initializing and utilize it on >>>>> every search. >>>>> >>>> The intention is to keep SearchObjectsHelper stateless. The object is >>>> created based on the request data and it is easier to maintain >>>> independently. >>>> >>>>> >>>>> Note: The functionality is working fine. >>>>> >>>> Great. Thanks. >>>> >>>>> >>>>> Thanks, >>>>> Khushboo >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < >>>>> [email protected]> wrote: >>>>> >>>>>> >>>>>> >>>>>> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hi Khushboo, >>>>>>> >>>>>>> Can you please review it. >>>>>>> >>>>>> I am on it. >>>>>> >>>>>>> >>>>>>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Hi Hackers, >>>>>>>> >>>>>>>> Attached is the patch to implement search objects functionality in >>>>>>>> pgadmin. >>>>>>>> The feature will allow a user to search for any object in a >>>>>>>> database. >>>>>>>> Highlights of the feature: >>>>>>>> 1) Search any object with user input text with at least 3 >>>>>>>> characters. >>>>>>>> 2) Search can be done on a specific object type by selecting from >>>>>>>> the types dropdown. >>>>>>>> 3) The search results grid will show object name, object type and >>>>>>>> the object path on the browser tree. On double clicking the record, it will >>>>>>>> locate that object on the browser tree. The columns object name and type >>>>>>>> are sortable. >>>>>>>> 4) The object nodes which are disabled (hidden) using preferences >>>>>>>> will not be visible in the types dropdown. However, in the case of all >>>>>>>> types, the search records will be visible for those types greyed out. >>>>>>>> 5) You can also access search objects dialog using the button on >>>>>>>> the browser toolbar. >>>>>>>> >>>>>>>> Python and JS test cases added. Docs updated. >>>>>>>> Please review. >>>>>>>> >>>>>>>> -- >>>>>>>> Thanks and Regards, >>>>>>>> Aditya Toshniwal >>>>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> *Thanks & Regards* >>>>>>> *Akshay Joshi* >>>>>>> >>>>>>> *Sr. Software Architect* >>>>>>> *EnterpriseDB Software India Private Limited* >>>>>>> *Mobile: +91 976-788-8246* >>>>>>> >>>>>> >>>> >>>> -- >>>> Thanks and Regards, >>>> Aditya Toshniwal >>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>> "Don't Complain about Heat, Plant a TREE" >>>> >>> >> >> -- >> Thanks and Regards, >> Aditya Toshniwal >> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >> "Don't Complain about Heat, Plant a TREE" >> > > > -- > Thanks and Regards, > Aditya Toshniwal > pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune > "Don't Complain about Heat, Plant a TREE" > ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-06 10:21 Aditya Toshniwal <[email protected]> parent: Khushboo Vashi <[email protected]> 0 siblings, 1 reply; 12+ messages in thread From: Aditya Toshniwal @ 2020-04-06 10:21 UTC (permalink / raw) To: pgadmin-hackers; +Cc: Akshay Joshi <[email protected]>; Khushboo Vashi <[email protected]> Hi Hackers, Please find the attached rebased patch. On Mon, Apr 6, 2020 at 3:22 PM Khushboo Vashi < [email protected]> wrote: > Hi Aditya, > > Please resend the rebased patch, it does not apply. > > Thanks, > Khushboo > > On Fri, Apr 3, 2020 at 2:44 PM Aditya Toshniwal < > [email protected]> wrote: > >> Hi Hackers, >> >> Attached is the updated patch. >> With this, >> 1) I've displayed the rows count detail at the bottom of the dialog. This >> will help in both cases, when there are rows and when there are none. >> 2) As discussed, a user can now apply object types dropdown filter on >> already loaded data. >> 3) I've not made changes for the multilevel partition icon because it >> would be too much to do for an icon. We're already showing the type name in >> the grid. Adding extra SQL joins and making the query slower for the icon >> is not desirable. >> 4) Fixed some gettext issues as mentioned in the review. >> >> Please review. >> >> >> On Thu, Apr 2, 2020 at 5:54 PM Aditya Toshniwal < >> [email protected]> wrote: >> >>> Hi Khushboo, >>> >>> On Thu, Apr 2, 2020 at 4:49 PM Khushboo Vashi < >>> [email protected]> wrote: >>> >>>> >>>> >>>> On Thu, Apr 2, 2020 at 4:30 PM Aditya Toshniwal < >>>> [email protected]> wrote: >>>> >>>>> Hi Khushboo, >>>>> >>>>> Thank you for reviewing. >>>>> >>>>> >>>>> On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi Aditya, >>>>>> >>>>>> Review comments: >>>>>> >>>>>> *UI:* >>>>>> >>>>>> 1. When no object is found, the default message should be given, >>>>>> currently no message displayed. >>>>>> 2. Can we have a tooltip on the row "Double click to locate the >>>>>> object in the browser" ? >>>>>> 3. Full stop is missing in the message column objects are disabled >>>>>> in the browser. You can enable them in the preferences dialog ( :D ) >>>>>> and also, we should start the statement with the capital letter. >>>>>> 4. If possible, use the multilevel partition table symbol same as the >>>>>> browser tree. >>>>>> 5. gettext is missing from the search grid header. >>>>>> >>>>> I'll fix all above. >>>>> >>>>>> 6. Suggestion: The search button should be at the end (after type >>>>>> combobox). The current position of the controls suggest that search for >>>>>> the objects and then filter it out but that's not the case. >>>>>> >>>>> I've actually kept the most frequently used controls together. The >>>>> probability of using the types filter is less and a user would generally go >>>>> for full search. This is how even we generally do. We search first and then >>>>> apply filter if required >>>>> >>>> Right, so type based search on slickgrid data would be useful. >>>> >>> 👍 >>> >>>> After changing the type, we have to click on the search button. >>>>>> In the current positioning, we should fetch all the records from the >>>>>> backend and then filter those out depending on the type at the client side >>>>>> only, so that will reduce the server requests and slickgrid is efficient it >>>>>> do so. >>>>>> >>>>> I'll look into this. My only concern is the data may be outdated, but >>>>> I agree to filter in slickgrid on type change. The user can hit search >>>>> again if required. >>>>> >>>> >>>>>> *Backend:* >>>>>> >>>>>> 1. We do have the list of blueprint, so we can use that list instead >>>>>> of taking the hard coe list in the init method of SearchObjectsHelper >>>>>> class. >>>>>> >>>>> The reason is, we do not support all objects for search objects. Only >>>>> objects under a database are supported. The probability of node type change >>>>> is very less. >>>>> >>>> True but we can maintain the skip list (which would be less) and we do >>>> have bluprint start with NODE, so it will be easier to fetch. >>>> >>> I would prefer the "in" list rather than "skip" list. Each time a new >>> node is added to pgAdmin, we will have to update the skip list in >>> search objects. With the "in" list, search objects has better control. >>> >>>> 2. While searching the object, we create an object of SearchObjectsHelper >>>>>> on each request. We can create it once while initializing and utilize it on >>>>>> every search. >>>>>> >>>>> The intention is to keep SearchObjectsHelper stateless. The object is >>>>> created based on the request data and it is easier to maintain >>>>> independently. >>>>> >>>>>> >>>>>> Note: The functionality is working fine. >>>>>> >>>>> Great. Thanks. >>>>> >>>>>> >>>>>> Thanks, >>>>>> Khushboo >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> Hi Khushboo, >>>>>>>> >>>>>>>> Can you please review it. >>>>>>>> >>>>>>> I am on it. >>>>>>> >>>>>>>> >>>>>>>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Hi Hackers, >>>>>>>>> >>>>>>>>> Attached is the patch to implement search objects functionality in >>>>>>>>> pgadmin. >>>>>>>>> The feature will allow a user to search for any object in a >>>>>>>>> database. >>>>>>>>> Highlights of the feature: >>>>>>>>> 1) Search any object with user input text with at least 3 >>>>>>>>> characters. >>>>>>>>> 2) Search can be done on a specific object type by selecting from >>>>>>>>> the types dropdown. >>>>>>>>> 3) The search results grid will show object name, object type and >>>>>>>>> the object path on the browser tree. On double clicking the record, it will >>>>>>>>> locate that object on the browser tree. The columns object name and type >>>>>>>>> are sortable. >>>>>>>>> 4) The object nodes which are disabled (hidden) using preferences >>>>>>>>> will not be visible in the types dropdown. However, in the case of all >>>>>>>>> types, the search records will be visible for those types greyed out. >>>>>>>>> 5) You can also access search objects dialog using the button on >>>>>>>>> the browser toolbar. >>>>>>>>> >>>>>>>>> Python and JS test cases added. Docs updated. >>>>>>>>> Please review. >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Thanks and Regards, >>>>>>>>> Aditya Toshniwal >>>>>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> *Thanks & Regards* >>>>>>>> *Akshay Joshi* >>>>>>>> >>>>>>>> *Sr. Software Architect* >>>>>>>> *EnterpriseDB Software India Private Limited* >>>>>>>> *Mobile: +91 976-788-8246* >>>>>>>> >>>>>>> >>>>> >>>>> -- >>>>> Thanks and Regards, >>>>> Aditya Toshniwal >>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>> "Don't Complain about Heat, Plant a TREE" >>>>> >>>> >>> >>> -- >>> Thanks and Regards, >>> Aditya Toshniwal >>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>> "Don't Complain about Heat, Plant a TREE" >>> >> >> >> -- >> Thanks and Regards, >> Aditya Toshniwal >> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >> "Don't Complain about Heat, Plant a TREE" >> > -- Thanks and Regards, Aditya Toshniwal pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune "Don't Complain about Heat, Plant a TREE" Attachments: [application/octet-stream] RM2172_v3.patch (675.1K, 3-RM2172_v3.patch) download | inline diff: diff --git a/docs/en_US/getting_started.rst b/docs/en_US/getting_started.rst index 5b09c5b4c..2595505d2 100644 --- a/docs/en_US/getting_started.rst +++ b/docs/en_US/getting_started.rst @@ -64,6 +64,8 @@ display. To open the *Preferences* dialog, select *Preferences* from the *File* for the dialog. You can access additional Postgres help by navigating through the *Help* menu, and selecting the name of the resource that you wish to open. +You can search for objects in the database using the :ref:`Search objects <search_objects>` + .. toctree:: :maxdepth: 2 @@ -74,6 +76,7 @@ the *Help* menu, and selecting the name of the resource that you wish to open. tree_control preferences keyboard_shortcuts + search_objects Before using pgAdmin to manage objects that reside on a server, you must define a connection to the server; for more information please see *Connecting to a Server* diff --git a/docs/en_US/images/search_objects.png b/docs/en_US/images/search_objects.png new file mode 100644 index 0000000000000000000000000000000000000000..950e813168a89fbd114a1852a2fc7d180f81df82 GIT binary patch literal 188209 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 literal 0 HcmV?d00001 diff --git a/docs/en_US/images/toolbar.png b/docs/en_US/images/toolbar.png index 19c4c574a905fb30ea1828b4825e85af7cdb0c0e..aac16b967b93b44576bf2a042b989aa296251648 100644 GIT binary patch literal 42931 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%0D-NlnK%<oL#WUV3Obj&<*1=JUG#xkE) zkjFT2Gi|CA5eW+^^TS+nn!<Z{cuz&WAB*%1>gelqO9|`%poZ~XyuF**dKg(*_<?>% zT+i-1fe>*9@KVH@$`ftG9aST+am~v_woEcfC2Q{QPdT=<@+%|FqGpGN-j=$)mv*+w z`+X-*jjV2{peIs%-!N>EUAPe>f>*vOYimYIjp%hN!mCpiH|h^2e94I_r&w`zNVN&H z>zZm39RWjl!WGHPQv(=rs-Q?rjI8hxbB5K8fV#PTOGIyT`L7vpa>;(V<EPV5X*okq z2rpsp9*Q8NCMx^il^EM8mkjfVdIGK_vxa#)K%QEPq4~a{rsKa#&TV<MpJ3hF33rD_ znVv>Y+@sF1=60u*Y$MqeHNwir7mad}$8c97Y2C^uR*E}VkVA?g_e+k`Cf=HTBJZ74 zx)??+JY73fiR}dGVBgWBYlpaKAb%;EwJ~;cH{2iQy_B_cjL+!^ybjP|=VH;exXw3| zfB;#;vA3Y;7hNw=PBB&{U<!O`yAjT&WJDl&UYA+1Ad#F|?7Zm;Y$nktZQCoyaUdc- zrAvBPm+#OkD9A1i3$ofttC*R5t}*p9iyy?}ubBz5In+$&W{`cYX)cJQ>Sq6lS(o#U zpV$%Df_u_Q^>Ai|$U#}t_*LHl1N)R*0?b_X9Uf5a3wQGddUSP_k0sbwCEx3J=oJ|c zozBQ{mE1@FqCM!dnLXO{GlSo2FD%8i1c9n!0JFc|IYN+e+CZnC+Vdf*fyMt^lD*Hl z*p49D>#}}grin72n*p<Kht{EHE$k6yVTsE*L#?gvkWW~@o0Tg=>eFP&oQ-bWU}m-I z1Jk<L6)AZ)CGebUd46Em0wX4P1d)WSwT~jj<EUsvJTW;2qSqY&NCZ>BynP}eHuafe zpi0HuF`%xq<sm_yEjP`{4{wKnXd^;N5-orYgg#5wI|Fdl$x@JyOfG3H$nDckQ&y3# zbb8|Kv*lXRYRC(1>g_Oh=8Ksu5Y?MxM{S@b?{hOyp#FGBS8^i0yPb8B>PMJQWGpU| zEW=$%@}Q};PslxLSwsxkvwRV&0yAo1@6zlR+8haLT8W`nF@<b{)6m)>dXGLY$q8No z6K%i>+m8oRH&W}lWT;N9MkzMDMsO4S(|7C9`$E*`7*QvgbG9a%9HK%^@dxb`OfQ~` zK~r+7+S+ttPgm+GJQaVD$VrSZGtg-Qxuo4(PQ9T<YGME;K*-M?CARg@8vy0{8O3ya zQ)Q|Dl8GS>ONx}XDUrsCXoL_v-^0O-b49HTGxB6cHAWNyed_{l<o=~Fn=>l8i(Jl} zShz^Zw-&RaeiJMjMAkni(Kuz(-w@jmf=Bzcjif{=22G{BtkDr^*-sJNKO>P$wN`tj zJ#(n@6zJOo=iBFy(O2X32XID+3w(WlCK6sDP{`selEn9Ve9~yFQw1h0kwkTr&-ljV zq#x{b705jMDm}r>6X49w!L&UZk5%z-O%aPn)z;e}%@7K1F_hU@+%=z;Q^(gISdtjd z__hM=i0NKp9?f`O4He2zvYuU>uuD7YgN;o<^+_Cg3M2LitrWu8!R}RiA<d%~7tB$8 zY>t1WzBBJ=KRJIinBNnDl=)bLmmC~EjXl||$J7xob56Tp1l)LK2*HPrSt%Ze+FX>y zEad_AG7(?bDGA@KO?Ub2<)7O9=aCp2ABrRrl^bK;YlBP(1bl*)$cY_Ew`lQ>Mynh9 zQb<-Pb!`CYWd=R8BJ^c8BX7wjTu?R+uy1xoe)rIGkb;f}%2KxyVD?8S$7u+1vI>-& zs(9~5LCYVXxkF7%0yAXfQ&M+*PW`fY><YKskMSGV3PJj@ZT(g)fi*WU2iw$<Tv8%p zjo=4{J}NB?eSR$vAHHRfib0XXm!naBz$5I`QPhiK$4%oci-~QK2Td-ei9N-M#aJMm zCq9qh2BL)&5(O{ABsh_fdF&}=(<tR+^8zTbHnSMxFf{t4JKkhcyoP=HQCFPQ4v^^5 zMA98EW>VnZ*WI0{hE!jLxk%bh`;gD=XWe0oD<m02h&Db6zsoO|4)foVBca9}6QNaL zC%2{UeF;1C8}yv<@(JPQvC8cv?xMvZo5`SK&PSh&t&@xR667di_=R>cl|(&H5?5D> z!1AUcpAt=nxpQsnnp-c1Rd^1O)z(ON;Q`_8M1<==aU&Mh?vj>{0X5rhk{=ympto>S z&CthkkzRYd;daYl^i6hNzQj9AK~V8ww`2FuI|Uq)!#kr}5~f#AL&~bUFw7zGaMBSe zv;{U;D5sS1UxzSGU(d=~kvH2&*r-fP=+|eQ(?A>O<F5N)QkLLtc)<dPd5oI$q60>6 zK12GM0j~+!Xc7g=E9=ck=3Tc~{ldEJ_JxSQDEsyN+_uOU3Gu3zcP>*kR`HWwgGEa5 z4n9SKt*0vwhJ4L#SE(Bbvwv_9>%_DZVRCZNDf->zTD3bQxNaa$r0-mYPeO8xoN~gA zIc27)krA|?n-j+^^}L3H`mpNS%vU-^`e-76tZJuCA?H|S;+3vv?*u*tq^iNn=56gK z{Zb4Aw_8l$dhN@$kXFUwW(c!1xmp1Qd{@(wEe&DYN@8kdX_0()`F4wi;OJ(?_x@&x zZpBYcOlWczSuo~^vd5WUmo9)6CJA^XJ|P0Ckt-Y0leU51*0<{rVhafBtuP276AQ22 zo!JLNVjeF?2=3o#eK&zzOy1m_7&1kM3jRcb1P@XvjAVc3!ww%-g#WV7=2gG$HR`Mi z_HFVIPGRO)hxET?ahsqpQEpL~evs8Y3H-(8J53Y`7ur6L(B9<xb{+|MS4$=WJhZ;U zh|G(c!tBdqZ5yQ3?U1{FpTJ@x;MYMq<b~!s0GeLAsmmy9pe*7D>57F<DHzwO7#ViL zo?OIzxpoK6At^0*FisBr63aA4e{$yJjY)({Jyr(8)O{(I5wdg1^Cgr)P8J2?4K)nC zO=LSM0X{F8slv0rmRuh1T+$<<SXmnCbepZa_`deMZXqQSKZAWwL;_fl-u>Tv@@1h| z;85DvnLzV513V03K+n6>f;4^I26)V*M&W~aNJ`DnoF9H&FLQx983a11Ly{>EPu_ox z2Oikkr+-@AUKtR1g>M8MD8{?LyLjDYnxv|8KkEvrA&a8z^nu=fHW4}~hFEb&c+qHf z4OEz3&8m7n#7!-~M)ZAbyJ&TsU=2^tY|ddE{TS4*AmtY4TaCXD#9Smk$-#qm-awg~ zJ{T$0+4FJjn(x!7Pq&F?lHI^^R^8=?Cij{RELZieydxHXu3ibS(+h8$-_hb9bV{CV zHTTS@B@jJiXqwG|<Tt#X<WSo_8CX8Tn+CXtjoTMX(nn3QxUktqM{ND+=Sk%CeGzN8 zlw`Ej)`@7++dcnw@n8dFmaXJIpn~5W-faPtWCI3Kn<!U410>k(9pkI0@RmV#R9h)} ztv(7yF$S4^bX?7P(RS2H?BN|}EfgvwnS9@SgG+e8s%8?b;5#x-Z|G2=xt{P@pdx}- zyywoe>f>@VN!NO(3s^mK@@!6a4CB|FwUS6&K}bM}nm%Ueo5=ad`qhm^$IKuw*82)n zbf4l!0A?wDWJ1JV9|>UO#q?A^Q%Y^zqglDM<>g0rEhainHH<;_J|7M(vGH~!w#r5K zynYqhI^v(Bx0N}!uu&jl#KnGFsaJNt|C&I-+MUuE-^s}Fq^F`uMii>}JnW>Fc0ylP zL4}~a5uyrGAmEoos9W2X5674g$N#!*nmST;bjAy$>7%#v>+}2)lNgZq9`kqttMdwf zM$0C9idMh-`bCnZ?_v1IK){vFMIEQaK(-<#bR*;`pp(Jf-@Qz+<Eyr9b^H|Qw6sF0 za5OYZej&y!eclCw04AJ5&CU`Rm8OP5gx$|V7O%?m_DZgm?j7EFl(zH(^7}pXrSLm} z%aG@Ux5Dia5QwUXc?;qkz|{!(8J5o#`CcsOoOF1d8m%c27-H%s{u70FEc7J`QA|wj z6cHQ=|4?m38YzNdKMS_wXQqx^Rx*Aj(emm2Z`=-sa$mAu$~|#;P}jMb1`EO}i#)As z2s(sfNHH2EEa$EI`}&VlL4(O@OMfIFO)4X?LZg{$le<e^g9$=^w@@*|+V`X7<imxw zzLY@4-d4!{n$BkRoIxLA<7W`c2{kH)S%zxh+H-O&Tn3av^UcwqcWJ{ejbi!-&V5;A zHqB{3J@8q$BeddfDOYAuo)48T>y_jw-g^1OLw%YwjaW^?uJr@#z0zkHh7~%oJ;Wp` z)CeY_Ensa0Ej9Fo2bPma&ITG8eg9|snQJV&G+Eu$=)+8ZBLIQYB2;MBOD802;j4U! zLKRtGa!t5R!zy=%aEmcG5E8!TsUJc^4e~S2WM*zd4Li9#JE8vtY}R$No)Cf<{pN=J z6O<p#Xome~eW!jL=#CQB!P1FK2xeUDWfYI3j&8lamkiJwH1vW<vxBf1zHauCln3pV zZA!sWT`lIA4l+~?7}dqIcs>R3G)uz{UYJb^nB!*df)Y=V_v}K>g-s&CdrPs`sWKJX zUbrm8`LtVV!LKvdr>dH1ZG@&-iiO)h+m_Ab60l~spDJh@+juIB9>w*=`KW{p;Z1i( zv+KoVSeL$o+Vw9g(FJ_52o>%!cn^<j_(~I3v(=12Bcqz)e9V01Z*~1uAHQ@A3RT#s zU~+DFAr8%U2^TfO>J`&+*t+vc@YX!hjmEYSspzQF4Z6F88L+v5He-6JaH${6Yd4Mz zv-|o0<ym}Of35=Y>03&Ee7W2|s7Df$Dh!*Bi6ENNSTi>()TCN?YwM>6P5Ocrt8j(` z#7qkuXa)y!z&B(OZ9z3=3|zhSIqYIS!1m|A?YK##u<F6^%QM*qW%Q`f2VblZ#w<t! z;IFJnj&<G}^TTk(47JRKJ-=`w*uQ$d0^maIl_Xp{Gb9`!_ocqMX=o!et)pn(!zSd2 z5DrL04`anIOtHlxml~{LGZ@^nv^0q<cKZ*k4w6H8Xq%hq7^+j29(32cPa?Ye-13)9 z1|NbYBVf&Rc4MBX0{GZqRth#xU!0VL(cU#}b>gl_OWBj~_87;as_U_EyR6>p?T%LU zcDQ!tQ9qB8!zx}&s>;;$HQSZS9&bmA91e{cG^j9Q#dq)$@^x9Y-b5@8lNLUYklJgc zED@LE<pMj_K8)3qbUAHm-~txA2;n4^S?|cm*+m8PTV&i$Ql$Cb=(&LoSI~l|zW&fV z_wyqr_*Q1#rMqj$gw#p=;uCdh!{jP&lao#1P7bSPlM=$4Vn|47rqgP*kM~K<q6{v$ zkw5?%gO5Il6TgOXf%a!I0^)EEUe3Wdydgy=Dncmc(|N{Ai(k13ry{`U(LAip=aw!r z{x#M?1`_oOc3x@cf36<GOQ}`wQ{3HkR{t=zb|PX2kxJ;O6c8$i2Bt%=p90$V#bG>! zm-d{KJ`P<-wFP^5cz%vEBDLpZI}Q58Jp09ZQ6RiG|1rp6p=3F}N-wa7J)$ng7SG!0 z3n<cM<5BuSHY(CGpaUaAdx$i;Qk%l&3HeeBIv~Rdd(0*Yw-9ie^ku{XdH}eb2a6OJ ztPae`2{$7QaDBXkw>)VU!G;luzS^YNW&K4Lq;E<1P<o?)2Y1#lbUGd?>^h_ZfSpp! z*M+s&J>rdzru;p4I{veKl7p04t{f?l32&ULHpDeI`_A=;PiCNrh+RqmqJkvw`M`8R z9S`}@Ss{cvNmHJ3l{sVq?7pz?keUUPGZdRK6+wrGV>4gl0hjEtZ`Lpiq{=TdOp4Ko z0ev}C2KsV!^p)}VHo0_M2K;!kT|<~;X5^``4EWF=H3xV7)l(@+4mv57v-uhf1#mJ- zLw=g5-Hyw{6oWBVHU;u?EcK&>PW0h%<`omcWGUGD4KKQ2w+q_!Q&-R=CWTe$+(W2` zzca&%CFCTT;C<`NdUP$=8jAWd@6RWFoq1-+9sE{V#Cs`?iku7;z%oVeaVhJ7WL=Vf zz^9nKv!F`^T`lO%>&_lGvR)lOLtu|6qpt1<6Rrd6RnTSdy&LXb7c#HtE%Vdk?{k3- zM>Prz%MOB%!wrK*qCR2Au@jyK#NwgR`}Y4l1;x+cljSRH*02PZyl$L34#LU;8F`hs z=~W*bXgS)~)Yq>ZJw~Go`@lt8mC%3l$W1YXoY3ptZeF95Q|eC#XTQ5#HZeP2Bhz|V zR`+z0i-Lo_wQ4YIta}f>Z>g@AKBg3(P^imifQ&PpymAQKfQnX@-?UxL1A8hwaE)a_ zhD9WX^&4I3ryqAr*-BKv-tUKXN^{smEIKuIr0zN54K6NeEK%iKpm>>EC|S&c4)Xoo zZrV~vJ80~Ik^{)Q8tX$|BNO->g;`HmqVhwEZP+he6OPA=XbtI=7WK{DXObXh%qxV_ zPzIE|mGHR^sdfNEQlY{a*=g#-lEOQBP}k<M`2;+8KFeq|KSqcp&WjinuwPym(R8?v zDtewi(WY2&^WUVasaDGEiVvZL_>)48O(i?{Qg;!vz(7!PVT4ie4K1MGLJJ_dQa(Vd z7x4)qg?g?vBQRA}_FfRS5=RoFsPu(NCaMoB^fW2Qoumg<?=66o=YV$jZh#tJwQ0nF zHl$I>tk|ZXXp~E`s8VJ4C_F>z#n<X;>Ek4%2&cTB%Be7M$|+8y0Ph^7X5{yu70Oe7 zhatqI_Vu=Dp9=-p?Ec_^%_*FcARh-61T(_huWP3v$4bY$8Cq}{HQdUK>ELu5pm{~B zqF7)WwVFDkdFPBwhjOGM3<I;6%n(b}vl4Gv969P<z`Wuy*)){WZqOol-LXCkZ;(v< zNh$=8K1_osx|+DrryD{!IDAxCoeJ07kO&Oc3>2v80<R-`P}v*Yf4c>(f6XK6LMWLK zCA3c=_Tw6zlDEC2>bv#`Us&!PbZ|Ev9;nlND11mal1XH|3P|pzq%xweQ3+4KOHd0c z!jPlI!mY!qdAmW3OHrDDrhz+JH*G-909VNuU{Def4A>TPZOICdm14@k$7-lxZARbc z$ZD{su}XjzJuqShmI&0<U7O@67<}sM{Y{^2@@aZBYr^8UWGDp$JRGTr$^hr}%M8`@ z=$h>aBLKAr;@q)jk|x>W26wdta_9~9p=fp&du<tiYC2K+@~(LP_I>mrkw|gF0%jQe z-lXfW->VJ+bQYcN&r5}3xYR}CE$Ky~iXvUACZ1I#QgAMGha|*`rya$1(%aZ%f}^0+ z3^lNRjDy9SOm{tBH^9hvy>b&DL62H{0^5}pV8n%DA^IjE47N+jTkvZ+-bnS5m42cl zT7je-DLX`Y^+)Ak!J-(Hl5DqQ%zTv!us#aqAs*6NI{a6G7vCqO(R#QQG&>cK7(u&h z9!c1EtOsV)W>*0(GH`X-MH$=(mP{ILd2AA@r}$kHBIg9%3qQ!v0UJ>{HKuX8|A66c zt4%p|5Dg40&(!Dn?@tyu0dGs&fkDUs=Ts1P9A{yn4~)N0aF7S231e1t75e(*N0^_- zez9B}W5SeEQI2S-CXnNWhkrVvj&-)s!A4CjQ(9PHVnc}r#lDJ16&%PEXbzMTMM(bn zx#^|Y%k3jVVx-CJjrZ^z1~1eXo5ow)qe=1oN}3630t&!e<8T=h-hC;3<ru()J!&n& zc|B-BJ>uQvP;#(6>)dL5$qoh-)o7O)H+lZbVNOCq1txLMs^QBB*7Km}s;x%>cLLCI zi9T<#=^%^pBI1Sf^dqbznqWqa*Jks9ZI%`8y1*xO4=TUnV+<>-T&9ul;3YXm91*<j zl@hgnn#~o$b)4)NjE@TdC*`S76&L)GlkdgW^kXPVL_+<<2}5P2fKzh@g%|X@9kdYn z<Pv-c<aw|G9M>yS&n^$$k4?tc_KG>t8I#Vt&&Q|R%8eYi%xv4vc4}-o`z!_==S_{# z8b_EIUi|%f3@WD!w7wTU)a;HOlX7awNs8sYh<GyUcJ>6r2o&@}FNQQq*#a&$6>^*$ z%z^>c;|q?4++Z*vbW}Q>Y@{E{4DI+1>GcTlSn|i71ON+<(jO_8to15zD?B?tmAvKd znmrkfS@rMh?1Ng>SL+QU?j!?>bcFb186iV*(Zp}-mm8VTz`5{0xR_y$Jj$mU*~}%c zhtCXYxF`B0qu!?DW|q$*jV$CU*!)&S5!sz|4|B8w;ysw3j2tAAGpo7^`udIFZ~3D+ zKe}_}m@2}XGK1;u<VUYBo5!THDL@(Cp8BDA2_yDO#&aP8DQ=pPqJb7&;1H7N>Yv_% zQweN;T`{8)x4sH%t<UqNC5LUtuAfxqKZ1E<jm7z-B$0Q_XL`7}B@K&9R1l3fLbvzV zZa8WB$gj{cjMI9vkWrQk`L@+zK4uLvD`g1NbDU-r8;g`MMo<ND=jjhyl{%i?Y$sJd z_mQUazh}mL+*aQmUQDG_4CLsqUc(~{X8n9Wvhdd-a{hkF`#7xxZ$y~9`WeV@5OxK5 z*y~T1LLJ{r%PII;SQBIh&0F_1`vM`LP$@hyl3Zg1g{mXdsd7^pJ?htByd~dp)1hGc z+vH~A`TH)A?!!8|QQbu6tamWPb>~kYG*7D9%+aOlXb(~Sb+|s)^G(@;(;EDbsh0s} z79+=+H{5vIj-(;fH!6fg1chlEzEk&~YT-K_uv_puI*0=|O5Yhw+z3707kM9&0$Uj* zEv04vva1l?r*v^73*1jL9E_H12ysaP7fcrc9^Yd*r)dJ&cGQB)+51aLTk(F(xjBbU z)$5ETI&WB-)ZQpYE>W^D^Ca3wm0+wQE2hY^!pPgGWTS1(Q@+`Abf~>BT7(?-Cub17 z07qozXV%Aor=e#&(2jXlvV>@qs8~2?;Oj8xtcWdmlKnSIft0QtEygkCZ#wW3&lOZc z*f9ztMUmzYC%48+ps}nRC;42j-hH*1x;4YAk>@T3>=?N<v1JH{f%?6$lXU6dx2XHN zTEyQsO+W9-SJfq%q2est!C#hB4@}JnxKJW=AUG-Ax0yuGHm-u(%_a{Bi}2n{;c)YH zE0}cO$3h!Tw;0s&JXL;7UJeU1o@wUcg+MWol1j|9d}zkboN)5SNqLPzJEGbwQ7jWk z*iKnHu89(Rl{%{nto9!bIXVt~c|ND^12-T)7D<XFuknI_?ACG@AC~WARz(npkrOjv zt@w=aIUMtWJ_Q0J0|SP1MKN7Y23#`#ynwvok*q8Z8gsjl$sF^4Mf!jg<DvK-uIO^R z1?(3AuBQgvj<u2ah6kV>m%d=On!Eb>>FKGGx-We?o_ike*8I~edoeK%DFr)>i+of< z{ld|APCe<7M{g(LpD#0r&MchCg^Vq)QDM=QR6$P01mAbGJAj>i<&`=}=Iuj-r)n>0 zO7E9g*hvvZ$EM*stC+33n`THFfW6>wbFhil;sS8RK=Q!!<vm-bLrM;Xkvz!4sGdk! zLr8`<lXW|&U!7C|?>TdqTF7GjEh_3PhmMHr@Pz0&P}49fUd9z;ueuMWbYC+TE=o>w zpwedS5yeV_ERaB%r5QeF9|^mbnvN1u;L7Y)E<hR&Lw7gi*=Byt`L+=0)-=<TqK?C0 z?gz&Zd)MzXjP8<X7+z-Au^wGal}bt}k1UMs&AsiAwV;hm73(ix2oIw3k?p?HC}P-Q z05TTE9hXhIOQAZCYt~5jAtz#!B2xx5&bmw_`fu$fg>C)r1}he|M4ngCptwiwlr(zx zzDAKdXIOG%+?}vHK*y1ROuuIZAH8@h@_}Od?rodK<Sgkr%P6LLuz2ZR+w-a<21MB) z>!8&xiHJI1JX0l+QWdTu<mq6lnT5zj1Ja!Lxyr<_DL)<@t3^(<`~5|=DZA+=*g4ml zC|C`S74?Fy$U9Qcw-(_#3(()oYCpfykL$5?TAQ-5-R>0s`2CxBcRliFfB!Nc_)j(* z2(CN`ojTfgPPwPLky@q>LLUs^ZS7Vm<D3g}gs8L+0x16ATVnfpVjh~;kw0m8n8Xvz z1C6k{L=2ARM7<NA9aO`jU$0-*QUgI3Q2-}hCAeqjOBjE+A}U;%Y%N8mTxKemS<UQ7 zVot6knK2KK<15A#TIl1Q<o?ZeCh)-E!k>~d^-c%IcIVd!(W+4sc|xs%9Wrbi4*M2s zB>wIDxJXIM08hSQg?<@ZCOYO%U9*u@@8$M=W=_&QV8J?wO^XsU!MOH<1`P{injCJo zghk;Z*4dU_u9?#VQeY&#hRyV`mnmdNpOszyQyMc0LKwYTV@FW?kX|J+mn5h<|4!i_ zgN>|sV4Kt_8`#c&riX>Jpj7U+Dz$b;JEeeJqPzd(spt8uh}ECx@78wh^<);;qO^WG zHoy&rx#Lc+7#Ot6N19p|O0$O)1{)uZc-N(<<moHNpB$Vby3b<M3wHV8#5o1ku^^4X zy~De#Zhsngg^2vHj7N0V@43qJjikZ;Mf^l65o0{@?bE4LHkdAg^}7f;)d^U?4hM^F z$KN~FbTC?QZ<PBWB_nbazAY{$HL%sG!{|i#_2ifoATCm$GsrX1?rgZ+YVKb~r{AP9 zLZ0Y+a_T`{QK3ZQ_PBT*Zc~N3%CJEr6DFn_QBLx9)^%A0mcs}Gexo6vOKniIL2Sc$ zlj`w6-|5x>8RzcR%Mb{*mm0q+jpLHFX6_Qc2<dx?xOOTVxYJIzR0?NQh7g?|?$3sq zmW>2#QY`k&XqB=0eLvwfP?^3tk-Ok!VbHshSGfaah??uWn<?#F40`yzy+H&Se^dd- z9l=Fyt+ZNh<0eIcp$>hY^stE{j_iDQA22H+oLmDB%L$=M7m?`Sf4jHvfJ*c8hb&u8 zbGsv}oCuCv3pF-)6{@9(sITP_<)>I-H#p<uq2v}zS>3P*pP7&h-W5*@HSZ#z1kR%3 z$Ot7L<&wHjzgu*1u}RI*Ss$+^`3D@5yT_<{GPX#;&O}32GD_G;KfV~Q@JRtQBaKj6 zAdb6)1P#d^q;a%B0EIZjc(uW`YLpv|F{S_7@i6B?hnag7-ZZ1en|A7&Rfq9j<d~Lv zcKtZ=^yBVccL=<Wim8@4bB&qLz!N`tp(fVZn$uQm@Oc+^TrKKG32(b-=Otdq#lS?= z5VnV~;ktU^r3=g|6kaL8M188Lp7zH)DeH{ZjF~O+u8&7Oaq4Ht)d={~hlEJ5|G6c0 z@dS?^Ez0#+K^-%E7YEOlDa(c<nw)lVmnlcPq<k?ghJi)p{axZrW~uaCNajmF&_MVe z{-I1RG|z>OKbc0}%Z)O30JqQuL;_V&g*k(d19|Yw_gb!o2pnz=hL{}OCpPc4+WX=j zL;sqpOQ-S{p0F0J8_`S|Jf-8HpT(uST?iT_WB{*Azce!u_b7K8bsSej20iu&fNU#+ zw$c&@8w_81<jOvi`O&F;sLvJ%&2X<P))5Rh-Tl7c=IER{^U<;?xi-mtQf?(BC&l=b z8kveDA8ujgt;iZ1T%I&PQy`vqa2|s5qGUhDsXJFpt7*^W_EBMFQsrBp43eqtDG(e* zuBk(6L9X^3*1rC(tJt7wQ~Rr4a9C*I>1_G^u#!_l5*tb+YNvw;A#i)T@1{$8QK4fp z-XcDwt3dRJam3CVVe2I?O`n%h10Fq9IEf&<op#yQM!u##&K?rgwZG9PaZbi=;qQcO zNftz!fFYyV*v2cNP8d!kUF}w3nAvyP;ZahEO$-!Nt4z;*Fe_2|{f4V0!t3aHbBO`$ zLuVkDo}~9Mnz*{+8L$(JsMT~4;4UOQn!)iB56{Ojq~IT+Q-dbtji(-os)ju}&3gg5 zZyVr%_iO_h|5DLItk)V7B(a|t1s2cQ>6lZ@NL+jZ(cwwIuy*I%^~sA-Nlc-jJ|+Cv z5Wk>6)$;c?UGXmdnAFjwiF5TvSJ9&7K7j=|Z{!hGzDEs6C7I_L$;01$bkQDRy!7oc zq?fH@&x2}px}|^EjL1ih6$k>;M%4@gMm~wr@d*e>A~T5Aw4h|8$>uCy=-%dv<WOK# z{3d^A2L!hj$bJEn^J~DZB)h?s%k9~64ukT}j#ax)kYz;FO;@Ho*AW!Rn^8KI&J4MB zn@~m_9#aoxVc>fq5vXbwu64r|N8;e;?Z<W<$E2hSZk3qUT62OYuMsWjImcq9wH%;H z)vj_<D+<8gsp?XqDF8F(<b3R^gy&Kq@3+qeC&E6$!ZdiphjTj8r~w*}`}<#8tO3^a zTgk3#VIqa`Io4s6IY7dy;MIshw?DQxKG&jl9yXV8TMB@%t+c?CAVe6@!XbX;B;TMz zqF^VIN;)?49)-wkIxk+=vbeS|=*5;teh!T_9@X8{gh84Hx3{o|N~gJ&Pen?d3hLJ5 zwMk!)7fABJlbliIq?UFwk=~v(2qDis3C)7iCqfB3ieW8B>BHa3<#T}=IW-@61b*zL z&Y@vO_-32|oc}OUjPhKQFmqRpAYO^j&gUEGFkC1v?w$U<g63!Au7X+j)3jkA!(;R^ zK?30?L}9eH&5KJbJ9QBjCR$L8dC4=R%?*)Cjk16pIW<S%GH8NF6e{e&*t7`Zd=P{% zM%6UX@Wz3R+av&#zZc8$<wr5W3k)w3^R(ngbD8&~X7YXP^|MRD#c1F}+oTrpiw7J& z@URH&EnS3gCn0Dc7CXfJ&}uH0N;Sgtt2p$Ab{X6L?Wl;%j=002;M5jDdtO!ZH8g_) zmI?)+l{9o}*n}}Y-S+pR$O%8)%7aAD*D%2jJ^By@3FvP+wbUQ!HHBzJ<#yz2N)|f0 z4^i}&3iO6B$W|@H%K5O3NKZEUUAOup%uIQY35EtlBBE%k7fEzP$ga4xTVJ<m{u^r? zY&sL{{6)y!)B6<z8Xh|3R`h+sEIlTH`H%NAm{|TH979;|+Jz$}vx6np<RzTAFCbWF zOd$2+?8#{7me2FFbncMRT^|@difQDi7-u3`un*^R6I=rFmD(JF6Wdh!<7q^^@zpXf zCTt^|r6&0_jUOazogZdPrT@qCNXYBRm+b_VHu3GB31lb{N>qwR+Bgi!qIg<2iP)rw zfz~e}4B0bUbR8#<%_YR`dIR|Y+#%s{l4NT*;mw))UXRP=QbS>cfL?_R<2Ey(O58mx zyP-tBkie-A1l2_I;hO;;uKA;sX<Q_RV8~JGX09kN>RE;?XghD#`sDi*n;=h=eN%;B z1GEeTH12)REz_{gEewzlz0AJvPv)M~7RTQ2AFpu+(*4H*s6^=z!<qtr)*2OpRYLUq zYzo96E(>ugsfaKYXO5ccWNglICcIG$$k%?h(_qvkqEIIE&I?Y^SBAx@r7EHcef(}4 z$voV^-M4PmDE#`~$YL-N*#eWWW=AfkBjtp3DZz-^O5NhyD5R-?hB}xhge|jHXm(&j z%hmzSh0G0CW(@FXyHKT}p;XAqP+97RJ$QO%^reY6F6YA9=NN?!vy3Rf6qJMex#g}~ zgdFY{FbiI9n^U9GAoYv15s|{_dQ#`&#%IoB6CPD^{J7XaS$Ebt!$!oV#m5Lq%!Q*m z?y=t@stjbnh_))wfuu`!g0))w?dxS$k1H?)?E5#!-yeaHh~}4v1N&6vh~^g~ovVwz z8Zwj=L&C&<AeU9;s@2qfD|T=}N39atk|?=If9+h|!`m}nAJ{?=9DbmFZwSF{eQuWT zFDW7>;^HOcISePj%MBM(t_X|xLF+0Q%Kb8t>=}+fM{QRR<Sw{oc3V5?#{i`_o}NP! zMlbHcbLy!qADv-c7J>raElIu_YxrMWy<>Q1!Se4L8^74LIk7zx+xEn^ZQHhO+qUhA zo!soR|L5Lw&->NY&+4lFR<G{r&$5yQ+;Xp&P}kp#Qun#HiyRM7Y#W`@NBvwV?@<6o zMilRUKzo6T1pE3pPN{eMw!_t%JTTzcXhc9w68E>=%E@Lx6w?2yanUYYPcrO`nbK!` zM`8!Ul0)!$c@3&Z*&G4OWR>3z7z9}4Y6NbVd%$pvwhlzxKgaT<@)P(D$?^fvBc|iP zZXt2PQ6P=C39Py4`A5z+9`=|#1rkXI_~l`ybrr}Lphg-gV`BOWWv%;;hc-wd_Hn3f zs7;kQ<_i#4W22q9L*21ygF3fI%H)^#56^vMaHt1nkrqWHUX$@$1tXX27>knuwsqe8 zrh%Tpp80h&!h(W}i<Hxe$H-Vjb*cIalKwlXJ3?hn^oK7d1o)>X{|G&hIhgDQxpY#C zWB($Uh+DcZcrGl9lt7fcF$IlO39dI~u4D*1e&bD)-WDmI$fSWPonf7&V4NoXX$Q6y zMgrDGv46bWh`gH6F5r#k@<$ML5zzH*7nCY#t^9-U;q7OTwm>`x<V_Td8T^9aqdpsP zUt%DQ)B9CHF~-Z$zx%uj{{<|9<P@t0NguBD!Q6}WhB9cRTVlkDB+NC!7SHdIBX<o) z%ePol(DDFAySzq-Z76T^zSTty*6(mVmkC4<^v*c9023dm1WP#nQsQTaL=K$6>4M`Y zT+M{&q$~zJzAOc4!uM|qR49>)_z1u&=<!n}xsT%pzg=nA7iU4A6UV>~o#}9@)d0|< z3>$WH*)2sBk0;uFYAT|Yp(j|l7x;D<46>qE9=VZNeHciuHM`eu{5E*y<?(#?t(fla z-5&OA9-x@P^U)>EE|H<m8oW=!Bvz4_%?3INCiXlpO%C`cilzxP0zKme2f7mTTo^vC zryiA6ub^eBcfJm05LE&41rjAd4G&S%+W};|?5`&wR0^ywdi1L!yQKRzWR8=5KtSn4 zVDB}JjN=Jv{F5nmb#PB2naOsP+kq!4lIO_I);)WKNh8NvB2MqnMkgm7nRSbC3o1}@ ziZ)jF+ait!bQ%y9*1FulaK`}JuJAk{Ku%U6XZIyRSwWpP&$-b;7)r=@+IK&>dg}N& zqm9fd`f(AVVed`o5!E|<=!=68R2`&C;A{Ll6U;Dn+ipv#2r&@?MSzQUA%S<`&5xzG z=Pd!A5g0Wr5OZ{BO^>8JXaS*NGQjO`F2*r<g>!i@7Ie^XA0wJ6ri|I4w^=P3QcUsa zTR}H758s8^ITF%Xakuk2qub?z6*8hcn0oqAEU==|$XFN^Gez<WT0#`pc0Za)vm9|@ zv~T_ZQYloX-xx=&$_<!P^UiQZfy%DY!lnTRy~-+vBvW4Pw_*3s$$rP*iMn5K-2Vyy z@C*ASm?E!&9FUv7@KS|Q!WH-X`|5+xcnohs6oKBM>!8hu>|&Xu&-=6cJARbzlfzW| zt_O!NkO1MG%NbvDHb-&5vb<(XimZz_MK)v~;w*J4(YLL4Xnks%@rS@#E4wru&#|Z< z3XixWp8LL5#`CMtWn~KfbX-L)$B*p9sSz{cQy}V`RkaYbGVuYDkj%Q8pf_hY0T!tz z^xg-Xzi;*+@5hTkye**`&ps~I>fpdtBc|b;aP1K&@u~bNllG;#_6oR!xE9e%7o~24 zNO)1Ew<5(`D7#NV(bQ7IP~ho?wIU$#@~>!yOy&P2HK3Y2M3wL<E=!PxLv1`0Bxrs; zg@O5b$j%|L_iK;lUx7R<s^&(v7OoFLQO1S{PD<S-xMk_fb5z6h5rxIDax`q7;stOl z!0t2ICz+k&!@$;4s_|Wij0@>va_3G^5>l{%A_~gwmw4mz`km-GkYMKEZXf{Hv?0jX zrDxFb2hs%o+Sh*|P_-@M8`R)=ilDn&)n1Vx9n{`Q;}gQyY*ju+47}^8`sR{ad5X6} z5A;s<bN}9N3%c86s8)$4eN78L==pjVw+A=?BciO#$2HG$<Ls;>e>-`2<6iJokRko? ze83vmLI?w%cC_?NPq0@YvybWP`9p$Dj!u5B;h6wrJfZ95(tf8M2N6LRY>aF8&)$_0 z9^*(c0DdA%iqB|kihKQ-+K!1y6UXaS8pfzi*&eK&$swNDPUBMmZ53azGT_!!t|_xs z=H2kO8ZION3!RofeN`7GSCSETx-5AwcDbB7<1`{jK~JQ(Cbq?gL;0y+=@oOl2~TFh zewT(6jyrs3ldELI*%Tq%yz4F5&^N(`5h~w{v0}M9!rJ#<&L;A=z0pD5#6S;6Z9fy3 zG3$pEnLkS2un>jq2s|W3Z`UsB=TlISJ=ikk+ACqKjykcXU9Bz0>IZ4&!|18V{1$$q zK?V>25K%{S3=#fj)}qZP$XsU@$Fb`<=oa~sTaywX_owG`UVb*}PW4E)nMzdb1xuW! z*7k4W1~vLA;vD+17_!)*?LBSzqpdKbn;gOK{#!0EWUi802a4xOd;)>E^k+6dy{g)< zd2vH=pNmjTsu7-4-{yHA!Bq}1-+NZ1d&Vw;gnNOQBPuhCb1S4%OBUE*+|5usdgE4m z%fbBJz}wgF4tc)UcV7Fk+3vqO^RR8!WXcS?;kS!jf9eeRNo$4Vn~yePMhoQ1i?R=< zK}QZfd_E<FYQ0L-vh}$#tVir`+T>`zfm^Ex<$4}m?#0HZH|>K=tIf4C%4bW2`k-2& ztf`?knD9$wlOu0kUPQv~ZbcRz_6W<tGJKF59Fqi1Kp!cE35PJVEeEIQDC3kp=8Y9X z4flgKyWxjw?ZN!Mr%_x+b#J;<f*&tPuxddH5ad|z9z<1N_jjRRK|WIjM6ZAu7ff^N zbSad9Ao;a6#=ypcX6ie#KQZ|Z!xQtr7=FXe%~7!7nh<XYBAY&<$!r<DJq=u39-c+u zO`dO292V*7l91_rex6k&olhni3b->t5SXAi9m^0Ojtv}q>|R<GPG)k5z|&40rGc=x zzE!&dm*m&{nMy&e^$_<zFM?A>Au^h|@+~!2am<~}0Z^2k@`TLa*EZx@2jt<ZBRuUL z_T{B6!nwT@r&1`qCZ<0P?1e4G{P9#nZPbBd5>c8Hxg!;^ySgPT{TR9TaunYa>f@TF z7>v;q;yPl#8H*x$AAJYF@<B%+W`|e#J?g2w{msh>mm9TN@otdK#K9q@WL2w9Wz)dx z$sN#Cg$3P;0=_1uYW7AVjwH}draQ>hd+lmF*excK+}?JEiy%{b#&kGjg!5~d81doK zJ+tEdLZ93xTF<Khk8X+v8X|5a%|jZZi|Hwl+K}x{rvj)1;H|kilg3;_4V>HZ5CjW- zkNiWt|1nuNa6@CW=}^S;yoY^6YlE?gD;GnDpq1ibLN*bzClY&*hOX<Q+X;@#df*DL zjqgq3`CU#G4?O)W$$^{~OlwX1v7m>>>d+4;5>Crjq@`&t91qna>E^W#6J||=^C$HI zXLA{	)uz>2QoJ>{~SiZ}muRWgKbu{k==<(*cv+PXU(zPQx~)X`yHYU^AVu;sOI< zP<0zN(Yy&jzS;=c0|CD$9<p2dr})s3MnVeR?Gr6H_pE1<2R3ks$C{uqSb8A@RTx@) zmuNXt5eo&-n2ZUmsVb+I(&Vqygc@Yiz4@JBLEt9c1{T`OD*fT0!?WY}i!iSZS6os% zM0(hF)%JC-^R^yO=YicM#g_&w4Co&(w#X%c52H2`K5k5ofWKgWB4p6Fhe!J)b^?q) zsT6r6E~!rkv!-{KQOMlzB^2Q@K@P8yiT)=k?!;u!qhtGI%%ke(#H@}&&LZLpOM0fN z;pP0Gx0XWYVdiK`5Y<||KVKHYF*v$G8d5Zi*jx=1X`q7OAlWd9v?UA|45{mBLM@QU zx|NR`K}gpDEt`a(S=?}bj-+kTkcjLVfNCEoky071SV%qMvU`9~DLg{5sIgV*wF(Lb zL1{dLM?b4lofk+#4)7u+KacXfl`Esi4<nfoa4G^$SpHB52p&5<evwN9nwc{U8JuwO zc@EA`pK2xF|9u(z*^crRaGDXI!$L6>Le=tbQWAwFa%9uo{$&G$KM8&Wh7_&?Q#?xC z8f`71;O#k%|Ko+3?BEE~<kpFcX|_J+7cI7kUXoPkLvo9%Wdfv4R>jZY$U0=IK_EnO z{!<#~hoyz9MXbv~d03T0y!yff<7~qP(}_ef)^bXJ8)w{9lL|3?9ohc)qtneVk#+sG zy0tPkJJS=V#X)4u<ZrvYTa*y&_lQ?X`wd~x|ABq{x`(Nn#mNwDZfANCDJ=mWiIZsR zs>!RKybUslk5QC@Vb#mCD2^nOVqiHukQ%ToYrMK?J3@eh1>prda7qlRllA@Zc7hze zz)NMH-vv@Exa2JrqeVoWzz<}+FX@aMe_(5Wdb~%3VrR0sdg!YBi1)5=bW}BBWSvNW znhk%O{-*b~_YTY<b{NL+JRvgap*o3Ku}%(W)reosJRYj5mJ1JD$BJgEYbTG7i$O11 z@<h|`KuwFB<HuiDa^0q}pWE^}*tIe?$j~BT3?7Z_mqb6ao(?fHc1h9*we6J;2ZlIV z8pn`jXL5ul$(-pI902?EChWjelQO3Bl6VmI?`zd8y=%ke2gLVZ7QlOQ*=p5xd}(z} zIkIkI124^<3d-3Y;xNyQ$`Gco?lGnlsep+t1Nh!OF_ifm+(pd&g-+|Y`|Ha@l>%as z8%ImRZ$k(g7dk16*A)+2?0%#oR@u3IqnCSkmq+~HzDZ9ndC>MJE~bVFxYUq)_JJ1~ zw1u!M`>W`(0I@@n&(8yRX7G~-Td9iqJ@FZET0^{XE~-^c^nJA`A`6%CUo69;A7_S# z!i`7OpXLg1C;5K6j^urJG27*1aht6dP@$OTGguZl6KnFjv&Cjz2nKpKgjK*+mE%iu zVABe%&Wi*yLe-^BZ2ANsBMKiD@T+>!iBF*%_O{jH0S<p9z~w~=&_$SWQYt$|GE>Ax zg@x(;iq;x!cZ$OTVS&q(d@g;p_0XE_4|INq+%vpsV#Q$wj1fvWnP|&!y*LO_XoB){ zYYGg#3zgM0`@!8U_<4}xOT40HQfzxok(w=pP#J_0{gTIsi1yf!a((o=g>7@!EB)|V z!cSw-uayd{AqKh7FZf<;NSAn-|GCOE234@IxKnu%6aoBXg?zSMdq_N+9|0<W!e+Ik zB|VwyYt}BE+X~6|g}O+hZLASPK@Hom)6j9t^86SCJ~ZBO%e&L21~Di)Hg!*dg=E#U z31qpI0+E$-R1eApgqr0P)G+XYO3^1q+c;W?!5bT!>$?9`!WU1mS7OWo1(!WD%FiOl z&&b^(@bxg9V*k&zn(HjX$;e~w1mGp{N=3g)m1j5{VJGm=#9=)EcZgoK-6{LksuwT` z6Y^|Q$wykO0eWsa9d(<e+ufvM2U6@eAmYQmei9X}>f11dzK`3+{nepzY!IRgZilzQ z3m&cU{nf*8^i)B9AU9*%hSQxl*=s1Vt={}QTdiI?em5Zao<Y=*LT+U#Ls1E@G{A8} zIi=L>TeDH@s{uN2vln0tWgt`0<?+-vth0@Ac_FYbP+>N!4D`rDQ@fmc;xMew{|{2X z>+cNH>%_&xQFH|bjaRzvCQpfIywbsH<3;TUeg?8GAPLMq!ptreoc^3Ych!@<mBuib zbks==(QaE(@q^3O_7wPYC}z1ou?q-S6?en0m2}pOs?uqJl1!eJZTnSdae`(1bRh;O zD-5u5I|BzktGnLJuH60o_BU-~q-No&e1RAN>O?`rBr*3DgP0|{noUg2Vb!{mMXoOk zsX<j1o7<KAJsSQv6q6XZ*8bkxX%tsBh+N%(AL+~=dG3aGgVwOuy|B3(VqCq&G;u7# zHYgjG?NjCDJ#Ug9KfJ(!BBmCc#d*<lx0m#i-%;yHD3~8V(NQx>EueDPy<@cG;(2VQ zx=X|^uayv~G(#|}l!ya~3;9hxNslFFVEQs{r6<;B8}vk-6o8aGNO&>MKUCJA^jl7* z23<@_2Q16_zDxd^+!47)Vq$dLb;5(x)FUPg>-i~n!3s-uq=ifmV+?A7`BzHC8QxD> z=t8E<g3CtKv}(u_pYDUl!CzN8V`{F<HcE)-NcO2)OQ&V5bdpTS=Sma`jr6taKb*vX z%+jn4!k0Y-3XDd12IR#^%}7z(djyV#z<6>B32Jc%B`|%1;)TXU;Sto75|9koXx=Bm z;m3ZF&d*-EwA&FWx4U#`W+2myxLV?Cx8fzf7t}Y@Wy++`l)yT{9F<F5?I5=D`6beh zU-<8ME-l-o2bC23ak^6Yq$vXvEHQxm6?c1x^IZ~CluU^)`&arjIP68lOjKUef9YUI zdv>^W0u&`Y`TJ318Hq#Fh^A3;kWTIWsrl##?`$`+DIv+%v18q{NWjC&J`na{JLIT1 z17&5=j<xAfH6!fZ4{aaF#;uOHomawBzL2Jhx^bqpUR~_k+uPaXDUYzR%o##F8|wrH z-q{|_ZvxF9=iyAqpfi2hgq?2wKwd*$5OwP-94B@h$BWoa;Rcl?Cw#M?YV{=2A79Tw zT5MG6be)bEwFJ`^?+P|Utlw;CjiBsZT@0xez4Z_VQfPWnt6kqvi!^`9&_-%&tMFc@ ziMLBx?zh{$>VG{3ei&U-rY;TG(Q-suo+to>bA<iAp>g%NK{*QL{u~6rEHx4q%w$_+ zt5e4Gy1TLR@ZT?jy2F@$9|$ggzZtZ+E-z6Ugxa-QGG=j|5?igdBTf_U0daE6o>j%E z<;&(`%1J$U)+u=VcC$N)bSlW-J_Ne)vH>TZ^5=MV>1J=)Vh#cj%#3%;&qGZt9WQlO zN(}R6yeY~492$Ah3(!4f4Vn<C&GWmO2f>ZdKV;L4{2}15EadbsQu8%vYrx;knm2O6 z(dy`FH3$*O7fwg2Sx3YRks(s`Yjx-E5)l)k=f>Y8GF}T}ogBpcb?v4#G)=-ekN5_B z$q{a`05gBiMD$wFK;PTv!r%60fEMmVW(I!S_i1?e><}_Gv%N;>@DB0Y$t{TIV;=c+ zYHGn4L?(ZEpG$^1ass%&l@y&5r+Bv#XE{Ly23t)AWXN~3scxE<#)V4kY1l<mK6mvx zp99>e4_nvqkBszo!_{ps;9QCej$WIh+YoV{n?z&u><n8}MPO(GBJeNRg?7pBBRTj7 z3X$Avw1s_wi7{s6^aD&XV?3;pVIUR#mw<BvNNL1rG57R|6)jW8*W@It@Qn<c)nuav zRiSO~35$wcR5>c-8=8f8-}|sXEy`r{y_O9H09f6plOS791rp&9aN$df)<UR2hlwDL z$B(d;7APY^X6O;_S~@2JQ-ZqzQeNb=&A0VG_)XDh04|$NgaIlorPLC*VOP?XC#kT! z?M;Z|daPEvcsGuHQ(gq?uaP@mM^vy292-vH0Z6|uDbjz;h?(Zm4AO8+@bprRmm2N& zsXR@#?AXid#fVUGmM?m3nOC6uW6<crCCrk9-gk*q5&_w(Qwgcu&?*~+!`)Fe(!JdR z3?ugjc^*)_nWiaBh`2StkfDzNhd#RI$RXg)gSt^_hnwQmVe70D1Q-O*t}lWK#x&w1 zMoLdbQ@9@t1PQQ;4{BGcA1~t%0;WRuGBJdI8)iq6k3+oT4>IVc5m0E!@&|U>0>{qH z8iZ0iKh)3@62B)ntro@^#sP(0WluVTYz+}~k?YGwS>K1x)ItQ>$O`C*!?OQu?=2W} zWlYLs)Ia4+!LBw#YD<UW-v@>A08QR*GnT<s#_6!Z)<N#m*ie?x{WL~rj<C9ld(#ws zPK(@XrpLVJr0+7K0Fb05ww(sqyduGW?xQD~h!eW}K|089GEi@Xi1ESq>{tscvd5w? zlxPVu^g9wiWJdeRReO%CBM^tiW=^k`tZ!o1`0E=8jAyhY=I=8yvrIr*B#TPCVE`Fe zKC{eWo8FlfPa=uU4+20P$!Mpc4E|qm{+(&6*_Xq`kXmk*F~woQmt6c)Z}jBMj%>Kz zr?G9dnp}XQFh8M1^JR)Omgqc2yRgwk3;4%)56|W3*c3LT7bUMD)jkRVRk<R}hD1bG zEFL#vei%-UI%$j!r$#)=fgPm|Dyk;@E!2HMLY36zysOe!1A!NvFyVJhA8?d=uC3`G zCYS*uG*#++N+53ZY;#mZe&j_P12yy<Fz`=3+(6yLJw2}r=nN4Vl1)Zj|IId6%Xo#% z1u(3d2k*@Ah13BM>G3=PGzpnP)qI`;dkR5>oPNSPd$Ei}KNNIdnkv&jxi+>SnVdz3 z(e6yRZAgQ_F%Y)m!0IXp2Gln8Csi9FD{){peCy%dPSUd|C*6dB<4krrzOrb@NsR`J zN2YHhxqyl-T*4PO@JfOURtkuYrx(2@$~gkG+ZFUv=iKj%2|bD3<V&y+Q}{nQK|35g z#B~CQ>DU$M^u=ZGi83jJE}(bWI5?EmUhtjFhA9%X^=917Xls{HcU8dAnp|mx1gWpT zbzn>{HA!|Wr_t^apq1Z3>VB{rBJ3cJoUx4II_+oSgS8qNIjF_`4Luz{6&&*d9stbf zeOCtLmRh}gVLmWw7LW3}D*PqH48bJ$`;iZ$%%sp!OW~G6xkwwXCMzZMp6K)lt1)l3 z8Xu@?TAFFoz-btql)zYCrb34!TxMT-Ng*uAOj~~1OQ@PqB5|y<P>k6m3s9%Y>P*~% zV<!z|lohKe*!@t8KH~tPCADJZk_MFJ5GaNt9p8gFBt~g#mD4>>Ferj&30#Bd#?>9I z0R2z!^dxhK>BgBHYQp=up4I6~ibO3|;5SIohCIf#oE*5CljiP&{R<j;!r<03c|QMi zVl58#<^t|?m-8*<Uu-aKsDF`~$;Lf2;+@d$sGfCNRIN13+HBSNGs9t*cmJfK@I623 zHxhFph;w&p#{^;irANp%9Qdnu&@p=wAJHKdY=8-QHP^|E1w|Z^<w}F=lXQS;lZ;nZ zN^_9UJtpY71~*`|n3*oKben{i)Y041*`h(dUn_qcWdt0I4@I{gEwE#N>=N60!fsRB z_+H@2@9tG46(Ji}#v#pxfX>5OMtUod>_qKMKofH;2{zrjhPZaS@clWNOs@zrEl6l| znB@OU2lN5~w>(_*pASc1a>x&^C{7*%IodJuw@qK)Y|*|^nIC!T1RDX!M6&`sc|5ID z25y>`>pCyo{U~WTk(Hg=6V!{BM#BQf;lgmK!dM(FamNRM_OoAac#7T@RfhHZVVrnK zl!XCZEA?!u5pkXvY2ZOuvk{+5rvt68aNKWl^hyG}<$(0urrCse`mF28OeU=JWjm#I z+AkXPJs{mg!bnibomJJ%R_yMCZZ-?-8!D>|0>d^v#A4RY?Z`kyYFZ4Zw|QS(6RbJr z+>ZBjK+1R%)@N1rRXmb%Kf_aUq4S`0RD{4z=ZCX^eJU9mNWHKJqhj@!##6x{iY{nL zPNh0dSBFgtZ>RUUjpJq(@gCHpo%gi<mUlwM@XrEY<?9;ZQ)GQv^D(Y5!t6Nj$*-so z4S+&qLHi$?J%+}WN^Uz<18m81-i<QK6M9~@sJbO@g8AR|h_($<B>bQ&sWsesk3-$d z=&`W}1cFt%dbpW?J;Kds+V1x=h?q&lI<Q(j@@jH1t)hZ-@|bC=Er?k;^75fKrqWQD zxW^!A*d*CF2)+QCcFg9zhf;3l1TWNK!ywW%7?%JowcnSGgu%7Q0S%N9EHp-AUMW=9 zuq^nn_x&zU*|B#2yqrKvRDB!)CdIjH{k5mq`1<NX_(G?7mD{Up+%S~HTqaeWAqk;a zGpDDnA<wzWr2c<gTIYVp|1llO2+-y*Zu-`80P2qG?FEC?Msk;X!UDG0{uJnilG2;l zEjYN64pFyICSA@#_z&O}OaN^31Dc|5=~Zt6DWks}Nh6C2k_Vyyjw=%h`zkOHn<=fU z?lu;g|CZMw_s)uvLq?Dmk);8+f#`N3Aqs<$;1gKY8#DypKoSw4G)Ow%SJ?JfH#kv$ zPS5L?90xi$u^0;Hhdm&01{)WmeBc)E0yDx})Cc{^xTH0b3#&qbxd`>ujDTt~prgh0 zWr|70@fZiTJsg;YXk&?$zR~q^W6KYtc!8B_HFmJOo3=`#`)%qMGu)<OHoZ;gFPtNX zRGS4;r3meAy6o5arFthe9hbd6ttXoWFVkDA;i$UgQhXzCui@t`_2+4h28UGNeECS@ z3J*ypv@iecH+^2zN$MqoVW%2=*j+kREmC>L-(+SWc?Fz^L1VgviEpD+#37*(+9U`= z1v-Cdv_w4(Pi*61UgT~4z^BGTYU0j{Sw_9Tw$jFLhO<f5{?46{3Rhr-r$q~O?)!PR zp4!)+{VB;k!bWUx1e01g?VZw16aR&7e?A}SkGl;XvT?>(360_OCBK&XC<_*`j-LwQ zf{UHmSC6%u3y14UN_*vJBjHP0*7&+8)yRmj&>R!A5>9!3Lr7383!*%t-y!ZF8r8pq ze`zP=uq6Pndg^87_=|YlSATz*8C__TQ~hYEpUZCGn*mJ~WGIqJfdSED6o?&KtP2V0 z^gf4csUWk1`!MXTW?auWo58gEkTCM?QjQOLkvnFm?*V@7FAQO&5|Gg8w3B4JzN{Oj z(g;!!Jp(SOF1e;tIs^l%dGqAdI;~}H-0*PWRquGf$Dui?x=-5<=F(W}fSh-ihvBT6 zqMb;(B83;0;0#})5Dp{G`w%|~o+030iaL#<t5d77{Q&~A_HX`oT08iEDQ+C9n7f(3 z=iEJAeeDm$8@?@FU$;E+l|DwToBxAy^kW(B#fq35#WI6O-7`|5G^f*}*j_L=Pd_6$ z8ZR3lW2phd*Sk;Z@ZsWTc@T{pl=wHRzG;g)yUtIploeFmpr3Ztrbrsd`cKDa1uWsq zM4Rq^As}aeinWg8^A8s{71j{FctF5sy?6CA|3i-yc-HGBXTH!f_~V8lGSCO2W+Ygb zG>fjk*tW=xo(@xQN9g*(Zm4B2LcAuV-*5zw5QziiOWxt0QopVb8Y6&eGW<^u0hqhE z6C|v9EXBSHYB=xmnv@p?|FJL5q?fwYB1Y604+B|zN2I7lCQA0tLeMN|l#wsHOZOKM z>vv{y-0?%^Q(hDX>V%gUhi2RFlHYazGhU}wn6)Ow+sni%ZqqJstA`?41RAXO8DJ?l zHeOATCD-Uw2_|n9xvSxs$=Po#YKm1UJq1U*g4OA+>%RAaPbbNg-<;8?E;G+!E#o%- zn{fCaS2PX+EqacwpYeEv{F!_h{@{}t(60Ymk*KmLK(r?6hH8?2vXNsS4<%)}oki`^ z-6lrf&ma5rIFD?+obdl)C~FyQ^Ynp;S<b&3r}fP%`gul-__Pvsn)D(LdpTD>s7Ute zc_l#X$T6Yw>B%=#lDEF19`vNGctw1U>`%>-Ki;yOnBhWD=R)L9#s;k!vXgTEPusJg zn7N4E<nr>S_lng_yXH<hi8Y<g*S?+qq|>!PZ^l1~LAX-Mp_y3L^uIUPkeygNr$^-S z>4!LZxoriG>KA#^f(oF{cUMMjiB{(xDsBH8g8yZG_P#~}8ylOD|K`%fN?%S;Ohny> zHT8?Cf0Qfs^c99ZYwTK^khLiL+b`nN;<J3iZEwX;{n}wS<KB>oWb2Q4bU^N4XG=75 zc1Ar?NmA6<|Nq00b|Hc`4`|N>k}|vUoWtPF(4S5j6`Eq>odEI@iuK->5W%MfQ z|BaphQcV4(4F&M7-ODo&%t%dxN;q1)jI>T*&4>OkG-;+Z9A$&Y!2G49iD8k||LIXR z%+oGRIa3HOVea&jqzc8}8OVj&?FiWlqyOJ~s}BOnVie^gM)kKZXm?n6i&iNOTzX2& zaK_NElT|0h;%TcZdUTOEaER}`PUBx5topRf419IGs+SD89DCr2^&BMW<urd;ds=-p z`PAe*HgOuU+)Y*$-b|@F;BL1htEe6{CUs9s>Q3pu$^=Yj%)Di*`WLi5-8gA*MTeWc z&6%H8oGB{4MR%XszTwn>WyQRzhcF3cer@Qe-Mipz$frN;;RZ2{tUR|*zO8+gFC2LU zFU`Dd^LcB&rY~62;JvdtsyTRWUof9Ox6^WUdLO%po1fo2?Krwu4K3_Uy>65oQA&SC ztNL?B-xj~(<v6*1O6%ect(Z5V$@&~DbzgExe@ch^Dw%Kr)20`<iv&#RJGy>$H+fFI zo;o_IeO6UHb45;%;5Jveyk&eY@$uzcO&CTSep!3l=+b*H=s$KL)C{EGTVLsn%<a5Z z9%S@59cOv9T^^h}y8R0I)x*BiqRi&N;Z-wm;pv1QUCo6sus(9Yjwc?{;M43=({oYr z>2l9<lSR5dAbP$F%R~U74WV2(kXpmVE3S$+t)+{5&1Yy9S&xvB34kjJ=NZV3qx-*t z-~k_w5*dyZ22ZeKch}Vi)2>W->zB4eu&9$iaib`377=pQ>Hq0;ff+qQ8g5-4-Yqgx zj$BO^$0IDA@uEiLVNMB6hl~dbX+9@N(PPT1>SBwWWcr%!^q!2H$LDArCoQjEBP=}! zym=LmOa?C3E15nPOx!rdBzsOe$F;{EpIrqj(}PWj7T=pH*;&vVDqK%H>yj;9H&#U} zYpqY_w`t}8+(&8gGj4a&LfhjWt0JrKsjt^b2b*E=1^YlmaktFhoRfA}H&e!pJ`PF{ z-4=9_1<!AIHG$EK$|Fn$jvp-*x09Ty3yeD%1FJhOq?w#>H_#?pt3EbY8A$h&K2xt} zi@042J6sM|Qe02^8y?mbxOh<(1l3inukd@ni(^9+m9=RKwIu*qgIMJVLnc|$1nL51 z*qpmF^{f^(zbbG3&td9q8w7$TE`L6~7kAsyeu%gecBH2<J^H_98OI8yoOdYguY89s zIF+yetGzGRL?oEJOI_x)v2kVR|KtWuM!nPuxwt%b;3bmjP96;BEqBcf`HCVOZ1|~d znvE!GZqseD4l;13WGrLb{}*g5@T}jfHsC&?wBz+?@aLxy{Ulq*>_!#0d+R>HNnA(; z`+xUMsGzz+*!C(Kud7DAwDjwI*Q{$W9bWhHCX8ErPh+5rvzs&W(}T}p;^OR#h)D2j zo`P7d({=}~w1(fjLNiQBc}b$6&)zI9(d&zj&-q_pX7KAaUwd^%NJs}*fpy#-(f-v| zQ~NL0%*0NA<PS7SvWsP?i=rQv##ZS}w^Wv!vl9EK%*s@j6YRf)(NMsx-%eI_?^r@q zd`$aMy>-&kxX?sq^t57+#f^H1gX5Ky7NQF~bmP+0%*uqkJ@4D}o$zA8X)|-f4?uNS zXjnkrF71-n7H<37A_+~(C5)>b)Kn=d7lm6@6$6WhP$mB@(3yHIeja9#PMTWqaIU|E zeR&F8Tn_#mgQRY5FRNVBO*H9pEr-05Ici&ly=s}6kWXX({pn0;OJehC%SY+YIJJk> zmRg>-7fF$ikYk4v34Js^H&HgeH8LJr@#MdbiY{6N`Hs^TkpGH$t`l7BZy_XPm)#D9 z=u+r*26Q82+%IoFa(v+n^M}C{7}`iqw;+2S64fW)S|ag68!3?x^u+vl=Cw8oW$a$_ z&}g`%)KNxd_M_$^3YZ-k{G@-92^qSSBl8YqN3(WiHfFKjcJg@Tnp99hR~`tGUS3@y zPteJ$rMA%jo|Co}TFTQk#wHlVw(JiD{<bgXWd^*BG@l2LN0!6b1~gysk^cJSgp7nw zdYMw0!KTh0!i({|)Z~Q8J`^9^jwdrAw1rJ-F1Oi689u&nhU%IfRf3(Q{mn@elvMZM zWIHVkXJ$}Z+4-m0aBpu;To@UJl!vu;WjQ$0zw13l!b!R-5_2BW7~Woj!)y+c6K=y9 z?}r0!Z;**B`M5lur0TzrVE<EiYGJgx3kKjILbxcN(1jP$->42y2ncff*V`RFyRhTF zk(9}~90jJu913CI$9gg<uYPfUj>e>fkWYyOri2^1vkhYz(ghj)M_)dT)ZZfw$XedQ zi8}+A*c3revaG$u8Kpw&KLP(>0vF37!i37nU<_!11DePg1W;HZqjtfoRSWnK(0<t| zXsS|B*u(T;ah}PEh<K3)&y3Odw-$lmrbvjwJs!8ezPbhs01#!Ce~(Sm1@ftOmE%CG zdhBwayQ3u~(ir$@F(|V`>R%l^J+Mri9~@DQh25U2mMCqFKIWB<%5SOhoeQJ+_J)df zN&Lr}+a6}LQ6tV!62+|bgNW5)l_?IWmSENJ%7V1zk?H@+&wlq9pzh@=fuhz(i8=vf zw1sIbi!`Px8=eH1yEJxnNb$N#)M(1e<w&i1>%zPum}`XT{R1Fm#I&Vn4mOn;Iujrt zok`j7L!O75Shnt4u7{u(=-6<^mXx#>r%{sm^a(jJDa2A^WW;gn8e7<Qm7*##z^KVy zq%g!X@LYJGn>f|&QheLl<<^I0Xa!f(;FKO7#4{lO8-#ue24M*XhM_`@3n`#Gih?dk zO8c<C8Mf$7T6+A}+TJQ*o7+Q-d9IJPg8i?PaybgNj-3OwtIfI{A<;E3*ZK%;DIB(V zXG6E`y3V>Xh2h+VZ!zkVnv_yNy-$8poFi+Ig~Ou~=bhyJ=v9t=Imk3YS#@QvCOPIO zO!zX32#S=pG$C))%Nvp^{~L|%@Ss|j=edKD7jz&PrPKCuslnkE9p#W61iZ2r6<a4V z{OuiWLJX&*BHmRtp~_pmWPi(X!pmG9qM40cwK2qZW)AT#wsf}A*auoWI;iW^Gn|C= zOLH&J|Gw;zoNttGq$PH7@1Nh*ZBZgy2Kswg^lpn><BQ5|{Tz+1>u@{%l1<-BfKm;a zW<gRZYzQc;NF&Lf8n1+O;0fs0kpJI`&NQ2*u7rZ%4!q)?iKlKh8PSO{wKKyelnRVd z%qGB)O6wzjJ}ahR<!!L_t9l(S^sZU)@c5K#S6$r5A$iMv<c^!Nqdd9Fx(dv^0n<`3 z%I2MI$*Xo_V?$}14b~-@ZyhSXI(Nb@>_Ncg1I=d6)^X7)W>;lEli<G~d0Rg{fteVs z#VH3pH_@QP<mB?6`g;2^N(R+USQ{Ig+sDVCu#TLU_jgGFUw&Lf_m*CW1=f<KeM1)> z%4Lxa=(CR)d}+lal}z-F{bgsV5#1>o<fPCvZzZF|m)BQksgDC+0ozQJ?ep4WDNXoI zSpL&HZfXt99o(Q1?k5TmyK9g+>bzP&_+t^7?e!T|9ud+0-rVI!z2>_v#&`wHDm;H> zNJTMF2N7=)SX?QjxJ!|Fk>USL20YNeT}@LlYZNl0>rNMBB)oVL(tfc})Kqi{@$ty1 z_$j?_G_o?NDUv>^Dj`7-l5%=Ll>;AW@~ENj|3aa#IBavJvY5fa=G&hCWyGaX`Fy`S z#K*+}qc{tH7jSP(Oif9@JTGv2(=L?AUSP^EW`UnhnLCjXm4xA(4|z2hM_6vw%G*2G z&r(Fp@k{RQZKB}!1(4FxN+Cm1ls7}c!dvZ=KANyLsj|(}Re#J$m@x=x?)=h!?1Lm2 z4M(FvB`aI|8!7&Wg^>|ZJ>q3_JekI9y~z<_`xiEEnf*VLik=eA_C6ymiH@Q3CBN`e zGA;?HS;9?6Y=VpH^^cyJ?@RwaIr*yUcrBE%NmlH5JaJ%!4HBETKzt+?r`GXI4#iH- zna6AfCp*lR7SH#?3B_SjijKhR=D(9@{_~d9mUpGiWttWepI*3`0%oX>>I3HJhSq(x zkl=6-^@k((wR-z7I6SUHf3-mMjcu?($odA^QU0&jPFn3|t*7gCYij(Bz$<+LIT777 z4(CFik6lpvF|vfmi~H+x%-qs-Zb^2mpB2n9As%=3_t$fe75Q3^k5Ajne#B9lX?EQ1 zu3j!C?OZYNtclV^!T%%>NjO{%TLF`q9vNm9S%Hj}pL9F&Tj`Xs2xUOp{9d<VwI59j zNmtjkBN}c5Vjf^<JI4iWd<w%s^kLTbetz?E>*%)oeXY8gf4#cv4AD1vla%sB^IJH0 zV9k(@Hn%*eUAhzy&x9`TetBG+YWg=RNp-)=N?%mF)vh=OPc{QH_%VOPU^(SBts4h5 z>_D7+BKXmwPoCxw@=<3ibBG{0>NN*`cE7YC&RKPyRKMfzBX--3D&n8>Te#c%yI7(D z@v^40YO?b3iXptuIan)E*_9--60{2T(R#A`qc94BIBx46X(2+Hi?gqlr1s`W!-s`} zwV+@HCl?jp4%Gh3wT7d!lAK{6#!T-yI(I=qKg*47X+GC)P`869_CnblzPk|q55X%- zN8qU}S%;bjcD{^0+~tpLKHQ$Pf#%1qDjTVit{b?5K6$mzDJ}e;j~8*fN&VNYuQlAA z_LiSzQSP(8F9OJp=R4jQPdf3~fY=}2Y&S+~I=^-ptyG8rC@O0DI1C*x?PBQ+>V;w% zP72s~U5VPer^~COpaH`H<*f(HDfi^W#D1`D9VDMyyScw{#$9cwx1o{Y<A2IZ3G+yi z@$tid0cRGIr;q)18?)|Dl2Hrd<L1va<XqwVoNTz;wfQEVLz?<3nr0O*mh9ipYSB%B zJ{ZX|x8Fj}xww~P=%Iezc4!%V#38lgAc-{I?D*MO*cqeH3Wh(A=vE;&_i!$Efd)k; zgT}9=*^PZTGyS3>@NAUhdp{J;WLT~vQEV^T-AWDZ$cV@j9%RL%8`K_?WLQRxf+yhn zXe2$J%Ag2<K#0e&>6Fj*y!-98>j#ONA_3XR5c1i8P{Lj5&89nMx9{Vib>CIcdVE7S zUk?v=&+S#SaAv86CtG6J&GlxI)BV}N+3ob7eGq}00icmzVg9GxpJ*;6W0fy(;p41s z_-TlVl?@RzwmQmDf1++Yu*YHVZM#)6H(hRcnGFUR6GF@aI_~diYQ|w_z7?;#PcZB^ zVyv5PqZp+FKo6ja|4t-V+24T1gr-z*w@QEabY1wyl#g#ypq>Q+<pt@$i-t=mUIr-x zcT{&3<QljviMse$sEX9-X|MQSYXB~NCN$*r%t6A5(`P;4$sWF6rw<Vr1|}z@nA4<E zZ+Z`tG`G8UJZ`pcvOKQap8p6p#jUroFp8*^DUhj`6yE4E^bmh%e0ar5k>y8gD#H@L zp6}K=D=v5r9i;zSJieeHL&ITDj=Jx&bxP%QD2~euXveb@yUkeQ-0y62IPAP<X!Pcx zsR(N{n-jVj;8M>m5P-GEpoDhU5$9ZinO`hd*EW%Q)zNX?%dy|6V$T?pYVD@oY)UxJ z>}E^KPw!WYMD9qLw~7N_jFCfWw%O5vfWsur@w^NBc)O^XZ?Vzs0BQU!7h<ivgxe_Y zij-U-h_Omjxq-uK2FSFBR;X3)p=M+;EO`U+>pev<*ZUX5KD`AvjPQ&l=jGkHOr;g< zBS@SGV*gQF%)@yb>QrF=2UmG{NQ~gCA6>45Yeneyr5g9W3k;VG;o9F5+KPqf`Mb{8 zJ58<hZ=aCfByDkijhwMlBrTSlhK45ew;31y5A-FL7V478$}Q_bV;x~QrZ!jF->}b7 zI|c4aZEZ~E@o96G75{3zX{!X2F~QgIJe7{O-DQKqvjbslaiJM88q5RVv)0H6)f%#; zl>Lgp`=xI_Z@P%?8e3J@E6H72ha!fb?N9q7#~|EJ#D=MmqDqf7UK*EiJkQe$iv4EY zNTTzv{BfVAr?!%8uR6!e&80@y*~MR@l_kP@&*QN)3@zU5tRxSHpN%`-uSu##{V#U& zO&+pma}6yYSJz1Pi*e%Pdm#iW5=2PpeCja=2Tfxo&Op<jo3OC+`}owcKoqBkA&3O@ zbeheH&?w}iCpkX!(iv<?DpeX|K^Que8$1md$!D}trrB=8P{64)-qK3S?3SyHX{_c7 zdBec3&exl3`|T+(hu}y4A5R-L=)n)Qe*T1$NzWTLJx%tRj`P38`T@}x5DaG_1m2Wg z9?!`pQ|an$b>P3<E~;8ALjiVKgtCR29nMue-yiqrh)$x|S~vqCJ|DLsqAsa>yB9S* z&7C>!=Tt0eJ?G^Wa0x&2ToX&{YZLj$Gnr7k2c_ToA?YSS6;Ufo2n1{_FQs8k9yM~n z(U3G3<ws49Fpj}TYmIg!OPwtZ;~mpHa}ok9h#`J}#u_vJt&wsEVkl-zvkhkq7;#Uy ztUX=EsA3l@#%Vt}QVnd@(ZnBB*RJl_6HDX#^x-<F$zG}|wco{e^(l2p2u>3V#>e6u zZ)6fZiYxucWSFg((9Gj74_y)?iC!IxV}nUg^5q^9N8|uf_T2v%)~Xt-D2qpn$Ya}+ z={>x5caZ6JjMn+y7cz<@o=G^7Oed>!d*Gf0vmMQz&B@&#Q1#9kHCCzK07eQ5Vil(f zz+jmjK9zzqiz7VAa>>>!ojPj!yF}ggyzOyxoMDr!)8#(aFvCYv)BRTdliU|Wp;%>7 zua2=HR)1|dt!O7>G;#tCgW830_j*~Ee;yj2CYsc?85$QzClU?@`()V711kH^%E{d7 zy7d6T?W`!}a2Us?@qzN*>v_vG9XC_Jn-Xz!?I4EVdhq69L6%*!Ts6_y5Xx?`RDQll z665vtBqzXFT!S?o0BA{&<x}5wJHf-^ajjii2~r39A_5U1q(TzVv>)FUygMx&F`7q2 zX)^o}#Msd)Xc#O1EqvvOV{Up@yt1N_uc(MYHRSlF@mEe;+zWB3A|vniT$3lZ?CQ;q z!*Ct-Re!(5{&?+V+`&*xa--QQQlQnDW=`O+Lhun`=|Mma;vKC~o7)Av@da}k766Wc z|3bb~b#+GFB)gV-RglKxdRGhgID?Ki{JSxC3xcZslc8k{o_*U=*f|PEpJQe!ltzm< zmTNNy;?K{i^)0Bm)k1rlXU+4uA0$EY-io#%X6sjpEkYP?|GyQI7=GjKD#k>1P1B?; zmv7ypNfwzF|J<B`9|lQEtIcXVAEZ8{vl+t*Vvh=ifc2s)n&YZ-$KrS?*#Sjo$&A51 zwB_$PSeXt6bFsWLrc7|F5W|;MgH*HaPB$@~yT#kpj+<@^Vg2n!AS^pUDFNJQzBe-x zB20Rax;|L&DL^9`p};JZAYMeRVGOSdf{GK3N!#b^j8F3Ar6u0X^<QCmaXhC)ZIksz zbNj;bhuk4M<AKYV%}p)X5k4^eS);z1;RkcSvXIaBXGG-u*ZY%+#}!?h0k0Gt_p(gq zb#t-E+)qv|uYg`NTrfyuuG>MBD}8^BmmghVlm<X;shehzRcW>~Ul7?$wt^ygzMYjE zjZx&l#Z#)v07`JITl=bm^0)y~aAXRhKu8kSVE+&dn^)mi5K{&owR3n)qa%H8K+_nn zt46_P6(J)%HunpI3XBOB6*uBM8ohY_a5<fu314BV%*YWiT_04~hAZ%u#}i2^(=hIJ zJsW-9+)p8Z9|9Sd<>H+`oS6wP96~N__q;A|v=f}t&Y24-vROP?t`!tg@%vPCa$jqg z<*4&ZaMfClLOjl~S}a>u3}*9&;b4P7L&fGp{KavIFs~Df_EdYrb8n?xK07-l$>it< zs>hM}Nu+!Wa76IgkSQ(f^wVTQn=E%{rn;#SA?5AsACm+=aegJ4<Uax#{OCaFWj&TW z%iPw!?|HM`)wtuXQr+zy>d4=kg47Fr)5V~wW0w{T!FMdYKyhJ51}W7E+p31=wB>e^ z)t7=oExQUkwG2sccg4Ols=v-C&}rN|05X5~-1DtX-*H**b?Mdpe$Bn`q__S>mZC+B z$L-wsFbe4`j-l&WXRbgllSxS;9?fdtpK)RtkgLu4qo+{-zcc^FJS{@fpI`5ZttQi| z8|;lb9E~T5ZPp^<kVB2blCVMrcgS$;fswG(LW0QqJ(=|RgBPFmEiWOi0OxV;hmuGg zEHztcDl1+y{<4$A;|g#-<F%3_m(8|>mx#gVy~MsI18!@-8>czy1x0MU{}2WX6?hc@ zB5*g<^$~93fnQA9l7HJ<7XF0HqD16(&9Pj{bCFWkEx;~N=0b6KJXijk(yCCxd2$h% zC6->Cx2PB;ES%M)EN(@3dkd*4v`Uq4n8oK6Y`&RCceC?dtLKp*Vf6O`=Kf{3%VJQM zL<ha$V%tq}3+$93)A4k5Xxw{AS-2luGNpR!s*|k;8m+O%Y{2iE?tEP!Ei%&ckmziq zrl*>+r=OLQa+XcovgvP9`Q32OHwj(?Vj~fsl&rY>13V_YUl`P#e=%9+rAoaiXh=Fa z60>;NtHKhp(?y=McE{aet6_9<bGe>?&lQ=+-nhRz5kB7}cexcN*bK=zo7b@=3pS)6 zgKT}u_Hf&xE07+m6=Ka-S*782sxx9)O*S2cdC86he5xRfR!9t^3(DKWnV}Js2AT_k zK+pHrd#FiazUfRhTXw|#^)VrR@rQ7Rzdk3X`GLEch;{oJImz!?9ZtWlIdK9nqZ9oU zFje4LdVLO9|5id5OnYH`fL4WKiA*zM)XHL+ViaZ@ksz3_BN1Zjnz-lU!30B3BkM_~ zL$u=!zH1we>biw1JS_t6gB;HF`_C5&X(B*>Ih(}UOfSx+5MzRVkYB_XiWD5=l=5ec z@*+L%;jyZpD7V`23)8Qf&#l_4%v<xM?fkLKFx`brLHj~*xD-}rcR{U!-0P;5dxU9J zXj9A;ODf3S3y0qS6~tIYAh6HX+kKLomv_hGd%6}nUd^wqcQiKos)L|o;=K>!a7}$E zbDnJ8A9*?vLklwHUHK(@49D<~Yd`Z)FIA{032&_|mSSM%3w+KM8wPLtY<p{lIGU(+ zq@2FxRl&#SXV}#D3o9;GxbWk=4f1L<=qGGCy#qKUf6-QJ4|g?sRGhV(okAp=)iK`i z_E)uNCKr3@=&7S`THLV6Ydmh{w)XE)WXnQ{84#A*u<oCSsUJZ;b16|!&^37DJO&Tf zY9SMEo|*xNLXZyn@glI|RUbI7015WRuF$n?8i;^3^AXa@Y)(Wv0(i_29C3v`K<m<s znp>WaiRi(E%`mCoUk+lVK?6USJYbzAX0Zho1M+^wqL~E|&YtTPV?o8?@C{%fvP#7M z<k@YL(lx&?;Ej=3yx<mm*Ii)clWFDwi`Z1_t#&kfGGA8iha(7l0HE|F+haO%u**q! zD{G;yQ`!xE<sA|}U;zAV-)p9GWuFg;5X4SIfIGEV`T?}otC@%Id`@5(?R+d(P`uPc z^OwLI8GMy2ymkw1SMzk>(%vt#gnxTr%wU=^@&))SN2tZ;DbM7uZq9m`1XxX$3p&(4 zXJ9K|Lv@RDrcDk3tV?BUpfVgf2ns@A%mGi(cyxTIOd>Ds$IFse!ru=iz+&{VZLl>} z={4<6*(*gv2(c*9{L8FY(=w0)Y^mz+6P>!oAKW%c<{cqy>*nDC8e+U}p;LStsU_Bk z%{Q}ekBwjF12KGaUne9L1oNjpINtrd%-1OXv@hb|WU=PvXvU=oykz6}mKV#tv9x@v zM6M7KBv^kBob^JQnXSe}#+KLqayz!dKUa2!!Kb-#AGs<6Mf3z2hWs;vmWDTp^pooR zdb_Zn`n7^e%<FCJE6+SAEsH1)V+)UgaD|{W78;_i4xpt2>A;sV&0#VO<^}s%D#IZp z=&K<%3)HH<-S~W4nAg@4f-x}u^KU-=dcSFbfF00NES9RXHER|K&7Epf3%S{(<$BrZ zg=52%?)lj!d1?Sd`l?)LG86)5P-%S&9zJ0D@zL*K-zR@UXw9Y5#tNC8U?iqxdJowW zTJd-!mn}S8kbs7c|Lig7xH(mB+TTabQ&t2`xe94Ey4|Cz*V=2x8i|b8G|miUG-^Je z5ZC}#T6z!I!1k_jqqn-(gwGQ_evB?$H|h4ZQ9~*T#xtX=JaH+2We@|>#KrlDvpSw) zdAVIQUvG(cPdAC`JqG$QC&CfmwC5X4T|P@~tX6$_L`y2dZWX}iwm$7sZRSkNIO1EF zWYM5uiv$zU-z*^;4G7<kr2kAI#wqsg?cKsm59F?`_4(QgEbQyR*=*XrtG#0FV_LOx zFs?eYFL$MeLN?(C4{Xal(y<EG{y*(q^<UH9_eUf~ZXn&=rNEGhQWDbL4br0|1f)j@ zf`oJk2uh6{FiJs?ZbnE+#}E*tL%!3``{VojCwzbS?#H|HxUX~0J<oH`>v`^W_rui5 z7%-Q_J?E)x*@MtN3_w^pKZyDu5=hdZHc6zHxmPR`tR>7w+-W-s3Hs52f0#-aA%7b$ zQ_4S9Nb}w}LO~f{ozgX5@f8iLQkk_x)T-PLNoziCIFvjR01CUty@fmg5J$M`&#@%3 zdn;CF-yI6oD2_&BfjKfRq+B+<bDa!2`Cj|7adS`4!m{0)W$Pz<(5}TwYw<Nz%J2a7 zB5nJ24R!=vUCayl=+PC+j8gXI!b<B7bv5uH$~FUc`93w@ed;W*m_}iOw(uL=tim`H z<KTD6XX`ur+%7jdll^W__3xqT44I7)c1;xnb8M;n`daco&Bv=Pno;AIv6<d+X>e47 zh39x6P<Z|;)U@||=ERZw!x0KRur;1hs84D#PE;>;@DC4y3P<KRWFT(Dub1C~OMNXK z4xYdj<DJLV%s1Xh+$AC7qny3lQ^#gOzKrEPNYS8J6C>){O%jT{ntxP@Yns0f`AEwB z>c{>n4h-ibOeRJ|Y&~kggLFH87`6ZekVS1IGKG8WS2GP4%p<|d6ijBsW3v1>@?J9> z=7GEQ&ZF1D^#o{cLo?6FbrMVE)t=Ysq>PZ6?~<*0!ASNHVPB-sZ;u~FV=daAk(wYp zO1*a$pFp30O+V08rufNQHZWxv9Ah@2se<~HV$+e2ho@wXbAyx97U$_X-YZ!CFOE{c zlxET+-pJCdTe@JVB4r(Irqp`K6nG_qa$SZ#>h<`ykeh{muo9HrVK9T%wNd-V8L~jn zg-?`Tk@RXd^=a8K8d`D3t`+>)aX)12wMI<iP~)AaXCKNSUn=0i#SNSA6ux6Zm&Y=p z51#sI^<+BV6d%I`Cn1cACS_nNk%mWwRYD$>rtrk$+a<yVUzB0Hi4nvp$<EGA)*#Zb zo*$7!)Z30KqWsUauTugIsD+JPw+~*~3N~-3*Y*1Xrd94-GEcZ%=tE8fh&}*<By+p* zif~un=Td7>o&!3yL1*X=8qTQhoZRFVs;DZfs)+1(Rz3iea*1uOJ>kTPIqec^j39<& zEl&7jV$-wD*+;I)9;->worFXa;bOS~=u)r?j&SLv^?lOyh+GQ$mN3xrtQ+qgnm~DZ z9Q928mH}#E++oSjj<`$AY%)0g;@D>%kmENU_bzIbhB_=;NORS8h~a?6^M|wkpSf_M zF%$TDW2_wBWpyE0wmzD3b*fNC{Jw+Rc>V0a1^&&PpfrYON7{$Iy*&us%3|N7u$Od| zjA|TK^(eJlQ6tor-m)_T1{K=h5Z1zNC-0>mY?M}eh7yQzSIZM}F9aMRCi))7m}OUq zaT(b~hg|wX*TLolOr)aL!MC#Y1@ZzW;2}v|Xyu=ih87J#XT+&dI;m*7^slYkoQX6R z-kP!^bI3j9Jtp|b$om2b<zPi<?!Azh*26>9@kUK|MpjyzpxnlhpH%IW^yg|>V#Y$F z+R355j@fI2Z@D|G;und#v)zsN@vlLWp)2MrfgMC2DSk|1h4#eLJ7^Gl3exaDNTVI9 zU*5-89Apv8cp6n8s8pNCRQFLt05=S($y3vwNKZ^@t%Q@!q_%(hzUR>kdTTKK$z261 zd1wJPeF=Bo^Utm@tNi#EZAINd3oP)!k|jQ@HKGKLWhwGbKNb}YD`s5aLUmxcxju5I z8Tp&E(0T;&fU;0oTyM<nyEa8ozYTG7U*?}qQY1ldW!X(4+92%^B^-m2e2a>DOPH+` z054gjD=p<`bdcFX@Ft*XFRS42M<=jXgV8ID<h6^7fGqZn>%`8xHmRHNI7GaQ8wW6m z5I`D*!yPRBWMeRwyRF$Tt&?=e!Gw$gI1?(cv9ZxlZK;led~llc%SCBaL49O%2+NGa z2)YKD9agImO>#?go@a3lZFv`I5fSQFEVMr3sgP|)*y3EXbIf<jvw{dKfS@*ZPi*5n z#EdD}^_91yu5t4g`oyS`Lp8buFYiV2u~Wj;^8wgL(o?@*SKrnrr@QeY_)Na~4M=Y0 z7z-&$sL9*8o8;`>vLGa84Lc4lJ`sB^dthMeO6#l%BD>EGYo9oJ8A5np&^rdgzNXAU zAa9t#i)RC~=1r`SjliQV4Oa(!4-;8nP5=rUytC&{_+bs$oqskW-jg5_90Bg>b|zvA zhvj&7(^8SX^Ekuv>U0wVK2~4=wL~)o^opq?4ayDRgIe@;bNRC27#=25wh)I|!8VVH zoxALYtjmv%3q>pc+z4-NuVo+Xj{1<}6-xqV1u7w0*9bOwe^<oP*p3pTOhS6xRnbRM zMi<9B{F~+6m-F)slX5p~x*tZ~<S3}Fomvt?uEO~`)CtDrp5e&eAu+v!z<)@($9ekg z5_sA1X{-h<-3>pEaZzxV7JR33Ru{CY;xzs)E;-X0^0N2?Nk{0sOlRclaSWGh`0*S~ zMC-AjWj=bz^@=>R9m%k}-}p`a&2)Fr`{1;)K6v9oq3BfYU=urA*cRNl&4B5}7TG!a z(_2n&WnQiRmFtCyU&UT;w!%iC1K;c)`;Dz|`br<j#?uapfc<C$v<wMB4$=Cp<=uH` z$mB-r{S!fc=BO43KQEow4?BNzbyd8Q*AI^(7C!<FXDYearH8My_X4-9X>U%l8`}Bp zaeqlUyq7vY5=H0KSbWFjU8P7x4G*}+d{>XtwXPP!Lq&*)bPMN%!a}w3C#p(x`4*@t zdM6~%)nqI7DUqrnv1NJIakt$kGisvV8ZL<fy2n@?G%BpeuI|D?V5z2ye7SiK+I}oq zDTxX^Z2Z$(ECL1b#8IpH+hGn)j^$P_b}1bTtm0q=cL9e=^1g#LJv2#l4}2@W(syk1 z@{ej*Ka?<=4%(FzSYn(5yqCCj`VvD(1mNV~{kT2#ph&%Z!z<4@st)*_Wt67CyrWq& z8|+@|L-2EQiH_Ny-p59{&R!k*N#{%3E)8ES*s6_g(Z*g^e^M^zLvWA=op<bf8Q!${ zWD$!wcOVihp45&i)1QdiTQaJyZD^a?c;7LW??_Mgqw4k@d{j?;V@rKoWPUt!L2N?I z?uS`CV)PZOuwzEPWO=!&6%L1n<vwoHm%vr@$xhYJwV2M!Xgf>!S%iDRJ1o_~hp!~6 zbpp~D!;iRhvdY><T!f{H`(NJjIwMocjGtg_yX<ee$RTZV&LADivo0#BedN;e<|uUV z+8vDu4Gi`D3f602bx#qLuw9?}=$8GcvpSbAZnGLWBWT+4<hy!jr=gCgf9O{Gj_5}% zxlcMW01r}OTmWtt5sd|*<7+GWwa@aC(P3wlgYF>Z+YG7JP*GRwlnCC_>PgSKvDRa+ zr?4s($0V5qGb!q*v+7p-ySHm1SjD=WoWAET0jYc<pJ5KEe44j^)uBv(-eC(y$PNeh zO^(?oZpq`eu;2IXs-_W>KkG;%bXr)cP9R>^p-H~o)J4tGUBJ3{I7{${M06r+znm>J zPMiHD<@ibd^?k)*DQLC#!;&~sV6n@lws|fYxH^GZUYRmg3pMJ;XyQt<8kHi5UVvDN z1KTbb$`;E)#2o4yznvR4U5%^OKXlSBfs&*@THMr9IweET22Z;+LzZX`%r4hI%Lb2X ztVCbPn=#GwH09TL_O<Za8KbdnAl@_eDqQF-(2CH6x1brqC|x+y2Jc7X^*ZSUQ%5i{ z5^mh0*e!Kz2g=qF&bPpF#%lNfe9+S;?d_CA=C_DhrK5>Vn>p_^GfV&N<D1^Pk^9-g zjzLpf!YnN6KdMP<vr0eJ?|?IWoo1@b;T9NnCrNN%<w81L=xf8CvD7}2$p-xRfQRLt z!k64-4{iVE=x=Qx8kZ<E!cv;iQV7)5F&$<&?*qachcTbr6`xF^@9L2>)J|V4#`XLx zoWsJXjIW%V;^EIqTvQx+0saiERnRYb?zun|?+r2}Md5D#sKWet-AU)&80y~qJHoV| zn=svguOpGqRDV-Da#-pezCQDQRy`4@grbJEEswtA&MJPrmz@bxiqUjv73j6rz=ZJL zvtfw5LtCDGr(Gml0O_bfg$cZ_?%uf1tub~Vz%CQJ60@X}8x|Jz_>;%7dLz=82&W9W zIdaW$<Q|ij=*0Ut3=hIQMJhiKc|tnflSrG!7S^t2l{BktqFK=c=n)Vl=C-k(cAg`x zw&r@F*G${XLbNjlH&mY`9AKBc!I=$sGgN=NWh>PD1N&JmU?nynxEyS!`(X%WJaFu7 zUguI#6`BUBn-rNKh4t=)lp=P}NY4IOJ|_^D5KN8rVe2U{QU3BYb$EBq@zea+3!;M8 zaGm;GLCtVh(Kjuz!+hD89u4Ikd8lc9o=ET~lla;KEadlO)$hNQ(DJG+!8L2&1Y4fU z$Wy4YeL`YU0+H<4Nh@r5mpUGv`E=rC`L18vCk{5X?oqrd-)@`!oQ~5A8gIhGT3*K4 zG?#(}ev<QWT{a=VpB@fNo6w-TlFcX=7BkiejCcl8D<u}hJ?xQAC!NNp_38omanvl` z`)Dmh+W324x{Eyv%6}3rswhUd?JPE5V(mUboWI)BgJL*#sI%yc*Q+S}bq-c}yBKX` zs-+hgYtr(ybS8QPp)~{<PEX4pf^75#oBVpa7D;{M^lQ#{TMq8H$>KO2a{e^W-}{%_ z%Bj7ovur;rD2f&Fv{^;wXZNw-(AJoyN#NeBHX@qledhV9zyNSo3{Yu06%N4@GrUYI zcCP0;S>AnBtZnd$K}O~<t7Oxws{Nb`r~BwB>!|W)hIQ^-*6WdwUjtJvE~CiI0JRal zZ$_!RP2ul}DsMNGY}|7QZYTMC6Le7;gaR_X_=s@)s(k1}cq6+&nr3Zi2@MhyOJn&m zRmI)$Fb*b|CqaL&Q^S#)fmd65Q#JXuHZCXCSZqt03+DYCMxNv0Pe}<}kKtlo+wBhx zG9=xX%mH#Q-dEmyNE*LSO+}a9^V^NA*cS=5=S<!(5wXRlXG)`|M2qfMbP|K8?HLl+ z4C@P2UnHVCSiG!qHj>0ySIm8nf%dvf_i*#su)#!F`>W!|2u4SKrPp-4>1Lk#U6H13 z>o*qzBW=-_-$ydQPv1V<>uOo$-V#_2-AR3%{K)TmRB+bKQDwYrif~5VpAFOXnR@?K zLYF=lTE<vmQXi`UztOhciisj$(v-ezUGfJwjs<7mWEU^i*alV$AJ`d|wQSvC1a4*I z3Wl@<!g743GSRyGcW5v7{k%z<`Z{(_zb{y(^K5gn`}nd?EmmY}8}4XpcWXXZ*LZM4 z*cUFBZ|`IJc{Qs*UfaCss&<WA;kls-bUT41fMDiHlrXMd9dez=tr<sVKoxY04TO&) zLkDqE`k8aFv^~?5?NgWr4Ktw6O%g5kc?%1!i?0|OMa-qzUEd9?Gz&NfHJx_@U2BXI zD<2b0EnawhzQ3#I7uklmG<s}RbTa(qB}D>)hCrq#5*d5|Y81nr4S7=lZE3J?Io?Ay zK8608U3%4CMq)Z(HW_=p%X~`7CV?CgNeX@c1MN}?q$2a_(Bi|P<2>UG=cr8}H8i8X zZ)@Hll>1;?Yqs71KU#8SIXa1?YQ^eDd)U3b`ptNXNkh1UIb-)1(1Cbo6x~6~QL^e_ zLjQWi4o7y^P!!KszV1Vekuo^RxVI819Nk3hj`}t&`_rIk3FY`=(MeXOG_(wUTmiLr zs7MLebFd_zyjrK`ewl)0O+c=zS)0m58TZv@w-j&B_ILeh$yEL5+nb3m6Kl)fHoEz` zcvKzv!7sug8yWA`6&US5!x%u3!i$Xj@0bG3UhccGf8r7CN+Q7AdgqfBnO9YEB604u z8PkHhV=dQTn3oXR<nm7FOo5zw1R77#cF~#>GzR+G<N_BPTUXC&bmlh1EcW-HOJ-lk zOccM)x%|jn_9ovQx?Wq1IhYnq3=lgr^LTwd-6HYk@<_B}RMSl(VNF2qM*b77)Jn7k z?l9F@d|^;jdxC8WX}y4D4*$b|lO&@3W^;!(=C!YH8%~!R7e2oxpy-g0n7M5n7G#?$ z0P^8ay(lnZ#SxoL4qx-$LuoSwt#w#^y*S>rWqRAWek;c+jf^jp#=-o09xP_Tme4ls zJ7QU|<1CBm%L7e&*ztgLJnkPc4HPqv$iYl;^ZLg|f@~x9;q0%g&zlC{Js&nhjn5>5 zQt`?LQ!vZ|N{*#JiotU3!`31FnV@m4-gT2&eWa<x22{*_@ci6#=ycRoT&vq8cFTKo zS?;}B77t@BF!`rjlX?_dfJqIm`NlECu*is;S)r9pG}aKtv;X9WR|4j$=dOm;-Y`|l z00yb5Q?VSFG`-OK2Zma*Z()yQg;LlWlh9;Yqx9~h`6=tU(-w)Fmd~{pZ?^bpeTO`@ z4XOpwBrF`6$nw8(n>gi)$gNo*$D08^Ik7Rh<ohRp6}ckrSN;6Hm+$X<HuN$uxN}WH zNJR9a#u|zHxTwmRzP80X{Z<d7AopAES|Q?~qGC_WHD9e)(nd-oi$&KEo<xT7Y`Spy zLRQ5uJSy`kSPum9(UuaqqaQr2)<~b6G&dc74Vs7$^Kn_?HfW^Dd-AC@_72!%=}B{| z0kBDhr0;U;!qI1PRXopF`eTjmK7CZ=ZPC-CvawdRFT7?jF%(DvE9wKLB4)w<1;8<J z@s<*I(VNJWKX;a>8ITfq$Lz&ugp?Z9ZYj9k=yL$V+pO0JIE6e;S2}y${!YX!uw8`O z^9mA}4xXPf542sRGL;@0*(b60njCk!@<273NB^+e*VAF6s#H6GIQUEqf;XTB4(a;g zkCs2LzebAtfGOU;w56hXf#!I&V8#e`ov%n>EZ>4;+`>;=zJEK$6`nPTuy`;Dc53OC zW?A;Rofbdoc{e!Gv3jA}Geu*ps^XNby4wNSEXkl^YkDiP=nr~hWLyD`A<p3mrP}sU z0+vk%Q_$YJXVrIj%bXOVUon5oXp`PSiPyMf*F;%gp6rI(0X)e*++R7w@i%StE=G-% z6rbbSi$x9qRXxO<6IsirDhxHd(DF}kkG;-es=5Z7W|>P29?Qw8$w?LyG0sJY?SMAV zh-Q;2sdDBO&cFqkc`6}`g5d|{bHX|c`R6W0KDYf%3U=BhJ!zU&$LE_jX>gdP<BtZL z?{x@%!G@cX1Tjsx?6>3xIHgUlLnrp)blRGFfAa+x<jPp%<Xbz<SLX>>G?;i%3Fr<z z)-Tl-fzri4gnV5gjG?>-@a0i~&4V;6{F|5WItKhQs@BVubxQ#Y)~U^b2BkT4iPOd1 zj4TPd`TEQeY9z?=(rzA+osuFSq9(lqU@CnxZNTX0y5qtj7@BIoOK-GESL)V&`;;X2 zN4Ua({yQD>aTi?3N>OQc;mRI;RKLeJ8L!!TH|O<uJ&8mhO3-hN@EH5!XLM>3QwDCv zS+guXom^qZ=5bCrJ(b9?G14se(Z-W<`*`o9Z=vtjl{w1JfN>%HVz~I^Np0uc4m_C1 z!ypAKO!^J+&^0s+Rh2Cym@O_QEs&Zjz!{e>Z(c=Lfg5MoUrXtNcoo0a?mIM;fR{6* zxrqbs%CUT=zB69y&tCfBk-f-^Gy&}77+iPiQhPub!f91)8zq}=qjeQmHb)*Wy|ejE ze^p0bOJZJ{_$_B#sDLY~ph!X0(D*w4d^>povNWMYwC(pTzdlFO;UoFivhgy1TXQ<D z1u7hkwC3eSSJYEyDwhQ+^fP14n*G^Qb*r;`atrN-zk1EzldAEn8l()iF%x-~P!MP{ z$k<U~Oezw>-isigGn*8<l5!6V5Ug~Jf8Z*S-zL*(nHFA)!N28FHh5jN1#CQCsXu{b zJzA}7xl-xI^FVn_^OKO)+b1?fw|oUC^#^p)d_)x@sM^u*?SQ`8P!n(xDKv|68%L`g zeoQ)_$~j=rmt*M#y@n44_zZ4zkDN&)os#=RK!=)-vr|zx%B}(@8Z4hm=17kd5}G?2 z_>9p}$JgMJHtHzBYzOf--%o~u#M9atM>qgvuJKuXtX?U=6;I7^)GqQ7m6rLrX+_Vf z&0quo1FdRlwk1wd7u1yf_Tgl$&1Aq=guiM{G;-zT9RM)ukPfApUZHsG<MjF{)V?>G zxM?SF2T!iv`<%}Bqcfbm9F7gwH6}vid8L*5^p78pR!0UUHqIyYZ^hRIcXCbS2<pOB z7T*g_jVY?6m;5X-)vw@s-Mk$%P+|E&nS7^zgY$*RJ^Z^S4L0y3MPk9U`p{Q4@pTvI z9EwwT*c9B0Lh-U>dcR5a)r`2d+6u2zS;E}v2d}uzFB#OogUl*Kp?$7trJORCH0@ip z@bJA#vDxP{v7fnmhxmS`HI}USKQK&W5je~=^N9!yjr~$iU(Jh!h1dR|!mWCd@A3gP z()~+S_UT8wsnIznoQJgNsM@d}%bBo)M;uuW<enm8gr;TbTraq{Aq+IaHWqyk0S0ux zUt2>lJC_Y>X!imEo&Qy`aqGHZSx#PArhVzktxN3%snj0jC#lyZZkVB4b=hV658tX? zjy+0=!C!%(ubZ5$@`O|ydX!f6MFw2=<8suNss(<}_$N1Dk@3Jn`SxXE`NZM8yZ6de zMLCrYK=r4cV#B?w?FA~GqpQgjY+_ZTt44<joKOKz_Egp^slu0ccyGob%r2QWFZbhj z7KGu=EZ>sNK5#gx>U=P&qIbC}?2o!y$#u}4enqiom@ryBx~l9?wfVwnV^>hKXy-9x zU)?l0C|$b2?GwlOd2zhbuP=S<Sz?R#7q2~z2}pnsNz>oA=J5l4o;~gQ0Z(x*8wfkO zXYq+GeGf3n7|GNUPU%3OWw_-j;NP7LPD3X3gVdSEx?a8samsyNuU6A_+I_s2ZeX71 z{-jbj8NpeqTQMCk9<2Q|&M#QOd_;J@N}#~HpeOjeo6aE1KX8D28<I2}IFV-eZGFFi zv#-1aae!3xJdELrmq_rFHp`Xklz-h>%v-hDFTY?$yW9dGk#>D~NVV2C-%rVjFK^GH zB1G;6JDo}5p=Me}j)Q$n-AveocloOPQrEfuEZ=WulShZLQ@=#o+#;KO7yMxff2Yd9 zFU4fCylbcgBIvh#_^`!yKN&jb%hTj_)MqLxJmj_6nfuK8X}w^XnnI+KsayK%ImK)t zvV#?UF84=^*M(@1>U`m0EVz|pTHwj7;{f&R=LbUEhY_&AZ?{=rUec>B*u127AyE-^ zcQ<aGCRk8v9dG8|GntW7*@1-3t748CH?B!i4zs4ckY9~rq8@H~uC#ne>{t1`N$G7_ z#x$x2K$seYxVzXh@N~DKQfqGpx^S*++7;or$Rdvvx(aGqbEA(zG%D}4`k5xi$2t2i z<?G~nBl&<cWX4~@WpO>tg>a)A2>gcWnRbI69~JbBZQOBbO*ZQ(_L(!PGM_rI74#E0 zuzg7{%%I{mlw1^Vcs{_!jG|wGBCs9EZ>IN|U{R4wJ#~oU%*Mu?#U0olyM@!j9X~-= z)-lW^1Vzf<zpa=(_$O}a`T3;GvYzMgm+xGpK18Vb=GbRt<~HLQdjsEm!?hupW6ze@ z%--)RL)($h7MA2~@(5}3w)qb66y7EL&kphj5+`g}H`4yujZ^|R*l9)NX;KRJ-3g9> zfB;7bENrKQ%dx6fk-f|xm=pf_t-(VdG>zuncg{52+L!|Q&o+da1Vn;;E16BlybY%G z&f^uAraMD5xj<k<vFg$qDyb05vLn3a*5XRTBI3(}gxngR!Ms{V!e2Zp3*zvVv8!IG z=*mR3s>a{{xWZ|@XZB=3yIGvqX*(nDUqMNn`S#Q~E^I9F!pHf8E`PNDqlGqmXrIeV zD$FqZ@DABOILCB|qh+jKel6msB6|G0od1uuVP~w>F4JzJ-HUfR+CT)_SJn0!f3t&3 zGHYn2Gru7`g>zuK_kzT~HVFR(_bxxj<4c>*qJPEOgG1Z7j#I<}-4ZHH>MZV|QEvt> ze2R3w{Fsu%h<1=TQ2zV8&j8o2$-)y3Ln$xJvntGY1p1uKES;yj&<x9wFdiu(DGW{Y zk8*Exah4PUhlM3;IYYAT8eN10v%s}k?Mb#AhA585>qqu=Gk<l!6ge`!BDNvNXp-9C zReL8R>31O7@H;)qq8FXOBFf>nN`FN$+-)!pp_F8$S>15jrQ;%^AeHt*+@Yho+?%V$ zbWV=HfVGjqI+3SgdPX#(w7Qi9<G~B1P5syX!8l9L0OU@J#z?wEP^5h1=6}`3^e^LN zIOJL1(j|e;Lpxb8(Era@`3!6zC%#NgedU-J?be{b@sdafNCXvk2iXh$siOZV%8c{> zLjUiA|9eqTM2hWHW0(r#@g2+v{|knh5fBUO?1&prIp+M{Kj`gBz#`E8o^coV-#G6A z=vC_Vsic1jQbHATu*TByDgKML{@d8~&IaiSgqU%iZv>^ECPgF{Yb-X0;(rRD-)StF z`Box}@;f}A<9((+W2Bnz_j%s28KV>st@rPPga17EyD$Ltq>9%#9<93g9)8bn5&LUp zQ3($LaV;ff-17fQ13XFqyGD1`^SOqB<aHN2`9*uDg~A%tfO0zKkPE449O5CLwfyts zzgDtfKaFXhy4tM`>LIPe_xfT~@7$&b*D<cmvLobqMbGtYc~S6l0jo)~P5hUIdQ)Ca zoLPC2Bx=b$%+CP+$pM!n*et4y4-juEx-&7=uL-@}TxqAnvY0F;PYyvH6#i=iD9i&; zG+oJhc1}Q$#0(*3|C^Lfh;U+SL2RtE!fvAcvVV;}V_kA^fqCcn?ng6q{yWPXnNS!H zCr0wg|B`HH6_xg;QT#i?A&wnpeB`!B^Fk-^)O^fy_`LjNk6jA%7S?P1Mey(PX_11o zuyxy^C$qScwGk^AQJ>b$*2}=v6p&;E@()`9`m;)Ow;Ut*^h#JB_<n!$Mb!}Z&4Yp~ zJaK?Nwt_Z4c_ELC4aI-m@tDOQgmrhefrP1IA=FU$YpiU{FXlzIcneCqO$sc`=ZS*G K<4QTJ@c#j4GvEOL literal 38057 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 diff --git a/docs/en_US/search_objects.rst b/docs/en_US/search_objects.rst new file mode 100644 index 000000000..885e1d756 --- /dev/null +++ b/docs/en_US/search_objects.rst @@ -0,0 +1,34 @@ +.. _search_objects: + +*********************** +`Search objects`:index: +*********************** + +.. image:: images/search_objects.png + :alt: Search objects dialog + :align: center + +With this dialog, you can search for almost any kind of objects in a +database. + +You can access it by right clicking a database or any of its child nodes +and select "Search objects". You can also access it by hitting the +shortcut (default ALT+SHIFT+S). + +The minimum pattern length are 3 characters. The search performed is +non-casesensitive and will find all objets whose name contains the pattern. +You can only search for object names. + +The result is presented in the grid with object name, object type and +the object tree path in the :ref:`browser <tree_control>`. You can double +click on a result row to select the object in the +:ref:`browser <tree_control>`. If the object is greyed out, this means that you +have not enabled those object types in the :ref:`preferences <preferences>`, +so you can't double click on it. + +You can filter based on a particular object type by selecting one from the +object type dropdown. If the search button is hit when one of the object type +is selected then only those types will be fetch from the database. +An object type will not be visible in the dropdown if the database server +does not support it or if it is not enabled from the +:ref:`preferences <preferences>`. \ No newline at end of file diff --git a/docs/en_US/toolbar.rst b/docs/en_US/toolbar.rst index 12dc8621a..f4c685f24 100644 --- a/docs/en_US/toolbar.rst +++ b/docs/en_US/toolbar.rst @@ -18,4 +18,6 @@ the selected browser node. * Use the :ref:`View Data <editgrid>` button to view/edit the data stored in a selected table. * Use the :ref:`Filtered Rows <viewdata_filter>` button to access the Data Filter popup - to apply a filter to a set of data for viewing/editing. \ No newline at end of file + to apply a filter to a set of data for viewing/editing. +* Use the :ref:`Search objects <search_objects>` button to access the search objects + dialog. It helps you search any database object. \ No newline at end of file diff --git a/web/pgadmin/browser/register_browser_preferences.py b/web/pgadmin/browser/register_browser_preferences.py index 09f472795..5f57f9fa1 100644 --- a/web/pgadmin/browser/register_browser_preferences.py +++ b/web/pgadmin/browser/register_browser_preferences.py @@ -249,6 +249,21 @@ def register_browser_preferences(self): fields=fields ) + self.preference.register( + 'keyboard_shortcuts', + 'sub_menu_search_objects', + gettext('Search objects'), + 'keyboardshortcut', + { + 'alt': True, + 'shift': True, + 'control': False, + 'key': {'key_code': 83, 'char': 's'} + }, + category_label=gettext('Keyboard shortcuts'), + fields=fields + ) + self.preference.register( 'keyboard_shortcuts', 'sub_menu_create', diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js index 7724ef4c4..b2127c4b0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js +++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js @@ -24,7 +24,7 @@ define('pgadmin.node.extension', [ pgAdmin.Browser.Nodes['coll-extension'] = pgAdmin.Browser.Collection.extend({ node: 'extension', - label: gettext('Extension'), + label: gettext('Extensions'), type: 'coll-extension', columns: ['name', 'owner', 'comment'], }); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql new file mode 100644 index 000000000..8b11b594a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/12_plus/nodes.sql @@ -0,0 +1,11 @@ +SELECT + nsp.oid, nspname AS name +FROM + pg_namespace nsp +WHERE nspparent = {{scid}}::oid +{% if pkgid %} +AND nsp.oid = {{pkgid}}::oid +{% endif %} +AND nspobjecttype = 0 +AND nspcompoundtrigger = false +ORDER BY nspname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py index 2984a58e4..4b0a0918c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py @@ -54,8 +54,8 @@ class IndexConstraintModule(ConstraintTypeModule): initialized. """ - NODE_TYPE = 'Index constraint' - COLLECTION_LABEL = _('index_constraint') + NODE_TYPE = 'index_constraint' + COLLECTION_LABEL = _('Index constraint') def __init__(self, *args, **kwargs): """ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py index e455b8adf..9ffbe742c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/__init__.py @@ -29,8 +29,11 @@ from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare def backend_supported(module, manager, **kwargs): - if 'tid' in kwargs and CollectionNodeModule.BackendSupported( - module, manager, **kwargs): + + if CollectionNodeModule.BackendSupported(module, manager, **kwargs): + if 'tid' not in kwargs: + return True + conn = manager.connection(did=kwargs['did']) template_path = 'partitions/sql/{0}/#{0}#{1}#'.format( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py index bf92e5f01..1de4de825 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/tests/test_backend_supported.py @@ -21,19 +21,19 @@ else: class TestBackendSupport(BaseTestGenerator): scenarios = [ - ('when tid is not present in arguments, should return None and no ' - 'query should be done', + ('when tid is not present in arguments, but server version' + 'is supported then return True', dict( manager=dict( - server_type="", - version="" + server_type="pg", + version="100000" ), input_arguments=dict(did=432), collection_node_active=True, connection_execution_return_value=[], - expected_return_value=None, + expected_return_value=True, expect_error_response=False, expected_number_calls_on_render_template=0 )), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql index 5f9bf9532..f1645d070 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/macros/catalogs.sql @@ -9,6 +9,9 @@ (SELECT 1 FROM pg_class WHERE relname = 'tables' AND relnamespace = {{ tbl }}.oid LIMIT 1)) {%- endmacro %} +{% macro IS_CATALOG_SCHEMA(schema_col_name) -%} + {{ schema_col_name }} IN ('pg_catalog', 'pgagent', 'information_schema') +{%- endmacro %} {% macro LABELS(tbl, _) -%} CASE {{ tbl }}.nspname WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' @@ -17,9 +20,24 @@ ELSE {{ tbl }}.nspname END AS name {%- endmacro %} +{% macro LABELS_SCHEMACOL(schema_col_name, _) -%} + CASE {{ schema_col_name }} + WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' + WHEN 'pgagent' THEN '{{ _( 'pgAgent Job Scheduler' ) }} (pgagent)' + WHEN 'information_schema' THEN '{{ _( 'ANSI' ) }} (information_schema)' + ELSE {{ schema_col_name }} + END +{%- endmacro %} {% macro DB_SUPPORT(tbl) -%} CASE WHEN {{ tbl }}.nspname = ANY('{information_schema}') THEN false ELSE true END {%- endmacro %} +{% macro DB_SUPPORT_SCHEMACOL(schema_col_name) -%} + CASE + WHEN {{ schema_col_name }} = ANY('{information_schema}') + THEN false + ELSE true END +{%- endmacro %} + diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql index 37fb594ed..b9fc276ef 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/macros/catalogs.sql @@ -13,6 +13,9 @@ (SELECT 1 FROM pg_proc WHERE pronamespace = {{ tbl }}.oid and proname = 'run_job' LIMIT 1)) {%- endmacro %} +{% macro IS_CATALOG_SCHEMA(schema_col_name) -%} + {{ schema_col_name }} IN ('pg_catalog', 'pgagent', 'information_schema', 'dbo', 'sys', 'dbms_job_procedure') +{%- endmacro %} {% macro LABELS(tbl, _) -%} CASE {{ tbl }}.nspname WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' @@ -23,9 +26,25 @@ ELSE {{ tbl }}.nspname END AS name {%- endmacro %} -{% macro DB_SUPPORT(tbl) -%} +{% macro LABELS_SCHEMACOL(schema_col_name, _) -%} + CASE {{ schema_col_name }} + WHEN 'pg_catalog' THEN '{{ _( 'PostgreSQL Catalog' ) }} (pg_catalog)' + WHEN 'pgagent' THEN '{{ _( 'pgAgent Job Scheduler' ) }} (pgagent)' + WHEN 'information_schema' THEN '{{ _( 'ANSI' ) }} (information_schema)' + WHEN 'dbo' THEN 'Redmond (dbo)' + WHEN 'sys' THEN 'Redwood (sys)' + ELSE {{ schema_col_name }} + END +{%- endmacro %} +{% macro DB_SUPPORT(tbl, schema_col_name) -%} CASE WHEN {{ tbl }}.nspname = ANY('{information_schema,sys,dbo}') THEN false ELSE true END {%- endmacro %} +{% macro DB_SUPPORT_SCHEMACOL(schema_col_name) -%} + CASE + WHEN {{ schema_col_name }} = ANY('{information_schema,sys,dbo}') + THEN false + ELSE true END +{%- endmacro %} diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js index 47500caf7..c7bb247ec 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js +++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js @@ -18,6 +18,7 @@ define('pgadmin.node.role', [ pgAdmin.Browser.Nodes['coll-role'] = pgAdmin.Browser.Collection.extend({ node: 'role', + label: gettext('Login/Group Roles'), type: 'coll-role', columns: [ 'rolname', 'rolvaliduntil', 'rolconnlimit', 'rolcanlogin', diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js index 2ec4fe1b5..a3c9ad96e 100644 --- a/web/pgadmin/browser/static/js/collection.js +++ b/web/pgadmin/browser/static/js/collection.js @@ -51,14 +51,23 @@ define([ }]); // show query tool only in context menu of supported nodes. - if (pgAdmin.DataGrid && pgAdmin.unsupported_nodes) { - if (_.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) { + + if (pgAdmin.unsupported_nodes && _.indexOf(pgAdmin.unsupported_nodes, this.type) == -1) { + if ((this.type == 'database' && this.allowConn) || this.type != 'database') { pgAdmin.Browser.add_menus([{ - name: 'show_query_tool', node: this.type, module: this, + name: 'show_query_tool', node: this.type, module: pgAdmin.DataGrid, applies: ['context'], callback: 'show_query_tool', priority: 998, label: gettext('Query Tool...'), icon: 'pg-font-icon icon-query-tool', }]); + + // show search objects same as query tool + pgAdmin.Browser.add_menus([{ + name: 'search_objects', node: this.type, module: pgAdmin.SearchObjects, + applies: ['context'], callback: 'show_search_objects', + priority: 997, label: gettext('Search Objects...'), + icon: 'fa fa-search', + }]); } } }, diff --git a/web/pgadmin/browser/static/js/keyboard.js b/web/pgadmin/browser/static/js/keyboard.js index 5cd00e6a3..8705e14be 100644 --- a/web/pgadmin/browser/static/js/keyboard.js +++ b/web/pgadmin/browser/static/js/keyboard.js @@ -34,6 +34,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'tabbed_panel_forward': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'tabbed_panel_forward').value), 'sub_menu_query_tool': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_query_tool').value), 'sub_menu_view_data': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_view_data').value), + 'sub_menu_search_objects': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_search_objects').value), 'sub_menu_properties': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_properties').value), 'sub_menu_create': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_create').value), 'sub_menu_delete': commonUtils.parseShortcutValue(pgBrowser.get_preference('browser', 'sub_menu_delete').value), @@ -55,6 +56,7 @@ _.extend(pgBrowser.keyboardNavigation, { 'bindLeftTree': {'shortcuts': this.keyboardShortcut.left_tree_shortcut}, // Main menu, 'bindSubMenuQueryTool': {'shortcuts': this.keyboardShortcut.sub_menu_query_tool}, // Sub menu - Open Query Tool, 'bindSubMenuViewData': {'shortcuts': this.keyboardShortcut.sub_menu_view_data}, // Sub menu - Open View Data, + 'bindSubMenuSearchObjects': {'shortcuts': this.keyboardShortcut.sub_menu_search_objects}, // Sub menu - Open search objects, 'bindSubMenuProperties': {'shortcuts': this.keyboardShortcut.sub_menu_properties}, // Sub menu - Edit Properties, 'bindSubMenuCreate': {'shortcuts': this.keyboardShortcut.sub_menu_create}, // Sub menu - Create Object, 'bindSubMenuDelete': {'shortcuts': this.keyboardShortcut.sub_menu_delete}, // Sub menu - Delete object, @@ -261,6 +263,15 @@ _.extend(pgBrowser.keyboardNavigation, { // Call data grid method to render view data pgAdmin.DataGrid.show_data_grid({'mnuid': 1}, tree.i); }, + bindSubMenuSearchObjects: function() { + const tree = this.getTreeDetails(); + + if (!tree.d) + return; + + // Call data grid method to render view data + pgAdmin.SearchObjects.show_search_objects('', tree.i); + }, bindSubMenuProperties: function() { const tree = this.getTreeDetails(); diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js index d14dcc5bb..df4657b6b 100644 --- a/web/pgadmin/browser/static/js/node.js +++ b/web/pgadmin/browser/static/js/node.js @@ -177,6 +177,14 @@ define('pgadmin.browser.node', [ // Show query tool only in context menu of supported nodes. if (_.indexOf(pgAdmin.unsupported_nodes, self.type) == -1) { + let enable = function(itemData) { + if (itemData._type == 'database' && itemData.allowConn) + return true; + else if (itemData._type != 'database') + return true; + else + return false; + }; pgAdmin.Browser.add_menus([{ name: 'show_query_tool', node: self.type, @@ -186,14 +194,15 @@ define('pgadmin.browser.node', [ priority: 998, label: gettext('Query Tool...'), icon: 'pg-font-icon icon-query-tool', - enable: function(itemData) { - if (itemData._type == 'database' && itemData.allowConn) - return true; - else if (itemData._type != 'database') - return true; - else - return false; - }, + enable: enable, + }]); + + // show search objects same as query tool + pgAdmin.Browser.add_menus([{ + name: 'search_objects', node: self.type, module: pgAdmin.SearchObjects, + applies: ['context'], callback: 'show_search_objects', + priority: 997, label: gettext('Search Objects...'), + icon: 'fa fa-search', enable: enable, }]); } diff --git a/web/pgadmin/browser/static/js/toolbar.js b/web/pgadmin/browser/static/js/toolbar.js index 955fe6f32..6eb1f39f4 100644 --- a/web/pgadmin/browser/static/js/toolbar.js +++ b/web/pgadmin/browser/static/js/toolbar.js @@ -46,6 +46,16 @@ let _defaultToolBarButtons = [ parentClass: 'pg-toolbar-btn btn-secondary', enabled: false, }, + { + label: gettext('Search objects'), + ariaLabel: gettext('Search objects'), + btnClass: 'fa fa-search', + text: '', + toggled: false, + toggleClass: '', + parentClass: 'pg-toolbar-btn btn-secondary', + enabled: false, + }, ]; // Place holder for non default tool bar buttons. @@ -92,6 +102,8 @@ export function initializeToolbar(panel, wcDocker) { pgAdmin.DataGrid.show_data_grid({mnuid: 3}, pgAdmin.Browser.tree.selected()); else if ('name' in data && data.name === gettext('Filtered Rows')) pgAdmin.DataGrid.show_filtered_row({mnuid: 4}, pgAdmin.Browser.tree.selected()); + else if ('name' in data && data.name === gettext('Search objects')) + pgAdmin.SearchObjects.show_search_objects('', pgAdmin.Browser.tree.selected()); }); } diff --git a/web/pgadmin/browser/templates/browser/index.html b/web/pgadmin/browser/templates/browser/index.html index 682c23d65..67a10ba89 100644 --- a/web/pgadmin/browser/templates/browser/index.html +++ b/web/pgadmin/browser/templates/browser/index.html @@ -11,7 +11,7 @@ {% block init_script %} try { require( -['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes'], +['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes', 'sources/generated/slickgrid'], function() { }, function() { diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js index 4b0ab410b..96ad3c330 100644 --- a/web/pgadmin/static/bundle/slickgrid.js +++ b/web/pgadmin/static/bundle/slickgrid.js @@ -8,7 +8,6 @@ ////////////////////////////////////////////////////////////// import 'slickgrid/lib/jquery.event.drag-2.3.0'; -import 'slickgrid/lib/jquery-ui-1.11.3'; import 'slickgrid/slick.core'; import 'slickgrid/slick.grid'; import 'slickgrid/slick.dataview'; @@ -21,5 +20,6 @@ import 'slickgrid/plugins/slick.cellrangeselector'; import 'slickgrid/plugins/slick.checkboxselectcolumn'; import 'slickgrid/plugins/slick.rowselectionmodel'; import 'sources/slickgrid/custom_header_buttons'; +import 'sources/slickgrid/plugins/slick.autocolumnsize'; export default window.Slick; diff --git a/web/pgadmin/static/css/style.css b/web/pgadmin/static/css/style.css index 05709ef58..7ab5ced97 100644 --- a/web/pgadmin/static/css/style.css +++ b/web/pgadmin/static/css/style.css @@ -5,18 +5,17 @@ @import '~tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.css'; @import '~bootstrap4-toggle/css/bootstrap4-toggle.css'; @import '~backgrid-filter/backgrid-filter.css'; -@import '~slickgrid/css/select2.css'; @import '~jquery-contextmenu/dist/jquery.contextMenu.css'; @import '~webcabin-docker/Build/wcDocker.css'; @import '~acitree/css/aciTree.css'; @import '~leaflet/dist/leaflet.css'; +@import '../../../node_modules/select2/dist/css/select2.css'; @import '~codemirror/lib/codemirror.css'; @import '~codemirror/addon/dialog/dialog.css'; @import '~codemirror/addon/scroll/simplescrollbars.css'; @import '~slickgrid/slick.grid.css'; -@import '~slickgrid/slick-default-theme.css'; @import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css'; @import '../vendor/backgrid/backgrid.css'; diff --git a/web/pgadmin/static/js/alertify.pgadmin.defaults.js b/web/pgadmin/static/js/alertify.pgadmin.defaults.js index 84dfc12fe..daa60f696 100644 --- a/web/pgadmin/static/js/alertify.pgadmin.defaults.js +++ b/web/pgadmin/static/js/alertify.pgadmin.defaults.js @@ -271,7 +271,8 @@ define([ let container = $(self.elements.footer); commonUtils.findAndSetFocus(container.find('button:not([disabled]):last')); } - }); }); + }); + }); this.set('onresize', alertifyDialogStartResizing.bind(this, true)); this.set('onresized', alertifyDialogResized.bind(this, true)); this.set('onmaximized', alertifyDialogResized); diff --git a/web/pgadmin/static/js/alertify/dialog.js b/web/pgadmin/static/js/alertify/dialog.js index 6f4933720..8e5bdb738 100644 --- a/web/pgadmin/static/js/alertify/dialog.js +++ b/web/pgadmin/static/js/alertify/dialog.js @@ -80,6 +80,39 @@ export class Dialog { return serverInformation; } + retrieveAncestorOfTypeDatabase(item) { + let databaseInfo = null; + let aciTreeItem = item || this.pgBrowser.treeMenu.selected(); + let treeNode = this.pgBrowser.treeMenu.findNodeByDomElement(aciTreeItem); + + if (treeNode) { + if(treeNode.getData()._type === 'database') { + databaseInfo = treeNode.getData(); + } else { + let nodeData = null; + treeNode.ancestorNode( + (node) => { + nodeData = node.getData(); + if(nodeData._type === 'database') { + databaseInfo = nodeData; + return true; + } + return false; + } + ); + } + } + + if (databaseInfo === null) { + this.alertify.alert( + gettext(this.errorAlertTitle), + gettext('Please select a database or its child node from the browser.') + ); + } + + return databaseInfo; + } + hasBinariesConfiguration(serverInformation) { const module = 'paths'; let preference_name = 'pg_bin_dir'; diff --git a/web/pgadmin/static/js/alertify/dialog_factory.js b/web/pgadmin/static/js/alertify/dialog_factory.js index cb0ae1552..760fde679 100644 --- a/web/pgadmin/static/js/alertify/dialog_factory.js +++ b/web/pgadmin/static/js/alertify/dialog_factory.js @@ -9,6 +9,7 @@ import * as BackupDialog from '../../../tools/backup/static/js/backup_dialog_wrapper'; import {RestoreDialogWrapper} from '../../../tools/restore/static/js/restore_dialog_wrapper'; +import SearchObjectsDialogWrapper from '../../../tools/search_objects/static/js/search_objects_dialog_wrapper'; export class DialogFactory { constructor(pgBrowser, $, @@ -25,6 +26,8 @@ export class DialogFactory { create(dialogTitle, typeOfDialog) { if (typeOfDialog === 'restore') { return this.createRestoreDialog(dialogTitle, typeOfDialog); + } else if (typeOfDialog === 'search_objects') { + return this.createSearchObjectsDialog(dialogTitle, typeOfDialog); } else { return this.createBackupDialog(dialogTitle, typeOfDialog); } @@ -49,4 +52,14 @@ export class DialogFactory { this.dialogModel, this.backform); } + + createSearchObjectsDialog(dialogTitle, typeOfDialog) { + return new SearchObjectsDialogWrapper( + this.dialogContainerSelector, dialogTitle, typeOfDialog, + this.jquery, + this.pgBrowser, + this.alertify, + this.dialogModel, + this.backform); + } } diff --git a/web/pgadmin/static/js/alertify/dialog_wrapper.js b/web/pgadmin/static/js/alertify/dialog_wrapper.js index e4c275f3a..32d9a7a0b 100644 --- a/web/pgadmin/static/js/alertify/dialog_wrapper.js +++ b/web/pgadmin/static/js/alertify/dialog_wrapper.js @@ -58,7 +58,11 @@ export class DialogWrapper { let backform_tab = $(alertifyDialog.elements.body).find('.backform-tab'); backform_tab.attr('tabindex', -1); this.pgBrowser.keyboardNavigation.getDialogTabNavigator($(alertifyDialog.elements.dialog)); - const container = backform_tab.find('.tab-content:first > .tab-pane.active:first'); + let container = backform_tab.find('.tab-content:first > .tab-pane.active:first'); + + if(container.length === 0 && alertifyDialog.elements.content.innerHTML) { + container = $(alertifyDialog.elements.content); + } commonUtils.findAndSetFocus(container); } diff --git a/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js b/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js index 40e537e1b..85b339139 100644 --- a/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js +++ b/web/pgadmin/static/js/slickgrid/plugins/slick.autocolumnsize.js @@ -98,7 +98,7 @@ function getTemplateWidth(rowEl, template) { var cell = $(rowEl.find('.slick-cell')); cell.append(template); - $(cell).find('*').css('position', 'relative'); + cell.find('*').css('position', 'relative'); return cell.outerWidth() + 1; } @@ -128,7 +128,7 @@ 'text-overflow': 'initial', 'white-space': 'nowrap', }); - var gridCanvas = $container.find('.grid-canvas'); + var gridCanvas = $container.find('.grid-canvas').first(); $(gridCanvas).append(rowEl); return rowEl; } diff --git a/web/pgadmin/static/js/tree/tree.js b/web/pgadmin/static/js/tree/tree.js index 57b6207c8..984d247d3 100644 --- a/web/pgadmin/static/js/tree/tree.js +++ b/web/pgadmin/static/js/tree/tree.js @@ -50,17 +50,50 @@ export class TreeNode { } reload(tree) { - this.unload(tree); - tree.aciTreeApi.setInode(this.domNode); - tree.aciTreeApi.deselect(this.domNode); - setTimeout(() => { - tree.selectNode(this.domNode); - }, 0); + return new Promise((resolve)=>{ + this.unload(tree) + .then(()=>{ + tree.aciTreeApi.setInode(this.domNode); + tree.aciTreeApi.deselect(this.domNode); + setTimeout(() => { + tree.selectNode(this.domNode); + }, 0); + resolve(); + }); + }); } unload(tree) { - this.children = []; - tree.aciTreeApi.unload(this.domNode); + return new Promise((resolve, reject)=>{ + this.children = []; + tree.aciTreeApi.unload(this.domNode, { + success: ()=>{ + resolve(true); + }, + fail: ()=>{ + reject(); + }, + }); + }); + } + + open(tree, suppressNoDom) { + return new Promise((resolve, reject)=>{ + if(suppressNoDom && (this.domNode == null || typeof(this.domNode) === 'undefined')) { + resolve(true); + } else if(tree.aciTreeApi.isOpen(this.domNode)) { + resolve(true); + } else { + tree.aciTreeApi.open(this.domNode, { + success: ()=>{ + resolve(true); + }, + fail: ()=>{ + reject(true); + }, + }); + } + }); } /* @@ -202,6 +235,47 @@ export class Tree { return findInTree(this.rootNode, path.join('.')); } + findNodeWithToggle(path) { + let tree = this; + path = path.join('.'); + + let onCorrectPath = function(matchPath) { + return (matchPath !== undefined && path !== undefined + && (path.startsWith(matchPath + '.') || path === matchPath)); + }; + + return (function findInNode(currentNode) { + return new Promise((resolve, reject)=>{ + if (path === null || path === undefined || path.length === 0) { + resolve(null); + } + /* No point in checking the children if + * the path for currentNode itself is not matching + */ + if (currentNode.path !== undefined && !onCorrectPath(currentNode.path)) { + reject(null); + } else if (currentNode.path === path) { + resolve(currentNode); + } else { + currentNode.open(tree, true) + .then(()=>{ + for (let i = 0, length = currentNode.children.length; i < length; i++) { + let childNode = currentNode.children[i]; + if(onCorrectPath(childNode.path)) { + resolve(findInNode(childNode)); + return; + } + } + reject(null); + }) + .catch(()=>{ + reject(null); + }); + } + }); + })(this.rootNode); + } + findNodeByDomElement(domElement) { const path = this.translateTreeNodeIdFromACITree(domElement); if(!path || !path[0]) { @@ -215,8 +289,19 @@ export class Tree { return this.aciTreeApi.selected(); } - selectNode(aciTreeIdentifier) { + /* scrollIntoView will scroll only to top and bottom + * Logic can be added for scroll to middle + */ + scrollTo(domElement) { + domElement.scrollIntoView(); + } + + selectNode(aciTreeIdentifier, scrollOnSelect) { this.aciTreeApi.select(aciTreeIdentifier); + + if(scrollOnSelect) { + this.scrollTo(aciTreeIdentifier[0]); + } } createOrUpdateNode(id, data, parent, domNode) { @@ -227,6 +312,7 @@ export class Tree { const oldNode = this.findNode(oldNodePath); if (oldNode !== null) { oldNode.data = data; + oldNode.domNode = domNode; return oldNode; } @@ -238,6 +324,18 @@ export class Tree { return node; } + unloadNode(id, data, domNode, parentPath) { + let oldNodePath = [id]; + const parent = this.findNode(parentPath); + if(parent !== null && parent !== undefined) { + oldNodePath = [parent.path, id]; + } + const oldNode = this.findNode(oldNodePath); + if(oldNode) { + oldNode.children = []; + } + } + /** * Given the JQuery object that contains the ACI Tree * this method is responsible for registering this tree class @@ -252,16 +350,20 @@ export class Tree { $treeJQuery.on('acitree', function (event, api, item, eventName) { if (api.isItem(item)) { /* If the id of node is changed, the path should also be changed */ - if (eventName === 'added' || eventName === 'idset') { + if (['added', 'idset', 'beforeunload'].indexOf(eventName) != -1) { const id = api.getId(item); const data = api.itemData(item); + const parentId = this.translateTreeNodeIdFromACITree(api.parent(item)); - if(eventName === 'added') { - this.prepareDraggable(data, item); - } + if(eventName === 'beforeunload') { + this.unloadNode(id, data, item, parentId); + } else { + if(eventName === 'added') { + this.prepareDraggable(data, item); + } - const parentId = this.translateTreeNodeIdFromACITree(api.parent(item)); - this.addNewNode(id, data, item, parentId); + this.addNewNode(id, data, item, parentId); + } if(data.errmsg) { Alertify.error(data.errmsg); } diff --git a/web/pgadmin/static/js/utils.js b/web/pgadmin/static/js/utils.js index 86dae698e..7bdddba85 100644 --- a/web/pgadmin/static/js/utils.js +++ b/web/pgadmin/static/js/utils.js @@ -32,11 +32,12 @@ export function findAndSetFocus(container) { * browser. For eg, in safari focus() works only when element has * tabindex="0", whereas in Chrome it works in any case */ + if (first_el.length == 0) { first_el = container .find(` - .pgadmin-controls:first input:enabled, .pgadmin-controls:first .btn:not(.toggle), + .pgadmin-controls:first, .ajs-commands:first, .CodeMirror-scroll`) .find('*[tabindex]:not([tabindex="-1"])'); diff --git a/web/pgadmin/static/scss/_alert.scss b/web/pgadmin/static/scss/_alert.scss index 3f2e561e3..0e7e234d1 100644 --- a/web/pgadmin/static/scss/_alert.scss +++ b/web/pgadmin/static/scss/_alert.scss @@ -119,21 +119,18 @@ } .success-in-footer { - border-radius: 5px; - border: 1px solid transparent; - - .alert-text { - border-color: $color-success-light; - } + border-radius: $border-radius; + border: 1px solid $color-success-light; + background: $color-success-light; } .info-in-footer { + border-radius: $border-radius; border: 1px solid $color-primary; - border-radius: 4px; - height: 35px; + background: $color-primary-light; - .alert-text { - border: none; + .fa { + font-size: 1rem; } } } diff --git a/web/pgadmin/static/scss/_webcabin.pgadmin.scss b/web/pgadmin/static/scss/_webcabin.pgadmin.scss index 4846a8031..ca806785a 100644 --- a/web/pgadmin/static/scss/_webcabin.pgadmin.scss +++ b/web/pgadmin/static/scss/_webcabin.pgadmin.scss @@ -166,7 +166,7 @@ .wcTabIcon { background-position: center; - padding: 0px 10px; + padding: 0rem 0.75rem; &.fa, &.pg-font-icon{ padding: 0rem 0.25rem 0rem 0rem diff --git a/web/pgadmin/tools/search_objects/__init__.py b/web/pgadmin/tools/search_objects/__init__.py new file mode 100644 index 000000000..e8bd59141 --- /dev/null +++ b/web/pgadmin/tools/search_objects/__init__.py @@ -0,0 +1,87 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +"""Implements Search Object feature""" + +from flask import request +from flask_babelex import gettext +from flask_security import login_required + +from pgadmin.utils import PgAdminModule +from pgadmin.utils.ajax import make_json_response, bad_request,\ + internal_server_error +from pgadmin.utils.preferences import Preferences +from pgadmin.tools.search_objects.utils import SearchObjectsHelper + +MODULE_NAME = 'search_objects' + + +class SearchObjectsModule(PgAdminModule): + LABEL = gettext('Search objects') + + def get_exposed_url_endpoints(self): + """ + Returns: + list: URL endpoints for search_object module + """ + return ['search_objects.search', 'search_objects.types'] + + def show_system_objects(self): + """ + return system preference objects + """ + return self.pref_show_system_objects.get() + + def register_preferences(self): + """ + Get show_system_objects preference + """ + browser_preference = Preferences.module('browser') + self.pref_show_system_objects =\ + browser_preference.preference('show_system_objects') + + +# Create blueprint for BackupModule class +blueprint = SearchObjectsModule( + MODULE_NAME, __name__, static_url_path='' +) + + [email protected]("/", endpoint='index') +@login_required +def index(): + return bad_request(errormsg=_("This URL cannot be called directly.")) + + [email protected]("types/<int:sid>/<int:did>", endpoint='types') +@login_required +def types(sid, did): + so_obj = SearchObjectsHelper(sid, did, blueprint.show_system_objects()) + return make_json_response(data=so_obj.get_supported_types()) + + [email protected]("search/<int:sid>/<int:did>", endpoint='search') +@login_required +def search(sid, did): + """ + URL args: + text <required>: search text + type <optional>: type of object to be searched. + """ + text = request.args.get('text', None) + obj_type = request.args.get('type', None) + + so_obj = SearchObjectsHelper(sid, did, blueprint.show_system_objects()) + + status, res = so_obj.search(text, obj_type) + + if not status: + return internal_server_error(errormsg=res) + + return make_json_response(data=res) diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects.js b/web/pgadmin/tools/search_objects/static/js/search_objects.js new file mode 100644 index 000000000..98a415e94 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects.js @@ -0,0 +1,90 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +define([ + 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin.alertifyjs', + 'sources/pgadmin', 'sources/csrf', 'pgadmin.browser.toolbar', + 'pgadmin.search_objects/search_objects_dialog', +], function( + gettext, url_for, $, _, alertify, pgAdmin, csrfToken, toolBar, SearchObjectsDialog +) { + + var pgBrowser = pgAdmin.Browser; + if (pgAdmin.SearchObjects) + return pgAdmin.SearchObjects; + + pgAdmin.SearchObjects = { + init: function() { + if (this.initialized) + return; + + this.initialized = true; + csrfToken.setPGCSRFToken(pgAdmin.csrf_token_header, pgAdmin.csrf_token); + + // Define the nodes on which the menus to be appear + var menus = [{ + name: 'search_objects', + module: this, + applies: ['tools'], + callback: 'show_search_objects', + enable: this.search_objects_enabled, + priority: 1, + label: gettext('Search objects'), + }, { + name: 'search_objects', + module: this, + applies: ['context'], + callback: 'show_search_objects', + enable: this.search_objects_enabled, + priority: 1, + label: gettext('Search objects'), + }]; + + pgBrowser.add_menus(menus); + return this; + }, + + search_objects_enabled: function(obj) { + /* Same as query tool */ + var isEnabled = (() => { + if (!_.isUndefined(obj) && !_.isNull(obj)) { + if (_.indexOf(pgAdmin.unsupported_nodes, obj._type) == -1) { + if (obj._type == 'database' && obj.allowConn) { + return true; + } else if (obj._type != 'database') { + return true; + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + })(); + + toolBar.enable(gettext('Search objects'), isEnabled); + return isEnabled; + }, + + // Callback to show the dialog + show_search_objects: function(action, item) { + let dialog = new SearchObjectsDialog.default( + pgBrowser, + $, + alertify, + {}, + ); + dialog.draw(action, item, {}, pgBrowser.stdW.md, pgBrowser.stdH.lg); + }, + }; + + return pgAdmin.SearchObjects; +}); diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js new file mode 100644 index 000000000..4482f7eb4 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog.js @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import gettext from 'sources/gettext'; +import {Dialog} from 'sources/alertify/dialog'; +import {getPanelTitle} from 'tools/datagrid/static/js/datagrid_panel_title'; + +export default class SearchObjectsDialog extends Dialog { + constructor(pgBrowser, $, alertify, BackupModel, backform = null) { + super(gettext('Search Objects Error'), + '<div class=\'search_objects_dialog\'></div>', + pgBrowser, $, alertify, BackupModel, backform + ); + } + + dialogName() { + return 'search_objects'; + } + + draw(action, aciTreeItem, params, width=0, height=0) { + let dbInfo = this.retrieveAncestorOfTypeDatabase(aciTreeItem); + if (!dbInfo) { + return; + } + + let dialogTitle = getPanelTitle(this.pgBrowser, aciTreeItem); + dialogTitle = gettext('Search Objects - ') + dialogTitle; + const dialog = this.createOrGetDialog( + gettext('Search Objects...'), + 'search_objects' + ); + dialog(dialogTitle).resizeTo(width, height); + } +} diff --git a/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js new file mode 100644 index 000000000..e489f246a --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/js/search_objects_dialog_wrapper.js @@ -0,0 +1,649 @@ +import {getTreeNodeHierarchyFromElement} from 'sources/tree/pgadmin_tree_node'; +import axios from 'axios/index'; +import gettext from 'sources/gettext'; +import url_for from 'sources/url_for'; +import 'select2'; +import {DialogWrapper} from 'sources/alertify/dialog_wrapper'; +import Slick from 'sources/../bundle/slickgrid'; +import pgAdmin from 'sources/pgadmin'; + + +export default class SearchObjectsDialogWrapper extends DialogWrapper { + constructor(dialogContainerSelector, dialogTitle, typeOfDialog, + jquery, pgBrowser, alertify, dialogModel, backform) { + super(dialogContainerSelector, dialogTitle, jquery, + pgBrowser, alertify, dialogModel, backform); + + this.grid = null; + this.dataview = null; + this.gridContainer = null; + } + + showMessage(text, is_error, call_after_show=()=>{}) { + if(text == '' || text == null) { + this.statusBar.classList.add('d-none'); + } else { + if(is_error) { + this.statusBar.innerHTML = ` + <div class="error-in-footer"> + <div class="d-flex px-2 py-1"> + <div class="pr-2"> + <i class="fa fa-exclamation-triangle text-danger" aria-hidden="true" role="img"></i> + </div> + <div role="alert" class="alert-text">${text}</div> + <div class="ml-auto close-error-bar"> + <a class="close-error fa fa-times text-danger"></a> + </div> + </div> + </div> + `; + + this.statusBar.querySelector('.close-error').addEventListener('click', ()=>{ + this.showMessage(null); + }); + } else { + this.statusBar.innerHTML = ` + <div class="info-in-footer"> + <div class="d-flex px-2 py-1"> + <div class="pr-2"> + <i class="fa fa-info-circle text-primary" aria-hidden="true"></i> + </div> + <div class="alert-text" role="alert">${text}</div> + </div> + </div> + `; + } + this.statusBar.classList.remove('d-none'); + call_after_show(this.statusBar); + } + } + + createDialogDOM(dialogContainer) { + dialogContainer.innerHTML = ` + <div class="d-flex flex-column w-100 h-100"> + <div class="p-2"> + <div class="row"> + <div class="col-8 d-flex"> + <div class="input-group pgadmin-controls"> + <div class="input-group-prepend"> + <span class="input-group-text fa fa-search" id="labelSearch" aria-label="` + gettext('Search') + `"></span> + </div> + <input type="search" class="form-control" id="txtGridSearch" placeholder="` + gettext('Type at least 3 characters') + `" + tabindex="0" aria-describedby="labelSearch" aria-labelledby="labelSearch" autocomplete="off"> + </div> + <div class="ml-2"> + <button class="btn btn-primary btn-search" disabled>`+ gettext('Search') +`</button> + </div> + </div> + <div class="col-4"> + <select aria-label="` + gettext('Object types') + `" class="node-types"></select> + </div> + </div> + </div> + <div class="search-result-container flex-grow-1"> + <div class="pg-sp-container d-none"> + <div class="pg-sp-content"> + <div class="row"><div class="col-12 pg-sp-icon"></div></div> + <div class="row"><div class="col-12 pg-sp-text"></div></div> + </div> + </div> + <div class="search-result"></div> + </div> + <div class='search-result-count p-1'> + </div> + <div class="pg-prop-status-bar"> + </div> + </div> + `; + + return dialogContainer; + } + + updateDimOfSearchResult() { + let dim = this.searchResultContainer.getBoundingClientRect(); + this.searchResult.style.height = dim.height + 'px'; + this.searchResult.style.width = dim.width + 'px'; + } + + setLoading(text) { + if(text != null) { + this.loader.classList.remove('d-none'); + this.loader.querySelector('.pg-sp-text').innerHTML = text; + } else { + this.loader.classList.add('d-none'); + } + } + + searchBtnEnabled(enabled) { + if(typeof(enabled) != 'undefined') { + this.searchBtn.disabled = !enabled; + } else { + return !this.searchBtn.disabled; + } + } + + searchBoxVal(val) { + if(typeof(val) != 'undefined') { + this.searchBox.value = val; + } else { + return this.searchBox.value.trim(); + } + } + + typesVal(val) { + if(typeof(val) != 'undefined') { + this.typesSelect.value = val; + } else { + return this.typesSelect.value; + } + } + + setTypes(data, enabled=true) { + this.jquery(this.typesSelect).empty().select2({ + data: data, + }); + + this.typesSelect.disabled = !enabled; + } + + setResultCount(count) { + if(count != 0 && !count) { + count = gettext('Unknown'); + } + this.searchResultCount.innerHTML = count + ' ' + + (count===1 ? gettext('match found.'): gettext('matches found.')); + } + + showOtherInfo(rowno) { + let rowData = this.dataview.getItem(rowno); + rowData.name += ` (${rowData.other_info})`; + rowData.other_info = null; + this.dataview.updateItem(rowData.id, rowData); + } + + setGridData(data) { + this.dataview.setItems(data); + } + + prepareGrid() { + this.dataview = new Slick.Data.DataView(); + + this.dataview.getItemMetadata = (row)=>{ + let rowData = this.dataview.getItem(row); + if(!rowData.show_node){ + return { + cssClasses: 'object-muted', + }; + } + return null; + }; + + this.dataview.setFilter((item, args)=>{ + return !(args && args.type != 'all' && item.type != args.type); + }); + + /* jquery required for select2 */ + this.jquery(this.typesSelect).on('change', ()=>{ + this.dataview.setFilterArgs({ type: this.typesVal() }); + this.dataview.refresh(); + }); + + this.dataview.onRowCountChanged.subscribe((e, args) => { + this.grid.updateRowCount(); + this.grid.render(); + this.setResultCount(args.current); + }); + + this.dataview.onRowsChanged.subscribe((e, args) => { + this.grid.invalidateRows(args.rows); + this.grid.render(); + }); + + this.grid = new Slick.Grid( + this.searchResult, + this.dataview, + [ + { id: 'name', name: gettext('Object name'), field: 'name', sortable: true, + formatter: (row, cell, value, columnDef, dataContext) => { + let ret_el = `<i class='wcTabIcon ${dataContext.icon}'></i>${value}`; + + if(dataContext.other_info != null && dataContext.other_info != '') { + ret_el += ' <span class="object-other-info">(...)</span>'; + } + + return ret_el; + }, + width: 50, + }, + { id: 'type', name: gettext('Type'), field: 'type_label', sortable: true, width: 35 }, + { id: 'path', name: gettext('Browser path'), field: 'path', sortable: false }, + ], + { + enableCellNavigation: true, + enableColumnReorder: false, + multiColumnSort: true, + explicitInitialization: true, + } + ); + + this.grid.registerPlugin(new Slick.AutoColumnSize()); + + this.grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: true})); + + this.grid.onKeyDown.subscribe((event) => { + let activeRow = this.grid.getActiveCell(); + if(activeRow && !event.ctrlKey && !event.altKey && !event.metaKey && event.keyCode == 9) { + event.preventDefault(); + event.stopImmediatePropagation(); + + if(event.shiftKey) { + this.prevToGrid.focus(); + } else { + this.nextToGrid.focus(); + } + } + }); + + this.grid.onClick.subscribe((event, args) => { + if(event.target.classList.contains('object-other-info')) { + this.showOtherInfo(args.row); + } + }); + + this.grid.onDblClick.subscribe((event, args) => { + let rowData = this.dataview.getItem(args.row); + let treeMenu = this.pgBrowser.treeMenu; + + if(!rowData.show_node) { + this.showMessage( + gettext('%s objects are disabled in the browser.', rowData.type_label) + ' ' + + gettext('You can enable them in the') + ' <a class="pref-dialog-link">' + gettext('preferences dialog') + '</a>.', + true, + (statusBar)=>{ + statusBar.querySelector('.pref-dialog-link').addEventListener('click', ()=>{ + if(pgAdmin.Preferences) { + pgAdmin.Preferences.show(); + } + }); + } + ); + return false; + } + this.showMessage(gettext('Locating...')); + treeMenu.findNodeWithToggle(rowData.id_path) + .then((treeItem)=>{ + treeMenu.selectNode(treeItem.domNode, true); + this.showMessage(null); + }) + .catch((args)=>{ + this.showMessage(gettext('Unable to locate this object in the browser.'), true); + console.warn(args); + }); + }); + + this.grid.onSort.subscribe((event, args) => { + let cols = args.sortCols; + + this.dataview.sort(function (dataRow1, dataRow2) { + for (var i = 0, l = cols.length; i < l; i++) { + var field = cols[i].sortCol.field; + var sign = cols[i].sortAsc ? 1 : -1; + var value1 = dataRow1[field], value2 = dataRow2[field]; + var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign; + if (result != 0) { + return result; + } + } + return false; + }, true); + }); + } + + onDialogResize() { + this.updateDimOfSearchResult(); + + if(this.grid) { + this.grid.resizeCanvas(); + this.grid.autosizeColumns(); + } + } + + onDialogShow() { + this.focusOnDialog(this); + + setTimeout(()=>{ + if(!this.grid) { + this.prepareGrid(); + } + this.updateDimOfSearchResult(); + this.grid.init(); + this.setGridData([]); + this.onDialogResize(); + }, 500); + } + + getBaseUrl(endpoint) { + return url_for('search_objects.'+endpoint, { + sid: this.treeInfo.server._id, + did: this.treeInfo.database._id, + }); + } + + getCollNode(node_type) { + if('coll-'+node_type in this.pgBrowser.Nodes) { + return this.pgBrowser.Nodes['coll-'+node_type]; + } else if(node_type in this.pgBrowser.Nodes && + typeof(this.pgBrowser.Nodes[node_type].collection_type) === 'string') { + return this.pgBrowser.Nodes[this.pgBrowser.Nodes[node_type].collection_type]; + } + + return null; + } + + getSelectedNode() { + const tree = this.pgBrowser.treeMenu; + const selectedNode = tree.selected(); + if (selectedNode) { + return tree.findNodeByDomElement(selectedNode); + } else { + return undefined; + } + } + + finaliseData(datum) { + datum.icon = 'icon-' + datum.type; + /* finalise path */ + [datum.path, datum.id_path] = this.translateSearchObjectsPath(datum.path, datum.catalog_level); + /* id is required by slickgrid dataview */ + datum.id = datum.id_path; + return datum; + } + + /* This function will translate the path given by search objects API into two parts + * 1. The display path on the UI + * 2. The tree search path to locate the object on the tree. + * + * Sample path returned by search objects API + * :schema.11:/pg_catalog/:table.2604:/pg_attrdef + * + * Sample path required by tree locator + * Normal object - server_group/1.server/3.coll-database/3.database/13258.coll-schema/13258.schema/2200.coll-table/2200.table/41773 + * pg_catalog schema - server_group/1.server/3.coll-database/3.database/13258.coll-catalog/13258.catalog/11.coll-table/11.table/2600 + * Information Schema, dbo, sys - server_group/1.server/3.coll-database/3.database/13258.coll-catalog/13258.catalog/12967.coll-catalog_object/12967.catalog_object/13204 + * + * Column catalog_level has values as + * N - Not a catalog schema + * D - Catalog schema with DB support - pg_catalog + * O - Catalog schema with object support only - info schema, dbo, sys + */ + translateSearchObjectsPath(path, catalog_level) { + if (path === null) { + return path; + } + + catalog_level = catalog_level || 'N'; + + /* path required by tree locator */ + /* the path received from the backend is after the DB node, initial path setup */ + let id_path = [ + this.treeInfo.server_group.id, + this.treeInfo.server.id, + this.getCollNode('database').type + '/' + this.treeInfo.server._id, + this.treeInfo.database.id, + ]; + + let prev_node_id = this.treeInfo.database._id; + + /* add the slash to match regex, remove it from display path later */ + path = '/' + path; + /* the below regex will match all /:server_group.1:/ */ + let new_path = path.replace(/\/:[a-zA-Z_]+\.[0-9]+:\//g, (token)=>{ + let orig_token = token; + /* remove the slash and colon */ + token = token.slice(2, -2); + let [node_type, node_oid, others] = token.split('.'); + if(typeof(others) !== 'undefined') { + return token; + } + + /* schema type is "catalog" for catalog schemas */ + node_type = (['D', 'O'].indexOf(catalog_level) != -1 && node_type == 'schema') ? 'catalog' : node_type; + + /* catalog like info schema will only have views and tables AKA catalog_object except for pg_catalog */ + node_type = (catalog_level === 'O' && ['view', 'table'].indexOf(node_type) != -1) ? 'catalog_object' : node_type; + + /* If collection node present then add it */ + let coll_node = this.getCollNode(node_type); + if(coll_node) { + /* Add coll node to the path */ + if(prev_node_id != null) id_path.push(`${coll_node.type}/${prev_node_id}`); + + /* Add the node to the path */ + id_path.push(`${node_type}/${node_oid}`); + + /* This will be needed for coll node */ + prev_node_id = node_oid; + + /* This will be displayed in the grid */ + return `/${coll_node.label}/`; + } else if(node_type in this.pgBrowser.Nodes) { + /* Add the node to the path */ + id_path.push(`${node_type}/${node_oid}`); + + /* This will be need for coll node id path */ + prev_node_id = node_oid; + + /* Remove the token and replace with slash. This will be displayed in the grid */ + return '/'; + } + prev_node_id = null; + return orig_token; + }); + + /* Remove the slash we had added */ + new_path = new_path.substring(1); + return [new_path, id_path]; + } + + prepareDialog() { + this.showMessage(null); + this.setResultCount(0); + if(this.grid) { + this.grid.destroy(); + this.grid = null; + } + + /* Load types */ + this.setTypes([{ + id: -1, + text: gettext('Loading...'), + value: null, + }], false); + + axios.get( + this.getBaseUrl('types') + ).then((res)=>{ + let types = [{ + id: 'all', + text: 'All types', + }]; + + for (const key of Object.keys(res.data.data).sort()) { + types.push({ + id: key, + text: res.data.data[key], + }); + } + this.setTypes(types); + }).catch(()=>{ + this.setTypes([{ + id: -1, + text: gettext('Failed'), + value: null, + }], false); + }); + } + + main(title) { + this.set('title', title); + } + + setup() { + return { + buttons: [{ + text: '', + key: 112, + className: 'btn btn-secondary pull-left fa fa-question pg-alertify-icon-button', + attrs: { + name: 'dialog_help', + type: 'button', + label: gettext('Help'), + 'aria-label': gettext('Help'), + url: url_for('help.static', { + 'filename': 'search_objects.html', + }), + }, + }, { + text: gettext('Close'), + key: 27, + className: 'btn btn-secondary fa fa-lg fa-times pg-alertify-button', + 'data-btn-name': 'cancel', + }], + // Set options for dialog + options: { + title: this.dialogTitle, + //disable both padding and overflow control. + padding: !1, + overflow: !1, + model: 0, + resizable: true, + maximizable: true, + pinnable: false, + closableByDimmer: false, + modal: false, + }, + }; + } + + build() { + let tmpEle = document.createElement('div'); + tmpEle.innerHTML = this.dialogContainerSelector; + let dialogContainer = tmpEle.firstChild; + + // Append the container + this.elements.content.innerHTML = ''; + this.elements.content.appendChild(dialogContainer); + + this.createDialogDOM(dialogContainer); + this.alertify.pgDialogBuild.apply(this); + + this.loader = dialogContainer.getElementsByClassName('pg-sp-container')[0]; + + this.searchBox = dialogContainer.querySelector('#txtGridSearch'); + this.searchBtn = dialogContainer.querySelector('.btn-search'); + this.typesSelect = dialogContainer.querySelector('.node-types'); + this.searchResultContainer = dialogContainer.querySelector('.search-result-container'); + this.searchResult = dialogContainer.querySelector('.search-result'); + this.searchResultCount = dialogContainer.querySelector('.search-result-count'); + this.statusBar = dialogContainer.querySelector('.pg-prop-status-bar'); + + /* These two values are required to come out of grid when tab is + * pressed in the grid. Slickgrid does not allow any way to come out + */ + this.nextToGrid = this.elements.footer.querySelector('.ajs-button'); + this.prevToGrid = this.typesSelect; + + /* init select2 */ + this.setTypes([{ + id: -1, + text: gettext('Loading...'), + value: null, + }], false); + + /* on search box change */ + this.searchBox.addEventListener('input', ()=>{ + if(this.searchBoxVal().length >= 3) { + this.searchBtnEnabled(true); + } else { + this.searchBtnEnabled(false); + } + }); + + /* on enter key press */ + this.searchBox.addEventListener('keypress', (e)=>{ + if(e.keyCode == 13) { + e.stopPropagation(); + if(this.searchBtnEnabled()) { + this.searchBtn.dispatchEvent(new Event('click')); + } + } + }); + + /* on search button click */ + this.searchBtn.addEventListener('click', ()=>{ + this.searchBtnEnabled(false); + this.setGridData([]); + this.showMessage(null); + + this.setLoading(gettext('Searching....')); + axios.get(this.getBaseUrl('search'), { + params: { + text: this.searchBoxVal(), + type: this.typesVal(), + }, + }).then((res)=>{ + let grid_data = res.data.data.map((row)=>{ + return this.finaliseData(row); + }); + + this.setGridData(grid_data); + }).catch((error)=>{ + let errmsg = ''; + + if (error.response) { + errmsg = error.response.statusText; + } else if (error.request) { + errmsg = gettext('No response received'); + } else { + errmsg = error.message; + } + this.showMessage(gettext('An unexpected occurred: %s', errmsg), true); + console.warn(error); + }).finally(()=>{ + this.setLoading(null); + this.searchBtnEnabled(true); + }); + }); + + this.set({ + 'onresized': this.onDialogResize.bind(this), + 'onmaximized': this.onDialogResize.bind(this), + 'onrestored': this.onDialogResize.bind(this), + 'onshow': this.onDialogShow.bind(this), + }); + } + + prepare() { + let selectedTreeNode = this.getSelectedNode(); + if (!this.getSelectedNodeData(selectedTreeNode)) { + return; + } + + this.treeInfo = getTreeNodeHierarchyFromElement(this.pgBrowser, selectedTreeNode); + this.prepareDialog(); + this.focusOnDialog(this); + } + + callback(event) { + if (this.wasHelpButtonPressed(event)) { + event.cancel = true; + this.pgBrowser.showHelp( + event.button.element.name, + event.button.element.getAttribute('url'), + null, + null, + ); + return; + } + } +} diff --git a/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss b/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss new file mode 100644 index 000000000..86f3eb8a7 --- /dev/null +++ b/web/pgadmin/tools/search_objects/static/scss/_search_objects.scss @@ -0,0 +1,122 @@ +.search_objects_dialog { + height: 100%; + + .object-other-info { + &:hover { + font-weight: bold; + } + } + + .pref-dialog-link { + color: $color-fg !important; + text-decoration: underline !important; + cursor: pointer; + } + + .search-result-container { + width: 100%; + height: 100%; + min-height: 0; + } + + .node-types ~ .select2-container { + min-width: 100%; + } + + .search-result-count { + border-top: $panel-border; + } + + .ui-widget { + font-family: $font-family-primary; + font-size: $font-size-base; + + .slick-header.ui-state-default { + border: $table-border-width solid $table-border-color; + .slick-header-columns { + background: $table-bg; + color: $color-fg; + border-bottom: $panel-border; + + .slick-header-column-sorted { + font-style: unset; + } + + .ui-state-default { + background: $table-bg !important; + color: $color-fg !important; + padding: $table-header-cell-padding $table-cell-padding; + border-right: $table-border-width solid $table-border-color; + + .slick-column-name { + font-weight: bold; + } + + .slick-sort-indicator { + float: unset; + } + } + + .slick-header-sortable { + cursor: pointer !important; + + .slick-sort-indicator-asc { + background: none; + border-top: none; + border-right: 0.25rem solid transparent; + border-bottom: 0.25rem solid $color-fg; + border-left: 0.25rem solid transparent; + } + + .slick-sort-indicator-desc { + background: none; + border-top: 0.25rem solid $color-fg; + border-right: 0.25rem solid transparent; + border-bottom: none; + border-left: 0.25rem solid transparent; + } + } + } + } + .ui-widget-content { + color: $color-fg; + &.slick-row { + &.object-muted { + &.active, &.active:hover, &:hover, & { + .slick-cell { + color: $text-muted !important; + cursor: default !important; + } + } + } + + &.active, &.active:hover { + .slick-cell { + border-top: $table-border-width solid transparent !important; + background-color: $tree-bg-selected !important; + color: $tree-fg-selected !important; + } + } + + &:hover { + cursor: pointer; + .slick-cell { + border-top: $table-border-width solid transparent !important; + border-bottom: $table-border-width solid transparent !important; + background-color: $tree-bg-hover !important; + color: $tree-fg-hover !important; + cursor: pointer !important; + } + } + } + } + } + + + .pg-prop-status-bar { + position: absolute; + bottom: 0; + right: 0; + left: 0; + } +} diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql new file mode 100644 index 000000000..d00ca0d11 --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql @@ -0,0 +1,434 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + ELSE 'function' END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} ELSE {{ show_node_prefs['function'] }} END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p + left join pg_namespace n on p.pronamespace = n.oid + left join pg_type t on p.prorettype = t.oid + WHERE ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql new file mode 100644 index 000000000..5ec54956f --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql @@ -0,0 +1,451 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN p.prokind = 'p' THEN 'procedure' + ELSE 'function' + END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN ':trigger_function.' + WHEN p.prokind = 'p' THEN ':procedure.' + ELSE ':function.' + END || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} + WHEN p.prokind = 'p' THEN {{ show_node_prefs['procedure'] }} + ELSE {{ show_node_prefs['function'] }} + END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p join pg_namespace n + on p.pronamespace = n.oid join pg_type t + on p.prorettype = t.oid join pg_language lng + ON lng.oid=p.prolang + WHERE p.prokind IN ('f', 'w', 'p') + AND CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN lng.lanname NOT IN ('edbspl', 'sql', 'internal') + ELSE true + END + AND ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql new file mode 100644 index 000000000..b384b316d --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql @@ -0,0 +1,367 @@ +{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['table', 'sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'r' THEN 'table' + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'r' THEN ':table.' + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'r' THEN {{ show_node_prefs['table'] }} + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('r','S','v','m') + {% elif obj_type == 'table' %} + WHERE c.relkind = 'r' + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + AND {{ CATALOGS.DB_SUPPORT('n') }} + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + AND {{ CATALOGS.DB_SUPPORT('n') }} + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function'] %} + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + ELSE 'function' END::text AS obj_type, p.proname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || case when t.typname = 'trigger' then ':trigger_function.' else ':function.' end || p.oid ||':/' || p.proname AS obj_path, n.nspname AS schema_name, + CASE WHEN t.typname IN ('trigger', 'event_trigger') THEN {{ show_node_prefs['trigger_function'] }} ELSE {{ show_node_prefs['function'] }} END AS show_node, + pg_catalog.pg_get_function_identity_arguments(p.oid) AS other_info + from pg_proc p + left join pg_namespace n on p.pronamespace = n.oid + left join pg_type t on p.prorettype = t.oid + WHERE ({{ CATALOGS.DB_SUPPORT('n') }}) +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/:table.'|| t.oid || ':/'||t.relname|| + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server'::text AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping'::text AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table'::text AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension'::text AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation'::text AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql new file mode 100644 index 000000000..76d3f01ba --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql @@ -0,0 +1,494 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary' AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser' AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template' AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain' AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints' AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper' AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym' AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package' AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar' AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql new file mode 100644 index 000000000..82eb9cf6f --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql @@ -0,0 +1,515 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('S','v','m') + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['table', 'partition'] %} + SELECT CASE WHEN c.relispartition THEN 'partition' ELSE 'table' END::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || ( + WITH RECURSIVE table_path_data as ( + select c.oid as oid, 0 as height, + CASE c.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || c.oid || ':/' || c.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) obj_path, n.nspname AS schema_name, + CASE WHEN c.relispartition THEN {{ show_node_prefs['partition'] }} + ELSE {{ show_node_prefs['table'] }} END AS show_node, + NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE c.relkind in ('p','r') + {% if obj_type == 'table' %} + AND NOT c.relispartition + {% elif obj_type == 'partition' %} + AND c.relispartition + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/'|| + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) || + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end + ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger', 'compound_trigger'] %} + select + CASE WHEN tr.tgpackageoid != 0 THEN 'compound_trigger' ELSE 'trigger' END::text AS obj_type, tr.tgname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + when t.relkind = 'v' then ':view.' + when t.relkind = 'm' then ':mview.' + WHEN t.relkind in ('r', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select path from table_path_data order by height desc limit 1 + ) + end || CASE WHEN tr.tgpackageoid != 0 THEN '/:compound_trigger.' ELSE '/:trigger.' END || tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + CASE WHEN tr.tgpackageoid != 0 THEN {{ show_node_prefs['compound_trigger'] }} ELSE {{ show_node_prefs['trigger'] }} END AS show_node, + NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} + {% if obj_type == 'compound_trigger' %} + AND tr.tgpackageoid != 0 + {% elif obj_type == 'trigger' %} + AND tr.tgpackageoid = 0 + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server' AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping' AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table' AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension' AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation' AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym' AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package' AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar' AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE p.nspcompoundtrigger = false + AND {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql new file mode 100644 index 000000000..7bb126e32 --- /dev/null +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql @@ -0,0 +1,437 @@ +{% import 'catalog/ppas/macros/catalogs.sql' as CATALOGS %} +{% set all_obj = false %} +{% if obj_type == 'all' or obj_type is none %} +{% set all_obj = true %} +{% endif %} +SELECT obj_type, obj_name, + REPLACE(obj_path, '/'||sn.schema_name||'/', '/'||{{ CATALOGS.LABELS_SCHEMACOL('sn.schema_name', _) }}||'/') AS obj_path, + schema_name, show_node, other_info, + CASE + WHEN {{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }} THEN + CASE WHEN {{ CATALOGS.DB_SUPPORT_SCHEMACOL('sn.schema_name') }} THEN 'D' ELSE 'O' END + ELSE 'N' + END AS catalog_level +FROM ( +{% if all_obj or obj_type in ['table', 'sequence', 'view', 'mview'] %} + SELECT + CASE + WHEN c.relkind = 'r' THEN 'table' + WHEN c.relkind = 'S' THEN 'sequence' + WHEN c.relkind = 'v' THEN 'view' + WHEN c.relkind = 'm' THEN 'mview' + ELSE 'should not happen' + END::text::text AS obj_type, c.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/' || + CASE + WHEN c.relkind = 'r' THEN ':table.' + WHEN c.relkind = 'S' THEN ':sequence.' + WHEN c.relkind = 'v' THEN ':view.' + WHEN c.relkind = 'm' THEN ':mview.' + ELSE 'should not happen' + END || c.oid ||':/' || c.relname AS obj_path, n.nspname AS schema_name, + CASE + WHEN c.relkind = 'r' THEN {{ show_node_prefs['table'] }} + WHEN c.relkind = 'S' THEN {{ show_node_prefs['sequence'] }} + WHEN c.relkind = 'v' THEN {{ show_node_prefs['view'] }} + WHEN c.relkind = 'm' THEN {{ show_node_prefs['mview'] }} + ELSE False + END AS show_node, NULL AS other_info + FROM pg_class c + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace + {% if all_obj %} + WHERE c.relkind in ('r','S','v','m') + {% elif obj_type == 'table' %} + WHERE c.relkind = 'r' + {% elif obj_type == 'sequence' %} + WHERE c.relkind = 'S' + {% elif obj_type == 'view' %} + WHERE c.relkind = 'v' + {% elif obj_type == 'mview' %} + WHERE c.relkind = 'm' + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['index'] %} + SELECT 'index'::text::text AS obj_type, cls.relname AS obj_name, + ':schema.'|| n.oid || ':/' || n.nspname || '/:table.'|| tab.oid ||':/' || tab.relname || '/:index.'|| cls.oid ||':/' || cls.relname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info + FROM pg_index idx + JOIN pg_class cls ON cls.oid=indexrelid + JOIN pg_class tab ON tab.oid=indrelid + JOIN pg_namespace n ON n.oid=tab.relnamespace + LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_class WHERE relname='pg_constraint') AND dep.deptype='i') + LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) + LEFT OUTER JOIN pg_description des ON des.objoid=cls.oid + LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) + WHERE contype IS NULL +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger_function', 'function', 'procedure', 'edbfunc', 'edbproc'] %} + SELECT fd.obj_type, fd.obj_name, + CASE + WHEN fd.obj_type = 'function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'procedure' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:procedure.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'trigger_function' THEN + ':schema.'|| fd.schema_oid || ':/' || fd.schema_name || '/:trigger_function.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbfunc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbfunc.' || fd.obj_oid ||':/' || fd.obj_name + WHEN fd.obj_type = 'edbproc' THEN + ':schema.'|| fd.next_schema_oid || ':/' || fd.next_schema_name || '/:package.'|| fd.schema_oid || ':/' || fd.schema_name || '/:edbproc.' || fd.obj_oid ||':/' || fd.obj_name + ELSE NULL + END AS obj_path, + CASE + WHEN fd.obj_type IN ('function', 'procedure', 'trigger_function') THEN fd.schema_name + WHEN fd.obj_type IN ('edbfunc', 'edbproc') THEN fd.next_schema_name + ELSE NULL + END AS schema_name, + CASE + WHEN fd.obj_type = 'function' THEN {{ show_node_prefs['function'] }} + WHEN fd.obj_type = 'procedure' THEN {{ show_node_prefs['procedure'] }} + WHEN fd.obj_type = 'trigger_function' THEN {{ show_node_prefs['trigger_function'] }} + WHEN fd.obj_type = 'edbfunc' THEN {{ show_node_prefs['edbfunc'] }} + WHEN fd.obj_type = 'edbproc' THEN {{ show_node_prefs['edbproc'] }} + ELSE NULL + END AS show_node, other_info + FROM ( + SELECT + CASE + WHEN t.typname IN ('trigger', 'event_trigger') THEN 'trigger_function' + WHEN pr.protype = '0'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbfunc' ELSE 'function' END + WHEN pr.protype = '1'::char THEN + CASE WHEN np.oid IS NOT NULL THEN 'edbproc' ELSE 'procedure' END + ELSE null + END::text::text AS obj_type, pr.proname AS obj_name, pr.oid AS obj_oid, n.oid AS schema_oid, n.nspname AS schema_name, np.oid next_schema_oid, np.nspname next_schema_name, + pg_catalog.pg_get_function_identity_arguments(pr.oid) AS other_info + FROM pg_proc pr left join pg_namespace n + ON pr.pronamespace = n.oid left JOIN pg_namespace np + ON np.oid=n.nspparent left JOIN pg_type t + ON t.oid = pr.prorettype left JOIN pg_language l + ON l.oid = pr.prolang + WHERE NOT (t.typname = 'trigger' AND l.lanname = 'edbspl') + AND ({{ CATALOGS.DB_SUPPORT('n') }} AND {{ CATALOGS.DB_SUPPORT('np') }}) + ) fd + {% if not all_obj %} + WHERE fd.obj_type = '{{ obj_type }}' + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['event_trigger'] %} + select 'event_trigger'::text::text AS obj_type, evtname AS obj_name, ':event_trigger.'||oid||':/' || evtname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['index'] }} AS show_node, NULL AS other_info from pg_event_trigger +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['schema'] %} + select 'schema'::text::text AS obj_type, n.nspname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname as obj_path, n.nspname AS schema_name, + {{ show_node_prefs['schema'] }} AS show_node, NULL AS other_info from pg_namespace n + where n.nspparent = 0 + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['column'] %} + select 'column'::text::text AS obj_type, a.attname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/' || + case + WHEN t.relkind = 'r' THEN ':table.' + WHEN t.relkind = 'v' THEN ':view.' + WHEN t.relkind = 'm' THEN ':mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:column.'|| a.attnum ||':/' || a.attname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['column'] }} AS show_node, NULL AS other_info + from pg_attribute a + inner join pg_class t on a.attrelid = t.oid and t.relkind in ('r','v','m') + left join pg_namespace n on t.relnamespace = n.oid where a.attnum > 0 +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['constraints', 'check_constraint', 'foreign_key', 'primary_key', 'unique_constraint', 'exclusion_constraint'] %} + SELECT + CASE + WHEN c.contype = 'c' THEN 'check_constraint' + WHEN c.contype = 'f' THEN 'foreign_key' + WHEN c.contype = 'p' THEN 'primary_key' + WHEN c.contype = 'u' THEN 'unique_constraint' + WHEN c.contype = 'x' THEN 'exclusion_constraint' + END::text::text AS obj_type, + case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_name, + ':schema.'||n.oid||':/' || n.nspname||'/:table.'|| t.oid || ':/'||t.relname|| + CASE + WHEN c.contype = 'c' THEN '/:check_constraint.' ||c.oid + WHEN c.contype = 'f' THEN '/:foreign_key.' ||c.conindid + WHEN c.contype = 'p' THEN '/:primary_key.' ||c.conindid + WHEN c.contype = 'u' THEN '/:unique_constraint.' ||c.conindid + WHEN c.contype = 'x' THEN '/:exclusion_constraint.' ||c.conindid + END ||':/'|| case when tf.relname is null then c.conname else c.conname || ' -> ' || tf.relname end AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['constraints'] }} AS show_node, NULL AS other_info + from pg_constraint c + left join pg_class t on c.conrelid = t.oid + left join pg_class tf on c.confrelid = tf.oid + left join pg_namespace n on t.relnamespace = n.oid + where c.contypid = 0 + {% if obj_type == 'check_constraint' %} + AND c.contype = 'c' + {% elif obj_type == 'foreign_key' %} + AND c.contype = 'f' + {% elif obj_type == 'primary_key' %} + AND c.contype = 'p' + {% elif obj_type == 'unique_constraint' %} + AND c.contype = 'u' + {% elif obj_type == 'exclusion_constraint' %} + AND c.contype = 'x' + {% else %} + AND c.contype IN ('c', 'f', 'p', 'u', 'x') + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['rule'] %} + select 'rule'::text::text AS obj_type, r.rulename AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname ||'/:rule.'||r.oid||':/'|| r.rulename AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['rule'] }} AS show_node, NULL AS other_info + from pg_rewrite r + left join pg_class t on r.ev_class = t.oid + left join pg_namespace n on t.relnamespace = n.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['trigger'] %} + select 'trigger'::text::text AS obj_type, tr.tgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| + case + WHEN t.relkind = 'r' THEN '/:table.' + when t.relkind = 'v' then '/:view.' + when t.relkind = 'm' then '/:mview.' + else 'should not happen' + end || t.oid || ':/' || t.relname || '/:trigger.'|| tr.oid || ':/' || tr.tgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['trigger'] }} AS show_node, NULL AS other_info + from pg_trigger tr + left join pg_class t on tr.tgrelid = t.oid + left join pg_namespace n on t.relnamespace = n.oid + where tr.tgisinternal = false + and {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['type'] %} + SELECT 'type'::text::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || + '/:type.'|| t.oid ||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['type'] }} AS show_node, NULL AS other_info + FROM pg_type t + LEFT OUTER JOIN pg_type e ON e.oid=t.typelem + LEFT OUTER JOIN pg_class ct ON ct.oid=t.typrelid AND ct.relkind <> 'c' + LEFT OUTER JOIN pg_namespace n on t.typnamespace = n.oid + WHERE t.typtype != 'd' AND t.typname NOT LIKE E'\\_%' + {% if not show_system_objects %} + AND ct.oid is NULL + {% endif %} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['cast'] %} + SELECT 'cast'::text::text AS obj_type, format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_name, + ':cast.'||ca.oid||':/' || format_type(st.oid,NULL) ||'->'|| format_type(tt.oid,tt.typtypmod) AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['cast'] }} AS show_node, NULL AS other_info + FROM pg_cast ca + JOIN pg_type st ON st.oid=castsource + JOIN pg_type tt ON tt.oid=casttarget + {% if not show_system_objects %} + WHERE ca.oid > {{last_system_oid}}::OID + {% endif %} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['language'] %} + SELECT 'language'::text::text AS obj_type, lanname AS obj_name, ':language.'||lan.oid||':/' || lanname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['language'] }} AS show_node, NULL AS other_info + FROM pg_language lan + WHERE lanispl IS TRUE +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_configuration'] %} + SELECT 'fts_configuration'::text::text AS obj_type, cfg.cfgname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:fts_configuration.'||cfg.oid||':/' || cfg.cfgname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['fts_configuration'] }} AS show_node, NULL AS other_info + FROM pg_ts_config cfg + left join pg_namespace n on cfg.cfgnamespace = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_dictionary'] %} + SELECT 'fts_dictionary'::text::text AS obj_type, dict.dictname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_dictionary.'||dict.oid||':/' || dict.dictname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_dictionary'] }} AS show_node, NULL AS other_info + FROM pg_ts_dict dict + left join pg_namespace ns on dict.dictnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_parser'] %} + SELECT 'fts_parser'::text::text AS obj_type, prs.prsname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_parser.'||prs.oid||':/' || prs.prsname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_parser'] }} AS show_node, NULL AS other_info + FROM pg_ts_parser prs + left join pg_namespace ns on prs.prsnamespace = ns.oid + WHERE {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['fts_template'] %} + SELECT 'fts_template'::text::text AS obj_type, tmpl.tmplname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:fts_template.'||tmpl.oid||':/' || tmpl.tmplname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['fts_template'] }} AS show_node, NULL AS other_info + FROM pg_ts_template tmpl + left join pg_namespace ns on tmpl.tmplnamespace = ns.oid + AND {{ CATALOGS.DB_SUPPORT('ns') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain'] %} + select 'domain'::text::text AS obj_type, t.typname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['domain'] }} AS show_node, NULL AS other_info + from pg_type t + inner join pg_namespace n on t.typnamespace = n.oid + where t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['domain_constraints'] %} + SELECT 'domain_constraints'::text::text AS obj_type, + c.conname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:domain.'||t.oid||':/' || t.typname || '/:domain_constraints.'||c.oid||':/' || c.conname AS obj_path, + n.nspname AS schema_name, + {{ show_node_prefs['domain_constraints'] }} AS show_node, NULL AS other_info + FROM pg_constraint c JOIN pg_type t + ON t.oid=contypid JOIN pg_namespace n + ON n.oid=t.typnamespace + WHERE t.typtype = 'd' + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_data_wrapper'] %} + select 'foreign_data_wrapper'::text AS obj_type, fdwname AS obj_name, ':foreign_data_wrapper.'||oid||':/' || fdwname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_data_wrapper'] }} AS show_node, NULL AS other_info + from pg_foreign_data_wrapper +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_server'] %} + select 'foreign_server'::text AS obj_type, sr.srvname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['foreign_server'] }} AS show_node, NULL AS other_info + from pg_foreign_server sr + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['user_mapping'] %} + select 'user_mapping'::text AS obj_type, ro.rolname AS obj_name, ':foreign_data_wrapper.'||fdw.oid||':/' || fdw.fdwname || '/:foreign_server.'||sr.oid||':/' || sr.srvname || '/:user_mapping.'||ro.oid||':/' || ro.rolname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['user_mapping'] }} AS show_node, NULL AS other_info + from pg_user_mapping um + inner join pg_roles ro on um.umuser = ro.oid + inner join pg_foreign_server sr on um.umserver = sr.oid + inner join pg_foreign_data_wrapper fdw on sr.srvfdw = fdw.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['foreign_table'] %} + select 'foreign_table'::text AS obj_type, c.relname AS obj_name, ':schema.'||ns.oid||':/' || ns.nspname || '/:foreign_table.'||c.oid||':/' || c.relname AS obj_path, ns.nspname AS schema_name, + {{ show_node_prefs['foreign_table'] }} AS show_node, NULL AS other_info + from pg_foreign_table ft + inner join pg_class c on ft.ftrelid = c.oid + inner join pg_namespace ns on c.relnamespace = ns.oid +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['extension'] %} + select 'extension'::text AS obj_type, x.extname AS obj_name, ':extension.'||x.oid||':/' || x.extname AS obj_path, ''::text AS schema_name, + {{ show_node_prefs['extension'] }} AS show_node, NULL AS other_info + FROM pg_extension x + JOIN pg_namespace n on x.extnamespace=n.oid + join pg_available_extensions() e(name, default_version, comment) ON x.extname=e.name +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['collation'] %} + SELECT 'collation'::text AS obj_type, c.collname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:collation.'||c.oid||':/' || c.collname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['collation'] }} AS show_node, NULL AS other_info + FROM pg_collation c + JOIN pg_namespace n ON n.oid=c.collnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['synonym'] %} + SELECT 'synonym'::text AS obj_type, s.synname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:synonym.'||s.oid||':/' || s.synname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['synonym'] }} AS show_node, NULL AS other_info + FROM pg_synonym s + JOIN pg_namespace n ON n.oid=s.synnamespace + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['package'] %} + SELECT 'package'::text AS obj_type, p.nspname AS obj_name, ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['package'] }} AS show_node, NULL AS other_info + FROM pg_namespace p + JOIN pg_namespace n ON n.oid=p.nspparent + WHERE {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['edbvar'] %} + SELECT 'edbvar'::text AS obj_type, v.varname AS obj_name, + ':schema.'||n.oid||':/' || n.nspname || '/:package.'||p.oid||':/' || p.nspname || '/:edbvar.'||v.oid||':/' || v.varname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['edbvar'] }} AS show_node, NULL AS other_info + FROM edb_variable v JOIN pg_namespace p + ON v.varpackage = p.oid JOIN pg_namespace n + ON p.nspparent = n.oid + WHERE {{ CATALOGS.DB_SUPPORT('p') }} + AND {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} +) sn +where lower(sn.obj_name) like '%{{ search_text }}%' +{% if not show_system_objects %} +AND NOT ({{ CATALOGS.IS_CATALOG_SCHEMA('sn.schema_name') }}) +AND (sn.schema_name IS NOT NULL AND sn.schema_name NOT LIKE 'pg\_%') +{% endif %} +ORDER BY 1, 2, 3 diff --git a/web/pgadmin/tools/search_objects/tests/__init__.py b/web/pgadmin/tools/search_objects/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/web/pgadmin/tools/search_objects/tests/test_api_search.py b/web/pgadmin/tools/search_objects/tests/test_api_search.py new file mode 100644 index 000000000..3952006d2 --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_api_search.py @@ -0,0 +1,75 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from __future__ import print_function +import sys +import json + +from pgadmin.utils.route import BaseTestGenerator +from regression import parent_node_dict +from pgadmin.browser.server_groups.servers.databases.tests import utils as \ + database_utils +from regression.python_test_utils import test_utils as utils + +try: + from urllib import urlencode +except Exception as e: + from urllib.parse import urlencode + + +class SearchObjectsApiSearch(BaseTestGenerator): + """ This class will test search API of search objects. """ + scenarios = [ + ('Search with all types', dict(text='emp', type='all', singles=False)), + ('Search with None types', dict(text='emp', type=None, singles=False)), + ('Search for all single types', + dict(text='emp', type=None, singles=True)), + ] + + def runFor(self, text=None, type=None): + url_params = dict( + text=text + ) + if type is not None: + url_params['type'] = type + + url_params = urlencode(url_params) + response = self.tester.get(self.base_url + '?' + url_params) + + self.assertEquals(response.status_code, 200) + + def runTest(self): + database_info = parent_node_dict["database"][-1] + server_id = database_info["server_id"] + db_id = database_info["db_id"] + + db_con = database_utils.connect_database(self, + utils.SERVER_GROUP, + server_id, + db_id) + if not db_con["info"] == "Database connected.": + raise Exception("Could not connect to database to add the schema.") + + self.base_url = '/search_objects/search/' \ + + str(server_id) + '/' + str(db_id) + + if not self.singles: + self.runFor(text=self.text, type=self.type) + else: + # test for all the node types individually + types_url = '/search_objects/types/' +\ + str(server_id) + '/' + str(db_id) + response = self.tester.get(types_url) + self.assertEquals(response.status_code, 200) + types_data = json.loads(response.data.decode('utf-8'))['data'] + + for a_type in types_data: + print('Running search for type {0}'.format(a_type), + file=sys.stderr) + self.runFor(text=self.text, type=a_type) diff --git a/web/pgadmin/tools/search_objects/tests/test_api_types.py b/web/pgadmin/tools/search_objects/tests/test_api_types.py new file mode 100644 index 000000000..aed5571ad --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_api_types.py @@ -0,0 +1,47 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +import json +from pgadmin.utils.route import BaseTestGenerator +from regression import parent_node_dict +from pgadmin.browser.server_groups.servers.databases.tests import utils as \ + database_utils +from regression.python_test_utils import test_utils as utils + + +class SearchObjectsApiTypes(BaseTestGenerator): + """ This class will test types API of search objects. """ + scenarios = [ + # Fetching default URL for schema node. + ('Types API URL', dict(url='/search_objects/types')) + ] + + def runTest(self): + database_info = parent_node_dict["database"][-1] + server_id = database_info["server_id"] + + db_id = database_info["db_id"] + db_con = database_utils.connect_database(self, + utils.SERVER_GROUP, + server_id, + db_id) + if not db_con["info"] == "Database connected.": + raise Exception("Could not connect to database to add the schema.") + + url = self.url + '/' + str(server_id) + '/' + str(db_id) + response = self.tester.get(url) + self.assertEquals(response.status_code, 200) + + # repsonse data should be dict + response_data = json.loads(response.data.decode('utf-8'))['data'] + self.assertEquals(type(response_data), dict) + + # response data key values should not be None + for key, value in response_data.items(): + self.assertIsNotNone(value, 'Key {0} has value None'.format(key)) diff --git a/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py b/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py new file mode 100644 index 000000000..ec9c369b9 --- /dev/null +++ b/web/pgadmin/tools/search_objects/tests/test_search_objects_helper.py @@ -0,0 +1,117 @@ +import sys + +from pgadmin.tools.search_objects.utils import SearchObjectsHelper, current_app +from pgadmin.utils.route import BaseTestGenerator + +if sys.version_info < (3, 3): + from mock import patch, MagicMock +else: + from unittest.mock import patch, MagicMock + + +class SearchObjectsHelperTest(BaseTestGenerator): + scenarios = [ + ('scenario', dict( + node_blueprints=[ + dict(node_type='table', coll_label='Tables', + backend_supported=True), + dict(node_type='view', coll_label='Views', + backend_supported=False), + dict(node_type='index', coll_label='Indexes', + backend_supported=True), + dict(node_type='role', coll_label='Roles', + backend_supported=True) + ], + all_node_types=['table', 'view', 'index'], + expected_show_node_prefs=dict(table=True, view=False, index=True), + expected_supported_types=dict(table='Tables', index='Indexes'), + expected_supported_types_skip=dict(table='Tables', view='Views', + index='Indexes'), + execute_dict_return_value=( + True, dict(rows=[ + dict(obj_name='name1', obj_type='table', + obj_path='some/path', show_node=True, + other_info=None, catalog_level='N'), + dict(obj_name='name2', obj_type='view', + obj_path='some1/path', show_node=True, + other_info=None, catalog_level='D'), + dict(obj_name='name3', obj_type='index', + obj_path='some2/path1', show_node=True, + other_info='oid', catalog_level='O'), + ])), + expected_search_op=( + True, [ + dict(name='name1', type='table', type_label='Tables', + path='some/path', + show_node=True, other_info=None, catalog_level='N'), + dict(name='name2', type='view', type_label='Views', + path='some1/path', + show_node=True, other_info=None, catalog_level='D'), + dict(name='name3', type='index', type_label='Indexes', + path='some2/path1', + show_node=True, other_info='oid', catalog_level='O'), + ] + ) + )) + ] + + def __create_manager(self): + connection = MagicMock( + execute_dict=MagicMock(), + db='somedb' + ) + connection.execute_dict.return_value = self.execute_dict_return_value + + def connection_function(did): + return connection + + return MagicMock( + connection=connection_function + ) + + @patch('pgadmin.tools.search_objects.utils.get_node_blueprint') + @patch('pgadmin.tools.search_objects.utils.get_driver') + def runTest(self, get_driver_mock, get_node_blueprint_mock): + manager = self.__create_manager() + + get_driver_mock.return_value = MagicMock( + connection_manager=lambda session_id: manager) + + def __get_node_blueprint_mock(node_type): + blueprints = self.node_blueprints + blueprint = None + for data in blueprints: + if node_type == data['node_type']: + blueprint = MagicMock( + BackendSupported=MagicMock( + return_value=data['backend_supported']), + collection_label=data['coll_label'], + show_node=data['backend_supported'], + ) + return blueprint + + get_node_blueprint_mock.side_effect = __get_node_blueprint_mock + + with self.app.app_context(): + + so_obj = SearchObjectsHelper(2, 18456, + node_types=self.all_node_types) + so_obj.get_sql = MagicMock(return_value='dummy query') + + # test template path + manager.server_type = 'pg' + manager.version = 906000 + self.assertEquals(so_obj.get_template_path(), + 'search_objects/sql/pg/#906000#') + + self.assertEquals(so_obj.get_show_node_prefs(), + self.expected_show_node_prefs) + + self.assertEquals(so_obj.get_supported_types(), + self.expected_supported_types) + + self.assertEquals(so_obj.get_supported_types(skip_check=True), + self.expected_supported_types_skip) + + self.assertEquals(so_obj.search('searchtext', 'all'), + self.expected_search_op) diff --git a/web/pgadmin/tools/search_objects/utils.py b/web/pgadmin/tools/search_objects/utils.py new file mode 100644 index 000000000..cf858d6e2 --- /dev/null +++ b/web/pgadmin/tools/search_objects/utils.py @@ -0,0 +1,131 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2020, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +from flask import current_app, render_template +from flask_babelex import gettext + +from pgadmin.utils.driver import get_driver +from config import PG_DEFAULT_DRIVER + + +def get_node_blueprint(node_type): + blueprint = None + node_type = 'NODE-' + node_type + if node_type in current_app.blueprints: + blueprint = current_app.blueprints[node_type] + + return blueprint + + +class SearchObjectsHelper: + def __init__(self, sid, did, show_system_objects=False, node_types=None): + self.sid = sid + self.did = did + self.show_system_objects = show_system_objects + self.manager = get_driver( + PG_DEFAULT_DRIVER + ).connection_manager(sid) + + self._all_node_types = [ + 'cast', 'fts_dictionary', 'check_constraint', + 'exclusion_constraint', 'foreign_key', + 'primary_key', 'unique_constraint', 'constraints', 'trigger', + 'table', 'compound_trigger', 'rule', 'column', 'partition', + 'index', 'type', 'domain', 'domain_constraints', 'schema', + 'synonym', 'sequence', 'edbvar', 'edbfunc', 'edbproc', 'package', + 'foreign_table', 'fts_parser', 'function', 'procedure', + 'trigger_function', 'fts_template', 'collation', 'view', 'mview', + 'fts_configuration', 'extension', 'language', + 'event_trigger', 'foreign_server', 'user_mapping', + 'foreign_data_wrapper' + ] if node_types is None else node_types + + @property + def all_node_types(self): + return self._all_node_types + + def get_template_path(self): + return 'search_objects/sql/{0}/#{1}#'.format( + self.manager.server_type, self.manager.version) + + def get_show_node_prefs(self): + return_types = {} + for node_type in self.all_node_types: + blueprint = get_node_blueprint(node_type) + if blueprint is None: + continue + + return_types[node_type] = blueprint.show_node + return return_types + + def get_supported_types(self, skip_check=False): + return_types = {} + for node_type in self.all_node_types: + blueprint = get_node_blueprint(node_type) + if blueprint is None: + continue + + if blueprint.BackendSupported(self.manager, is_catalog=False, + did=self.did) or skip_check: + if node_type in ['edbfunc', 'edbproc']: + return_types[node_type] =\ + gettext('Package {0}').format( + blueprint.collection_label) + else: + return_types[node_type] = blueprint.collection_label + + return return_types + + def get_sql(self, sql_file, **kwargs): + return render_template( + "/".join([self.get_template_path(), sql_file]), + **kwargs + ) + + def finalize_id_path(self, path, base_path): + if base_path is not None: + path = '{0}/{1}'.format(base_path, path) + + return path + + def search(self, text, obj_type=None): + conn = self.manager.connection(did=self.did) + last_system_oid = (self.manager.db_info[self.did])['datlastsysoid'] \ + if self.manager.db_info is not None and self.did in \ + self.manager.db_info else 0 + + show_node_prefs = self.get_show_node_prefs() + node_labels = self.get_supported_types(skip_check=True) + # Column catalog_level has values as + # N - Not a catalog schema + # D - Catalog schema with DB support - pg_catalog + # O - Catalog schema with object support only - info schema, dbo, sys + status, res = conn.execute_dict( + self.get_sql('search.sql', search_text=text, obj_type=obj_type, + show_system_objects=self.show_system_objects, + show_node_prefs=show_node_prefs, _=gettext, + last_system_oid=last_system_oid) + ) + + if not status: + return status, res + + ret_val = [ + { + 'name': row['obj_name'], + 'type': row['obj_type'], + 'type_label': node_labels[row['obj_type']], + 'path': row['obj_path'], + 'show_node': row['show_node'], + 'other_info': row['other_info'], + 'catalog_level': row['catalog_level'], + } + for row in res['rows'] + ] + return True, ret_val diff --git a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css index 52b821d8b..f9d15b8da 100644 --- a/web/pgadmin/tools/sqleditor/static/css/sqleditor.css +++ b/web/pgadmin/tools/sqleditor/static/css/sqleditor.css @@ -112,7 +112,7 @@ li { font-size: 9pt; } -.slick-header-column.ui-state-default { +#datagrid .slick-header-column.ui-state-default { height: 32px !important; } diff --git a/web/regression/javascript/fake_endpoints.js b/web/regression/javascript/fake_endpoints.js index fa01b3f89..157a34863 100644 --- a/web/regression/javascript/fake_endpoints.js +++ b/web/regression/javascript/fake_endpoints.js @@ -19,5 +19,7 @@ define(function () { 'datagrid.initialize_query_tool_with_did': '/initialize/query_tool/<int:sgid>/<int:sid>/<int:did>', 'restore.create_job': '/restore/job/<int:sid>', 'datagrid.panel': '/panel/<int:trans_id>', + 'search_objects.types': '/search_objects/types/<int:sid>/<int:did>', + 'search_objects.search': '/search_objects/search/<int:sid>/<int:did>', }; }); diff --git a/web/regression/javascript/search_objects/search_objects_dialog_spec.js b/web/regression/javascript/search_objects/search_objects_dialog_spec.js new file mode 100644 index 000000000..039db1970 --- /dev/null +++ b/web/regression/javascript/search_objects/search_objects_dialog_spec.js @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// +import SearchObjectsDialog from 'tools/search_objects/static/js/search_objects_dialog'; +import {TreeFake} from '../tree/tree_fake'; +import MockAdapter from 'axios-mock-adapter'; +import axios from 'axios/index'; + +const context = describe; + +describe('SearchObjectsDialog', () => { + let soDialog; + let pgBrowser; + let jquerySpy; + let alertifySpy; + + beforeEach(() => { + pgBrowser = { + treeMenu: new TreeFake(), + Nodes: { + server: { + hasId: true, + label: 'server', + getTreeNodeHierarchy: jasmine.createSpy('server.getTreeNodeHierarchy'), + }, + database: { + hasId: true, + label: 'database', + getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'), + }, + schema: { + hasId: true, + label: 'schema', + getTreeNodeHierarchy: jasmine.createSpy('db.getTreeNodeHierarchy'), + }, + }, + stdW: { + sm: 500, + md: 700, + lg: 900, + default: 500, + }, + stdH: { + sm: 200, + md: 400, + lg: 550, + default: 550, + }, + }; + pgBrowser.Nodes.server.hasId = true; + pgBrowser.Nodes.database.hasId = true; + jquerySpy = jasmine.createSpy('jquerySpy'); + + const hierarchy = { + children: [ + { + id: 'root', + children: [ + { + id: 'serverTreeNode', + data: { + _id: 10, + _type: 'server', + user: {name: 'username'}, + label: 'theserver', + }, + children: [ + { + id: 'some_database', + data: { + _type: 'database', + _id: 11, + label: 'thedatabase', + }, + }, + ], + }, + { + id: 'ppasServer', + data: { + _type: 'server', + server_type: 'ppas', + children: [ + {id: 'someNodeUnderneathPPASServer'}, + ], + }, + }, + ], + }, + ], + }; + + pgBrowser.treeMenu = TreeFake.build(hierarchy); + }); + + describe('#draw', () => { + let networkMock; + beforeEach(() => { + networkMock = new MockAdapter(axios); + alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']); + alertifySpy['search_objects'] = jasmine.createSpy('search_objects'); + soDialog = new SearchObjectsDialog( + pgBrowser, + jquerySpy, + alertifySpy, + null + ); + + pgBrowser.get_preference = jasmine.createSpy('get_preferences'); + }); + + afterEach(() => { + networkMock.restore(); + }); + + context('there are no ancestors of the type database', () => { + it('does not create a dialog', () => { + pgBrowser.treeMenu.selectNode([{id: 'serverTreeNode'}]); + soDialog.draw(null, null, null); + expect(alertifySpy['search_objects']).not.toHaveBeenCalled(); + }); + + it('display an alert with a Backup Error', () => { + soDialog.draw(null, [{id: 'serverTreeNode'}], null); + expect(alertifySpy.alert).toHaveBeenCalledWith( + 'Search Objects Error', + 'Please select a database or its child node from the browser.' + ); + }); + }); + + context('there is an ancestor of the type database', () => { + let soDialogResizeToSpy; + beforeEach(() => { + soDialogResizeToSpy = jasmine.createSpyObj('soDialogResizeToSpy', ['resizeTo']); + alertifySpy['search_objects'].and + .returnValue(soDialogResizeToSpy); + }); + + it('displays the dialog when database node selected', (done) => { + soDialog.draw(null, [{id: 'some_database'}], null, pgBrowser.stdW.md, pgBrowser.stdH.md); + setTimeout(() => { + expect(alertifySpy['search_objects']).toHaveBeenCalledWith('Search Objects - thedatabase/username@theserver'); + expect(soDialogResizeToSpy.resizeTo).toHaveBeenCalledWith(pgBrowser.stdW.md, pgBrowser.stdH.md); + done(); + }, 0); + }); + }); + }); +}); diff --git a/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js b/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js new file mode 100644 index 000000000..e3c698bb8 --- /dev/null +++ b/web/regression/javascript/search_objects/search_objects_dialog_wrapper_spec.js @@ -0,0 +1,545 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2020, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +import {TreeFake} from '../tree/tree_fake'; +import SearchObjectsDialogWrapper from 'tools/search_objects/static/js/search_objects_dialog_wrapper'; +import axios from 'axios/index'; +import MockAdapter from 'axios-mock-adapter'; +import {TreeNode} from '../../../pgadmin/static/js/tree/tree'; + +let context = describe; + +describe('SearchObjectsDialogWrapper', () => { + let jquerySpy; + let pgBrowser; + let alertifySpy; + let dialogModelKlassSpy = null; + let backform; + let soDialogWrapper; + let noDataNode; + let serverTreeNode; + let databaseTreeNode; + let viewSchema; + let soJQueryContainerSpy; + let soNodeChildNodeSpy; + let soNode; + + beforeEach(() => { + pgBrowser = { + treeMenu: new TreeFake(), + Nodes: { + server: { + hasId: true, + getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'), + }, + database: { + hasId: true, + getTreeNodeHierarchy: jasmine.createSpy('getTreeNodeHierarchy'), + }, + 'coll-sometype': { + type: 'coll-sometype', + hasId: false, + label: 'Some types coll', + }, + sometype: { + type: 'sometype', + hasId: true, + }, + someothertype: { + type: 'someothertype', + hasId: true, + collection_type: 'coll-sometype', + }, + 'coll-edbfunc': { + type: 'coll-edbfunc', + hasId: true, + label: 'Functions', + }, + 'coll-edbproc': { + type: 'coll-edbfunc', + hasId: true, + label: 'Procedures', + }, + 'coll-edbvar': { + type: 'coll-edbfunc', + hasId: true, + label: 'Variables', + }, + }, + keyboardNavigation: jasmine.createSpyObj('keyboardNavigation', ['getDialogTabNavigator']), + }; + noDataNode = pgBrowser.treeMenu.addNewNode('level1.1', undefined, [{id: 'level1'}]); + serverTreeNode = pgBrowser.treeMenu.addNewNode('level2.1', { + _type: 'server', + _id: 10, + label: 'some-tree-label', + }, [{id: 'level2.1'}]); + databaseTreeNode = new TreeNode('database-tree-node', { + _type: 'database', + _id: 123, + _label: 'some-database-label', + }, [{id: 'database-tree-node'}]); + pgBrowser.treeMenu.addChild(serverTreeNode, databaseTreeNode); + + jquerySpy = jasmine.createSpy('jquerySpy'); + soNode = { + __internal: { + buttons: [{}, {}, {}, { + element: { + disabled: false, + }, + }], + }, + elements: { + body: { + childNodes: [ + {}, + ], + }, + content: jasmine.createSpyObj('content', ['appendChild', 'attr']), + }, + }; + + soJQueryContainerSpy = jasmine.createSpyObj('soJQueryContainer', ['get', 'attr']); + soJQueryContainerSpy.get.and.returnValue(soJQueryContainerSpy); + + viewSchema = {}; + backform = jasmine.createSpyObj('backform', ['generateViewSchema', 'Dialog']); + backform.generateViewSchema.and.returnValue(viewSchema); + + soNodeChildNodeSpy = jasmine.createSpyObj('something', ['addClass']); + jquerySpy.and.callFake((selector) => { + if (selector === '<div class=\'search_objects_dialog\'></div>') { + return soJQueryContainerSpy; + } else if (selector === soNode.elements.body.childNodes[0]) { + return soNodeChildNodeSpy; + } + }); + alertifySpy = jasmine.createSpyObj('alertify', ['alert', 'dialog']); + + }); + + describe('#prepare', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + soDialogWrapper = Object.assign(soDialogWrapper, soNode); + spyOn(soDialogWrapper, 'prepareDialog').and.callThrough(); + spyOn(soDialogWrapper, 'setTypes'); + spyOn(soDialogWrapper, 'setResultCount'); + }); + + context('no tree element is selected', () => { + it('does not prepare dialog', () => { + spyOn(soDialogWrapper, 'prepareDialog'); + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).not.toHaveBeenCalled(); + }); + }); + + context('selected tree node has no data', () => { + beforeEach(() => { + pgBrowser.treeMenu.selectNode(noDataNode.domNode); + }); + + it('does not prepare the dialog', () => { + spyOn(soDialogWrapper, 'prepareDialog'); + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).not.toHaveBeenCalled(); + }); + }); + + context('tree element is selected', () => { + let gridDestroySpy; + let networkMock; + + beforeEach(() => { + pgBrowser.treeMenu.selectNode(databaseTreeNode.domNode); + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['destroy']); + spyOn(soDialogWrapper, 'showMessage'); + gridDestroySpy = spyOn(soDialogWrapper.grid, 'destroy'); + + networkMock = new MockAdapter(axios); + + }); + + afterEach(() => { + networkMock.restore(); + }); + + it('creates dialog and displays it', () => { + soDialogWrapper.prepare(); + expect(soDialogWrapper.prepareDialog).toHaveBeenCalled(); + expect(soDialogWrapper.showMessage).toHaveBeenCalledWith(null); + }); + + + it('if grid set then destroy it', () => { + soDialogWrapper.prepare(); + expect(gridDestroySpy).toHaveBeenCalled(); + expect(soDialogWrapper.grid).toBe(null); + }); + + it('set result count to 0', () => { + soDialogWrapper.prepare(); + expect(soDialogWrapper.setResultCount).toHaveBeenCalledWith(0); + }); + + it('setTypes called before and after the ajax success', (done) => { + networkMock.onGet('/search_objects/types/10/123').reply(200, { + 'data': { + 'type1': 'Type Label 1', + 'type2': 'Type Label 2', + }, + }); + + soDialogWrapper.prepare(); + + expect(soDialogWrapper.setTypes.calls.argsFor(0)).toEqual([ + [{ id: -1, text: 'Loading...', value: null }], false, + ]); + + setTimeout(()=>{ + expect(soDialogWrapper.setTypes.calls.argsFor(1)).toEqual([ + [{id: 'all', text: 'All types'}, + {id: 'type1', text: 'Type Label 1'}, + {id: 'type2', text: 'Type Label 2'}], + ]); + done(); + }, 0); + }); + + it('setTypes called after the ajax fail', (done) => { + networkMock.onGet('/search_objects/types/10/123').reply(500); + + soDialogWrapper.prepare(); + + expect(soDialogWrapper.setTypes.calls.argsFor(0)).toEqual([ + [{ id: -1, text: 'Loading...', value: null }], false, + ]); + + setTimeout(()=>{ + expect(soDialogWrapper.setTypes.calls.argsFor(1)).toEqual([ + [{id: -1, text: 'Failed', value: null }], false, + ]); + done(); + }, 0); + }); + }); + }); + + describe('showMessage', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + soDialogWrapper.statusBar = document.createElement('div'); + soDialogWrapper.statusBar.classList.add('d-none'); + document.body.appendChild(soDialogWrapper.statusBar); + }); + + afterEach(() => { + document.body.removeChild(soDialogWrapper.statusBar); + }); + it('when info message', ()=>{ + soDialogWrapper.showMessage('locating', false); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.statusBar.querySelector('.error-in-footer')).toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.info-in-footer')).not.toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.alert-text').innerHTML).toEqual('locating'); + }); + + it('when error message', ()=>{ + soDialogWrapper.showMessage('some error', true); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.statusBar.querySelector('.error-in-footer')).not.toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.info-in-footer')).toBe(null); + expect(soDialogWrapper.statusBar.querySelector('.alert-text').innerHTML).toEqual('some error'); + }); + + it('when no message', ()=>{ + soDialogWrapper.showMessage(null); + expect(soDialogWrapper.statusBar.classList.contains('d-none')).toBe(true); + }); + }); + + describe('function', () => { + beforeEach(() => { + soDialogWrapper = new SearchObjectsDialogWrapper( + '<div class=\'search_objects_dialog\'></div>', + 'soDialogTitle', + 'search_objects', + jquerySpy, + pgBrowser, + alertifySpy, + dialogModelKlassSpy, + backform + ); + }); + + it('updateDimOfSearchResult', ()=>{ + soDialogWrapper.searchResultContainer = document.createElement('div'); + soDialogWrapper.searchResult = document.createElement('div'); + spyOn(soDialogWrapper.searchResultContainer, 'getBoundingClientRect').and.returnValue({height:100, width: 50}); + + soDialogWrapper.updateDimOfSearchResult(); + expect(soDialogWrapper.searchResult.style.height).toEqual('100px'); + expect(soDialogWrapper.searchResult.style.width).toEqual('50px'); + }); + + it('setLoading', ()=>{ + soDialogWrapper.loader = document.createElement('div'); + soDialogWrapper.loader.innerHTML = ` + <div class="pg-sp-text"></div> + `; + + soDialogWrapper.setLoading('loading'); + expect(soDialogWrapper.loader.classList.contains('d-none')).toBe(false); + expect(soDialogWrapper.loader.querySelector('.pg-sp-text').innerHTML).toEqual('loading'); + + soDialogWrapper.setLoading(null); + expect(soDialogWrapper.loader.classList.contains('d-none')).toBe(true); + }); + + it('searchBtnEnabled', ()=>{ + soDialogWrapper.searchBtn = document.createElement('button'); + + soDialogWrapper.searchBtnEnabled(true); + expect(soDialogWrapper.searchBtn.disabled).toEqual(false); + expect(soDialogWrapper.searchBtnEnabled()).toEqual(true); + + soDialogWrapper.searchBtnEnabled(false); + expect(soDialogWrapper.searchBtn.disabled).toEqual(true); + expect(soDialogWrapper.searchBtnEnabled()).toEqual(false); + }); + + it('searchBoxVal', ()=>{ + soDialogWrapper.searchBox = document.createElement('input'); + soDialogWrapper.searchBoxVal('abc'); + expect(soDialogWrapper.searchBox.value).toEqual('abc'); + expect(soDialogWrapper.searchBoxVal()).toEqual('abc'); + }); + + it('typesVal', ()=>{ + soDialogWrapper.typesSelect = document.createElement('select'); + let opt = document.createElement('option'); + opt.appendChild( document.createTextNode('Some type') ); + opt.value = 'sometype'; + soDialogWrapper.typesSelect.appendChild(opt); + + soDialogWrapper.typesVal('sometype'); + expect(soDialogWrapper.typesSelect.value).toEqual('sometype'); + expect(soDialogWrapper.typesVal()).toEqual('sometype'); + }); + + it('setGridData', ()=>{ + soDialogWrapper.dataview = jasmine.createSpyObj('dataview', ['setItems']); + soDialogWrapper.setGridData([{id:'somedata'}]); + expect(soDialogWrapper.dataview.setItems).toHaveBeenCalled(); + }); + + it('setGridData', ()=>{ + soDialogWrapper.searchResultCount = document.createElement('span'); + + soDialogWrapper.setResultCount(0); + expect(soDialogWrapper.searchResultCount.innerHTML).toEqual('0 matches found.'); + + soDialogWrapper.setResultCount(1); + expect(soDialogWrapper.searchResultCount.innerHTML).toEqual('1 match found.'); + + soDialogWrapper.setResultCount(); + expect(soDialogWrapper.searchResultCount.innerHTML).toEqual('Unknown matches found.'); + }); + + it('onDialogResize', ()=>{ + soDialogWrapper.grid = jasmine.createSpyObj('grid', ['autosizeColumns', 'resizeCanvas']); + spyOn(soDialogWrapper, 'updateDimOfSearchResult'); + + soDialogWrapper.onDialogResize(); + expect(soDialogWrapper.updateDimOfSearchResult).toHaveBeenCalled(); + expect(soDialogWrapper.grid.resizeCanvas).toHaveBeenCalled(); + expect(soDialogWrapper.grid.autosizeColumns).toHaveBeenCalled(); + }); + + it('onDialogShow', (done)=>{ + spyOn(soDialogWrapper, 'prepareGrid').and.callFake(function() { + this.grid = jasmine.createSpyObj('grid', ['init']); + }); + + spyOn(soDialogWrapper, 'focusOnDialog'); + spyOn(soDialogWrapper, 'updateDimOfSearchResult'); + spyOn(soDialogWrapper, 'setGridData'); + spyOn(soDialogWrapper, 'onDialogResize'); + + + soDialogWrapper.onDialogShow(); + setTimeout(()=>{ + expect(soDialogWrapper.prepareGrid).toHaveBeenCalled(); + expect(soDialogWrapper.focusOnDialog).toHaveBeenCalled(); + expect(soDialogWrapper.setGridData).toHaveBeenCalledWith([]); + expect(soDialogWrapper.onDialogResize).toHaveBeenCalled(); + done(); + }, 750); + }); + + context('getCollNode', ()=>{ + it('type have same coll node', ()=>{ + let collNode = soDialogWrapper.getCollNode('sometype'); + expect(collNode.type).toEqual('coll-sometype'); + }); + + it('type does not same coll node', ()=>{ + let collNode = soDialogWrapper.getCollNode('someothertype'); + expect(collNode.type).toEqual('coll-sometype'); + }); + + it('type does not have coll node at all', ()=>{ + let collNode = soDialogWrapper.getCollNode('database'); + expect(collNode).toBe(null); + }); + }); + + it('finaliseData', ()=>{ + spyOn(soDialogWrapper, 'translateSearchObjectsPath').and.returnValue(['disp/path', 'id/path']); + let data = soDialogWrapper.finaliseData({ + name: 'objname', + type: 'sometype', + type_label: 'Some types coll', + path: ':some.123:/path', + show_node: true, + }); + expect(data).toEqual({ + id: 'id/path', + icon: 'icon-sometype', + name: 'objname', + type: 'sometype', + type_label: 'Some types coll', + path: 'disp/path', + id_path: 'id/path', + show_node: true, + }); + }); + + context('translateSearchObjectsPath', ()=>{ + let path = null, catalog_level = null; + beforeEach(()=>{ + pgBrowser.Nodes = { + 'server_group': { + type:'server_group', + label: 'Server group', + }, + 'server': { + type:'server', + label: 'Server', + }, + 'coll-database': { + type:'coll-database', + label: 'Databases', + }, + 'database': { + type:'database', + label: 'Database', + }, + 'coll-schema': { + type:'coll-schema', + label: 'Schemas', + }, + 'schema': { + type:'schema', + label: 'Schema', + }, + 'coll-table': { + type:'coll-table', + label: 'Tables', + }, + 'table': { + type:'table', + label: 'Table', + }, + 'sometype': { + type:'sometype', + label: 'Some type', + collection_type: 'coll-table', + }, + 'coll-catalog': { + type:'coll-catalog', + label: 'Catalogs', + }, + 'catalog': { + type:'catalog', + label: 'Catalog', + }, + 'coll-catalog_object': { + type:'coll-catalog_object', + label: 'Catalog Objects', + }, + 'catalog_object': { + type:'catalog_object', + label: 'catalog object', + }, + }; + + soDialogWrapper.treeInfo = { + 'server_group': {'id': 'server_group/1', '_id': 1}, + 'server': {'id': 'server/3', '_id': 3}, + 'database': {'id': 'database/18456', '_id': 18456}, + }; + }); + it('regular schema', ()=>{ + path = ':schema.2200:/test_db/:table.2604:/sampletab'; + catalog_level = 'N'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Schemas/test_db/Tables/sampletab', + ['server_group/1','server/3','coll-database/3','database/18456','coll-schema/18456','schema/2200','coll-table/2200','table/2604'], + ]); + }); + + context('catalog schema', ()=>{ + it('with db support', ()=>{ + path = ':schema.11:/PostgreSQL Catalog (pg_catalog)/:table.2604:/pg_class'; + catalog_level = 'D'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Catalogs/PostgreSQL Catalog (pg_catalog)/Tables/pg_class', + ['server_group/1','server/3','coll-database/3','database/18456','coll-catalog/18456','catalog/11','coll-table/11','table/2604'], + ]); + }); + + it('with object support only', ()=>{ + path = ':schema.11:/ANSI (information_schema)/:table.2604:/attributes'; + catalog_level = 'O'; + + let retVal = soDialogWrapper.translateSearchObjectsPath(path, catalog_level); + expect(retVal).toEqual([ + 'Catalogs/ANSI (information_schema)/Catalog Objects/attributes', + ['server_group/1','server/3','coll-database/3','database/18456','coll-catalog/18456','catalog/11','coll-catalog_object/11','catalog_object/2604'], + ]); + }); + }); + }); + }); +}); diff --git a/web/regression/javascript/tree/tree_fake.js b/web/regression/javascript/tree/tree_fake.js index c0c17796a..f476bb272 100644 --- a/web/regression/javascript/tree/tree_fake.js +++ b/web/regression/javascript/tree/tree_fake.js @@ -41,6 +41,9 @@ export class TreeFake extends Tree { this.aciTreeToOurTreeTranslator = {}; this.aciTreeApi = jasmine.createSpyObj( 'ACITreeApi', ['setInode', 'unload', 'deselect', 'select']); + this.aciTreeApi.unload.and.callFake(function(domNode, config) { + config.success(); + }); } addNewNode(id, data, domNode, path) { diff --git a/web/regression/javascript/tree/tree_spec.js b/web/regression/javascript/tree/tree_spec.js index bb607796c..038fcc24c 100644 --- a/web/regression/javascript/tree/tree_spec.js +++ b/web/regression/javascript/tree/tree_spec.js @@ -246,39 +246,70 @@ describe('tree tests', () => { tree.aciTreeApi = jasmine.createSpyObj( 'ACITreeApi', ['setInode', 'unload', 'deselect', 'select']); + tree.aciTreeApi.unload.and.callFake((domNode, config) => { + config.success(); + }); }); - it('reloads the node and its children', () => { - level2.reload(tree); - expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + it('reloads the node and its children', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); - it('does not reload the children of node', () => { - level2.reload(tree); - expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + it('does not reload the children of node', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); it('select the node', (done) => { - level2.reload(tree); - setTimeout(() => { - expect(tree.selected()).toEqual([{id: 'level2'}]); - done(); - }, 20); + level2.reload(tree) + .then(()=>{ + setTimeout(() => { + expect(tree.selected()).toEqual([{id: 'level2'}]); + done(); + }, 20); + }) + .catch((error)=>{ + fail(error); + }); }); describe('ACITree specific', () => { - it('sets the current node as a Inode, changing the Icon back to +', () => { - level2.reload(tree); - expect(tree.aciTreeApi.setInode).toHaveBeenCalledWith([{id: 'level2'}]); + it('sets the current node as a Inode, changing the Icon back to +', (done) => { + level2.reload(tree) + .then(()=>{ + expect(tree.aciTreeApi.setInode).toHaveBeenCalledWith([{id: 'level2'}]); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); it('deselect the node and selects it again to trigger ACI tree' + ' events', (done) => { - level2.reload(tree); - setTimeout(() => { - expect(tree.aciTreeApi.deselect).toHaveBeenCalledWith([{id: 'level2'}]); - done(); - }, 20); + level2.reload(tree) + .then(()=>{ + setTimeout(() => { + expect(tree.aciTreeApi.deselect).toHaveBeenCalledWith([{id: 'level2'}]); + done(); + }, 20); + }) + .catch((error)=>{ + fail(error); + }); }); }); }); @@ -292,17 +323,32 @@ describe('tree tests', () => { level2 = tree.addNewNode('level2', {data: 'data'}, ['<li>level2</li>'], ['level1']); tree.addNewNode('level3', {data: 'more data'}, ['<li>level3</li>'], ['level1', 'level2']); tree.aciTreeApi = jasmine.createSpyObj('ACITreeApi', ['unload']); + tree.aciTreeApi.unload.and.callFake((domNode, config) => { + config.success(); + }); }); - it('unloads the children of the current node', () => { - level2.unload(tree); - expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); - expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + it('unloads the children of the current node', (done) => { + level2.unload(tree) + .then(()=>{ + expect(tree.findNodeByDomElement([{id: 'level2'}])).toEqual(level2); + expect(tree.findNodeByDomElement([{id: 'level3'}])).toBeNull(); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); - it('calls unload on the ACI Tree', () => { - level2.unload(tree); - expect(tree.aciTreeApi.unload).toHaveBeenCalledWith(['<li>level2</li>']); + it('calls unload on the ACI Tree', (done) => { + level2.unload(tree) + .then(()=>{ + expect(tree.aciTreeApi.unload).toHaveBeenCalledWith(['<li>level2</li>'], jasmine.any(Object)); + done(); + }) + .catch((error)=>{ + fail(error); + }); }); }); }); diff --git a/web/webpack.config.js b/web/webpack.config.js index 9fd0a32e9..29811388a 100644 --- a/web/webpack.config.js +++ b/web/webpack.config.js @@ -494,7 +494,8 @@ module.exports = [{ ',pgadmin.tools.debugger.controller' + ',pgadmin.tools.debugger.direct' + ',pgadmin.node.pga_job' + - ',pgadmin.tools.schema_diff', + ',pgadmin.tools.schema_diff' + + ',pgadmin.tools.search_objects', }, }, { test: require.resolve('snapsvg'), diff --git a/web/webpack.shim.js b/web/webpack.shim.js index fe5a74e53..bca198d6d 100644 --- a/web/webpack.shim.js +++ b/web/webpack.shim.js @@ -277,6 +277,8 @@ var webpackShimConfig = { 'pgadmin.tools.restore': path.join(__dirname, './pgadmin/tools/restore/static/js/restore'), 'pgadmin.tools.schema_diff': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff'), 'pgadmin.tools.schema_diff_ui': path.join(__dirname, './pgadmin/tools/schema_diff/static/js/schema_diff_ui'), + 'pgadmin.tools.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js/search_objects'), + 'pgadmin.search_objects': path.join(__dirname, './pgadmin/tools/search_objects/static/js'), 'pgadmin.tools.user_management': path.join(__dirname, './pgadmin/tools/user_management/static/js/user_management'), 'pgadmin.user_management.current_user': '/user_management/current_user', 'slick.pgadmin.editors': path.join(__dirname, './pgadmin/tools/../static/js/slickgrid/editors'), diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js index 92f280cbc..b48d104ba 100644 --- a/web/webpack.test.config.js +++ b/web/webpack.test.config.js @@ -105,6 +105,7 @@ module.exports = { 'pgadmin.browser.preferences': path.join(__dirname, './pgadmin/browser/static/js/preferences'), 'pgadmin.browser.activity': path.join(__dirname, './pgadmin/browser/static/js/activity'), 'bundled_codemirror': path.join(__dirname, './pgadmin/static/bundle/codemirror'), + 'tools': path.join(__dirname, './pgadmin/tools/'), }, }, }; diff --git a/web/yarn.lock b/web/yarn.lock index 73002f1c2..9fcfc2d75 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -29,12 +29,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.6.4", "@babel/generator@^7.8.6": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.8.tgz#cdcd58caab730834cee9eeadb729e833b625da3e" - integrity sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg== +"@babel/generator@^7.6.4", "@babel/generator@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" + integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== dependencies: - "@babel/types" "^7.8.7" + "@babel/types" "^7.9.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -54,15 +54,6 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-call-delegate@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" - integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.7" - "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": version "7.8.8" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" @@ -126,17 +117,17 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz#6a13b5eecadc35692047073a64e42977b97654a4" - integrity sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: "@babel/helper-module-imports" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-simple-access" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" "@babel/template" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/types" "^7.9.0" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.8.3": @@ -194,6 +185,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" + integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -205,27 +201,27 @@ "@babel/types" "^7.8.3" "@babel/helpers@^7.6.2": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" "@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== dependencies: + "@babel/helper-validator-identifier" "^7.9.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.6.4", "@babel/parser@^7.8.6": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.8.tgz#4c3b7ce36db37e0629be1f0d50a571d2f86f6cd4" - integrity sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA== +"@babel/parser@^7.6.4", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.8.3" @@ -253,9 +249,9 @@ "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" + integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" @@ -343,9 +339,9 @@ lodash "^4.17.13" "@babel/plugin-transform-classes@^7.5.5": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz#77534447a477cbe5995ae4aee3e39fbc8090c46d" - integrity sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg== + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" + integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" @@ -394,9 +390,9 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-for-of@^7.4.4": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz#a051bd1b402c61af97a27ff51b468321c7c2a085" - integrity sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -423,40 +419,40 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-modules-amd@^7.5.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-commonjs@^7.6.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-systemjs@^7.5.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== dependencies: "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-umd@^7.2.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": @@ -482,11 +478,10 @@ "@babel/helper-replace-supers" "^7.8.3" "@babel/plugin-transform-parameters@^7.4.4": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.8.tgz#0381de466c85d5404565243660c4496459525daf" - integrity sha512-hC4Ld/Ulpf1psQciWWwdnUspQoQco2bMzSrwU6TmzRlvoYQe4rQFy9vnCZDTlVeCQj0JPfL+1RX0V8hCJvkgBA== + version "7.9.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" + integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== dependencies: - "@babel/helper-call-delegate" "^7.8.7" "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -613,9 +608,9 @@ semver "^5.5.0" "@babel/runtime@^7.8.4": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" - integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" + integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== dependencies: regenerator-runtime "^0.13.4" @@ -628,27 +623,27 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.6.3", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" - integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== +"@babel/traverse@^7.6.3", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" + "@babel/generator" "^7.9.0" "@babel/helper-function-name" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.6.3", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" - integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== +"@babel/types@^7.6.3", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" + integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.0" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -665,159 +660,158 @@ integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== "@types/node@*": - version "13.9.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" - integrity sha512-bnoqK579sAYrQbp73wwglccjJ4sfRdKU7WNEZ5FW4K2U6Kc0/eZ5kvXG0JKsEKFB50zrFmfFt52/cvBbZa7eXg== + version "13.11.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" + integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/[email protected]": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== +"@webassemblyjs/[email protected]": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -843,6 +837,11 @@ JSONStream@^1.0.3: jsonparse "^1.2.0" through ">=2.2.7 <3" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accepts@~1.3.4, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -919,7 +918,7 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.9.1: "alertifyjs@git+https://github.com/EnterpriseDB/AlertifyJS/#72c1d794f5b6d4ec13a68d123c08f19021afe263": version "1.7.1" - resolved "git+https://github.com/EnterpriseDB/AlertifyJS.git#72c1d794f5b6d4ec13a68d123c08f19021afe263" + resolved "git+https://github.com/EnterpriseDB/AlertifyJS/#72c1d794f5b6d4ec13a68d123c08f19021afe263" alphanum-sort@^1.0.0: version "1.0.2" @@ -979,7 +978,7 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.1.1: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== @@ -996,6 +995,14 @@ archive-type@^4.0.0: dependencies: file-type "^4.2.0" +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.6, argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1100,24 +1107,25 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.4: - version "9.7.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378" - integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g== + version "9.7.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" + integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== dependencies: - browserslist "^4.8.3" - caniuse-lite "^1.0.30001020" + browserslist "^4.11.0" + caniuse-lite "^1.0.30001036" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.26" - postcss-value-parser "^4.0.2" + postcss "^7.0.27" + postcss-value-parser "^4.0.3" axios-mock-adapter@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.17.0.tgz#0dbee43c606d4aaba5a43d88d96d6661a7cc3c04" - integrity sha512-q3efmwJUOO4g+wsLNSk9Ps1UlJoF3fQ3FSEe4uEEhkRtu7SoiAVPj8R3Hc/WP55MBTVFzaDP9QkdJhdVhP8A1Q== + version "1.18.1" + resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.18.1.tgz#a2ba2638ef513d954793f96bde3e26bd4a1b7940" + integrity sha512-kFBZsG1Ma5yxjRGHq5KuuL55mPb7WzFULhypquEhzPg8SH5CXICb+qwC2CCA5u+GQVpiqGPwKSRkd3mBCs6gdw== dependencies: - deep-equal "^1.0.1" + fast-deep-equal "^3.1.1" + is-buffer "^2.0.3" axios@^0.18.1: version "0.18.1" @@ -1887,7 +1895,61 @@ browserify-zlib@^0.2.0, browserify-zlib@~0.2.0: dependencies: pako "~1.0.5" -browserify@^16.1.0, browserify@~16.2.3: +browserify@^16.1.0: + version "16.5.1" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.1.tgz#3c13c97436802930d5c3ae28658ddc33bfd37dc2" + integrity sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "~5.2.1" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp-classic "^0.5.2" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^3.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +browserify@~16.2.3: version "16.2.3" resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== @@ -1941,15 +2003,15 @@ browserify@^16.1.0, browserify@~16.2.3: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.8.3: - version "4.10.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" - integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== +browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.0, browserslist@^4.8.3: + version "4.11.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" + integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== dependencies: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.378" - node-releases "^1.1.52" - pkg-up "^3.1.0" + caniuse-lite "^1.0.30001038" + electron-to-chromium "^1.3.390" + node-releases "^1.1.53" + pkg-up "^2.0.0" buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -2001,6 +2063,14 @@ buffer@^5.0.2, buffer@^5.2.1: base64-js "^1.0.2" ieee754 "^1.1.4" +buffer@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2012,9 +2082,9 @@ [email protected]: integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== cacache@^12.0.2, cacache@^12.0.3: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -2146,10 +2216,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001035: - version "1.0.30001035" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz#2bb53b8aa4716b2ed08e088d4dc816a5fe089a1e" - integrity sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001036, caniuse-lite@^1.0.30001038: + version "1.0.30001039" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" + integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== caw@^2.0.0, caw@^2.0.1: version "2.0.1" @@ -2191,7 +2261,22 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -"chokidar@>=2.0.0 <4.0.0", chokidar@^2.0.2, chokidar@^2.1.1: +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +chokidar@^2.1.1, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2210,21 +2295,6 @@ check-types@^8.0.3: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.3.0" - optionalDependencies: - fsevents "~2.1.2" - chownr@^1.1.1, chownr@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -2306,10 +2376,15 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + codemirror@^5.50.0: - version "5.52.0" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.52.0.tgz#4dbd6aef7f0e63db826b9a23922f0c03ac75c0a7" - integrity sha512-K2UB6zjscrfME03HeRe/IuOmCeqNpw7PLKGHThYpLbZEuKf+ZoujJPhxZN4hHJS1O7QyzEsV7JJZGxuQWVaFCg== + version "5.52.2" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.52.2.tgz#c29e1f7179f85eb0dd17c0586fa810e4838ff584" + integrity sha512-WCGCixNUck2HGvY8/ZNI1jYfxPG5cRHv0VjmWuNzbtCLz8qYA5d+je4QhSSCtCaagyeOwMi/HmmPTjBgiTm2lQ== collection-visit@^1.0.0: version "1.0.0" @@ -2326,11 +2401,16 @@ color-convert@^1.9.0, color-convert@^1.9.1: dependencies: color-name "1.1.3" [email protected], color-name@^1.0.0: [email protected]: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" @@ -2442,6 +2522,11 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + console-stream@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" @@ -2464,7 +2549,14 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.0, convert-source-map@^1.1.3, convert-source-map@~1.1.0: +convert-source-map@^1.1.0, convert-source-map@^1.1.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= @@ -2679,6 +2771,14 @@ [email protected]: mdn-data "2.0.4" source-map "^0.6.1" [email protected]: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + css-what@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1" @@ -2758,11 +2858,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== dependencies: - css-tree "1.0.0-alpha.37" + css-tree "1.0.0-alpha.39" cubic2quad@^1.0.0: version "1.1.1" @@ -2819,7 +2919,7 @@ debug@=3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@^3.2.6: +debug@^3.0.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2890,9 +2990,9 @@ decompress-unzip@^4.0.1: yauzl "^2.4.2" decompress@^4.0.0, decompress@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" @@ -2903,17 +3003,10 @@ decompress@^4.0.0, decompress@^4.2.0: pify "^2.3.0" strip-dirs "^2.0.0" -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" @@ -2954,6 +3047,11 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2987,6 +3085,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" @@ -3150,14 +3253,14 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== ejs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.1.tgz#30c8f6ee9948502cc32e85c37a3f8b39b5a614a5" - integrity sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.0.2.tgz#745b01cdcfe38c1c6a2da3bbb2d9957060a31226" + integrity sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA== -electron-to-chromium@^1.3.378: - version "1.3.379" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.379.tgz#81dc5e82a3e72bbb830d93e15bc35eda2bbc910e" - integrity sha512-NK9DBBYEBb5f9D7zXI0hiE941gq3wkBeQmXs1ingigA/jnTg5mhwY2Z5egwA+ZI8OLGKCx0h1Cl8/xeuIBuLlg== +electron-to-chromium@^1.3.390: + version "1.3.397" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz#db640c2e67b08d590a504c20b56904537aa2bafa" + integrity sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A== elliptic@^6.0.0: version "6.5.2" @@ -3281,10 +3384,10 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" + integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" @@ -3394,11 +3497,11 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48" - integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" + integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== dependencies: - estraverse "^4.0.0" + estraverse "^5.0.0" esrecurse@^4.1.0: version "4.2.1" @@ -3407,11 +3510,16 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" + integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== + estree-walker@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" @@ -3662,9 +3770,9 @@ fd-slicer@~1.1.0: pend "~1.2.0" figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^1.3.5: version "1.7.0" @@ -3806,6 +3914,13 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3848,9 +3963,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== "flotr2@git+https://github.com/EnterpriseDB/Flotr2.git": version "0.1.0" @@ -3864,13 +3979,20 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" [email protected], follow-redirects@^1.0.0: [email protected]: version "1.5.10" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: debug "=3.1.0" +follow-redirects@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== + dependencies: + debug "^3.0.0" + font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" @@ -3927,6 +4049,13 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -3972,6 +4101,20 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + geometry-interfaces@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/geometry-interfaces/-/geometry-interfaces-1.1.4.tgz#9e82af6700ca639a675299f08e1f5fbc4a79d48d" @@ -4043,9 +4186,9 @@ glob-parent@^3.1.0: path-dirname "^1.0.0" glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== dependencies: is-glob "^4.0.1" @@ -4237,6 +4380,11 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -4352,7 +4500,7 @@ [email protected]: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== [email protected], http-errors@~1.7.2: [email protected]: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== @@ -4363,6 +4511,17 @@ [email protected], http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-proxy@^1.13.0: version "1.18.0" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" @@ -4388,7 +4547,7 @@ iconfont-webpack-plugin@^4.2.1: svgicons2svgfont "9.1.1" ttf2woff "2.0.1" [email protected], iconv-lite@^0.4.24: [email protected], iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4417,6 +4576,13 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -4509,9 +4675,9 @@ imagemin@^5.3.1: replace-ext "^1.0.0" immutability-helper@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.0.1.tgz#4f609c5afbf8d78cb297970e8af2fba8b0eda1d6" - integrity sha512-U92ROQQt7XkIwrdqCByUI118TQM1hXdKnRQpvKeA0HRyGSnJipu9IWHe4UD8zCN00O8UnQjQzPCgZ1CC3yBzHA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.0.2.tgz#e9187158b47c93368a92e84c31714c4b3dff30b0" + integrity sha512-fcrJ26wpvUcuGRpoGY4hyQ/JOeR1HAunMmE3C0XYXSe6plAGtgTlB2S4BzueBANCPrDJ7AByL1yrIRLIlVfwpA== dependencies: invariant "^2.2.4" @@ -4606,7 +4772,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, [email protected], inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4621,7 +4787,7 @@ [email protected]: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5: +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -4726,11 +4892,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4760,7 +4921,7 @@ is-buffer@^1.1.0, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.2: +is-buffer@^2.0.2, is-buffer@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== @@ -4858,6 +5019,13 @@ is-finite@^1.0.0: resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -4938,7 +5106,7 @@ is-promise@^2.1.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= -is-regex@^1.0.4, is-regex@^1.0.5: +is-regex@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== @@ -5043,7 +5211,12 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jasmine-core@^3.3, jasmine-core@~3.3.0: +jasmine-core@^3.3: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.5.0.tgz#132c23e645af96d85c8bca13c8758b18429fc1e4" + integrity sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA== + +jasmine-core@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.3.0.tgz#dea1cdc634bc93c7e0d4ad27185df30fa971b10e" integrity sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA== @@ -5057,9 +5230,9 @@ jest-worker@^24.9.0: supports-color "^6.1.0" jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" + integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -5089,16 +5262,16 @@ js-string-escape@^1.0.0: resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.12.0, js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -5164,9 +5337,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: minimist "^1.2.5" @@ -5213,9 +5386,9 @@ karma-chrome-launcher@^2.2.0: which "^1.2.1" karma-jasmine-html-reporter@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.2.tgz#a846b703dbe5c8d803481e68636eb93346dc5966" - integrity sha512-ILBPsXqQ3eomq+oaQsM311/jxsypw5/d0LnZXj26XkfThwq7jZ55A2CFSKJVA5VekbbOGvMyv7d3juZj0SeTxA== + version "1.5.3" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz#c724078436ed7b7d17a47e79164af36eed2d2713" + integrity sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA== karma-jasmine@~2.0.1: version "2.0.1" @@ -5388,6 +5561,14 @@ [email protected], loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0. emojis-list "^3.0.0" json5 "^1.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -5524,11 +5705,6 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -5554,9 +5730,9 @@ map-visit@^1.0.0: object-visit "^1.0.0" marked@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.1.tgz#a233f39572fab15ede53a3c3be8a139bff86d2dd" - integrity sha512-tZfJS8uE0zpo7xpTffwFwYRfW9AzNcdo04Qcjs+C9+oCy8MSRD2reD5iDVtYx8mtLaqsGughw/YLlcwNxAHA1g== + version "0.8.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" + integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== md5.js@^1.3.4: version "1.3.5" @@ -5572,6 +5748,11 @@ [email protected]: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== [email protected]: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + [email protected]: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -5759,6 +5940,14 @@ minipass-pipeline@^1.2.2: dependencies: minipass "^3.0.0" +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + minipass@^3.0.0, minipass@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" @@ -5766,6 +5955,13 @@ minipass@^3.0.0, minipass@^3.1.1: dependencies: yallist "^4.0.0" +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -5790,10 +5986,15 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c" - integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg== +mkdirp-classic@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz#54c441ce4c96cd7790e10b41a87aa51068ecab2b" + integrity sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g== + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" @@ -5917,6 +6118,15 @@ neatequal@^1.0.0: dependencies: varstream "^0.3.2" +needle@^2.2.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a" + integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + [email protected]: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -5961,12 +6171,34 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== dependencies: - semver "^6.3.0" + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4.4.2" + +node-releases@^1.1.53: + version "1.1.53" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" + integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" @@ -6009,6 +6241,13 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + npm-conf@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" @@ -6017,6 +6256,20 @@ npm-conf@^1.1.0: config-chain "^1.1.11" pify "^3.0.0" +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -6024,6 +6277,16 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -6041,6 +6304,11 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6065,11 +6333,6 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== - object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -6192,6 +6455,11 @@ os-filter-obj@^2.0.0: dependencies: arch "^2.1.0" +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -6206,11 +6474,19 @@ os-shim@^0.1.3: resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= -os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" @@ -6262,13 +6538,27 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -6321,6 +6611,11 @@ p-timeout@^2.0.1: dependencies: p-finally "^1.0.0" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -6500,9 +6795,9 @@ pend@~1.2.0: integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= picomatch@^2.0.4, picomatch@^2.0.7: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" @@ -6545,12 +6840,12 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= dependencies: - find-up "^3.0.0" + find-up "^2.1.0" pngquant-bin@^5.0.0: version "5.0.2" @@ -6892,12 +7187,12 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.2: +postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== [email protected], postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: [email protected], postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: version "7.0.27" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== @@ -7098,6 +7393,16 @@ raw-loader@^1.0.0: loader-utils "^1.1.0" schema-utils "^1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" @@ -7122,7 +7427,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -7145,6 +7450,15 @@ readable-stream@^1.0.33: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -7216,14 +7530,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -7405,7 +7711,7 @@ [email protected]: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.3, rimraf@^2.7.1: +rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -7453,18 +7759,18 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.4.0: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: tslib "^1.9.0" [email protected], safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: [email protected], safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -7604,7 +7910,7 @@ [email protected]: parseurl "~1.3.3" send "0.17.1" -set-blocking@^2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -7687,9 +7993,9 @@ shim-loader@^1.0.1: webpack-sources "^0.2.3" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-concat@^1.0.0: version "1.0.0" @@ -8007,6 +8313,16 @@ stream-http@^2.0.0, stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-http@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" + integrity sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^3.0.6" + xtend "^4.0.0" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" @@ -8036,7 +8352,16 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^2.1.0: +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -8063,21 +8388,39 @@ string.prototype.codepointat@^0.2.0: resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== +string.prototype.trimend@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" + integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" + integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -8098,7 +8441,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= @@ -8145,7 +8488,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@^2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -8308,6 +8651,19 @@ tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" +tar@^4.4.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -8372,9 +8728,9 @@ terser-webpack-plugin@^2.2.2: webpack-sources "^1.4.3" terser@^4.1.2, terser@^4.4.3, terser@^4.6.2: - version "4.6.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" - integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + version "4.6.10" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" + integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -8575,9 +8931,9 @@ umd@^3.0.0: integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== unbzip2-stream@^1.0.9: - version "1.3.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" - integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== + version "1.4.0" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.0.tgz#097ca7b18b5b71e6c8bc8e514a0f1884a12d6eb1" + integrity sha512-kVx7CDAsdBSWVf404Mw7oI9i09w5/mTT/Ruk+RWa64PLYKvsAucLLFHvQtnvjeADM4ZizxrvG5SHnF4Te4T2Cg== dependencies: buffer "^5.2.1" through "^2.3.8" @@ -8594,9 +8950,9 @@ undeclared-identifiers@^1.1.2: xtend "^4.0.1" underscore@>=1.7.0, underscore@>=1.8.3, underscore@^1.8.0, underscore@^1.8.3, underscore@^1.9.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" - integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== + version "1.10.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" + integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -8744,7 +9100,7 @@ [email protected]: lru-cache "4.1.x" tmp "0.0.x" -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -8844,17 +9200,17 @@ watchify@~3.11.1: xtend "^4.0.0" watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== dependencies: - chokidar "^2.0.2" + chokidar "^2.1.8" graceful-fs "^4.1.2" neo-async "^2.5.0" "webcabin-docker@git+https://github.com/EnterpriseDB/wcDocker/#7a14f50a7197fe3824d706c85485a49fa9166804": version "2.2.4-dev" - resolved "git+https://github.com/EnterpriseDB/wcDocker.git#7a14f50a7197fe3824d706c85485a49fa9166804" + resolved "git+https://github.com/EnterpriseDB/wcDocker/#7a14f50a7197fe3824d706c85485a49fa9166804" dependencies: FileSaver "^0.10.0" font-awesome "^4.7.0" @@ -8938,14 +9294,14 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-map "~0.6.1" webpack@^4.41.2: - version "4.42.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" - integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" + version "4.42.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" + integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" acorn "^6.2.1" ajv "^6.10.2" ajv-keywords "^3.4.1" @@ -8957,7 +9313,7 @@ webpack@^4.41.2: loader-utils "^1.2.3" memory-fs "^0.4.1" micromatch "^3.1.10" - mkdirp "^0.5.1" + mkdirp "^0.5.3" neo-async "^2.6.1" node-libs-browser "^2.2.1" schema-utils "^1.0.0" @@ -8978,6 +9334,13 @@ which@^1.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + wkx@^0.4.6: version "0.4.8" resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.8.tgz#a092cf088d112683fdc7182fd31493b2c5820003" @@ -9064,7 +9427,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== ^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: [pgAdmin][RM2172] Search Objects Functionality @ 2020-04-06 12:33 Akshay Joshi <[email protected]> parent: Aditya Toshniwal <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Akshay Joshi @ 2020-04-06 12:33 UTC (permalink / raw) To: Aditya Toshniwal <[email protected]>; +Cc: pgadmin-hackers; Khushboo Vashi <[email protected]> Thanks, patch applied. Fixed some minor issues. On Mon, Apr 6, 2020 at 3:52 PM Aditya Toshniwal < [email protected]> wrote: > Hi Hackers, > > Please find the attached rebased patch. > > On Mon, Apr 6, 2020 at 3:22 PM Khushboo Vashi < > [email protected]> wrote: > >> Hi Aditya, >> >> Please resend the rebased patch, it does not apply. >> >> Thanks, >> Khushboo >> >> On Fri, Apr 3, 2020 at 2:44 PM Aditya Toshniwal < >> [email protected]> wrote: >> >>> Hi Hackers, >>> >>> Attached is the updated patch. >>> With this, >>> 1) I've displayed the rows count detail at the bottom of the dialog. >>> This will help in both cases, when there are rows and when there are none. >>> 2) As discussed, a user can now apply object types dropdown filter on >>> already loaded data. >>> 3) I've not made changes for the multilevel partition icon because it >>> would be too much to do for an icon. We're already showing the type name in >>> the grid. Adding extra SQL joins and making the query slower for the icon >>> is not desirable. >>> 4) Fixed some gettext issues as mentioned in the review. >>> >>> Please review. >>> >>> >>> On Thu, Apr 2, 2020 at 5:54 PM Aditya Toshniwal < >>> [email protected]> wrote: >>> >>>> Hi Khushboo, >>>> >>>> On Thu, Apr 2, 2020 at 4:49 PM Khushboo Vashi < >>>> [email protected]> wrote: >>>> >>>>> >>>>> >>>>> On Thu, Apr 2, 2020 at 4:30 PM Aditya Toshniwal < >>>>> [email protected]> wrote: >>>>> >>>>>> Hi Khushboo, >>>>>> >>>>>> Thank you for reviewing. >>>>>> >>>>>> >>>>>> On Thu, Apr 2, 2020 at 4:09 PM Khushboo Vashi < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Hi Aditya, >>>>>>> >>>>>>> Review comments: >>>>>>> >>>>>>> *UI:* >>>>>>> >>>>>>> 1. When no object is found, the default message should be given, >>>>>>> currently no message displayed. >>>>>>> 2. Can we have a tooltip on the row "Double click to locate the >>>>>>> object in the browser" ? >>>>>>> 3. Full stop is missing in the message column objects are disabled >>>>>>> in the browser. You can enable them in the preferences dialog ( :D ) >>>>>>> and also, we should start the statement with the capital letter. >>>>>>> 4. If possible, use the multilevel partition table symbol same as >>>>>>> the browser tree. >>>>>>> 5. gettext is missing from the search grid header. >>>>>>> >>>>>> I'll fix all above. >>>>>> >>>>>>> 6. Suggestion: The search button should be at the end (after type >>>>>>> combobox). The current position of the controls suggest that search for >>>>>>> the objects and then filter it out but that's not the case. >>>>>>> >>>>>> I've actually kept the most frequently used controls together. The >>>>>> probability of using the types filter is less and a user would generally go >>>>>> for full search. This is how even we generally do. We search first and then >>>>>> apply filter if required >>>>>> >>>>> Right, so type based search on slickgrid data would be useful. >>>>> >>>> 👍 >>>> >>>>> After changing the type, we have to click on the search button. >>>>>>> In the current positioning, we should fetch all the records from the >>>>>>> backend and then filter those out depending on the type at the client side >>>>>>> only, so that will reduce the server requests and slickgrid is efficient it >>>>>>> do so. >>>>>>> >>>>>> I'll look into this. My only concern is the data may be outdated, but >>>>>> I agree to filter in slickgrid on type change. The user can hit search >>>>>> again if required. >>>>>> >>>>> >>>>>>> *Backend:* >>>>>>> >>>>>>> 1. We do have the list of blueprint, so we can use that list instead >>>>>>> of taking the hard coe list in the init method of SearchObjectsHelper >>>>>>> class. >>>>>>> >>>>>> The reason is, we do not support all objects for search objects. Only >>>>>> objects under a database are supported. The probability of node type change >>>>>> is very less. >>>>>> >>>>> True but we can maintain the skip list (which would be less) and we do >>>>> have bluprint start with NODE, so it will be easier to fetch. >>>>> >>>> I would prefer the "in" list rather than "skip" list. Each time a new >>>> node is added to pgAdmin, we will have to update the skip list in >>>> search objects. With the "in" list, search objects has better control. >>>> >>>>> 2. While searching the object, we create an object of SearchObjectsHelper >>>>>>> on each request. We can create it once while initializing and utilize it on >>>>>>> every search. >>>>>>> >>>>>> The intention is to keep SearchObjectsHelper stateless. The object >>>>>> is created based on the request data and it is easier to maintain >>>>>> independently. >>>>>> >>>>>>> >>>>>>> Note: The functionality is working fine. >>>>>>> >>>>>> Great. Thanks. >>>>>> >>>>>>> >>>>>>> Thanks, >>>>>>> Khushboo >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Thu, Apr 2, 2020 at 9:31 AM Khushboo Vashi < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Wed, Apr 1, 2020 at 6:00 PM Akshay Joshi < >>>>>>>> [email protected]> wrote: >>>>>>>> >>>>>>>>> Hi Khushboo, >>>>>>>>> >>>>>>>>> Can you please review it. >>>>>>>>> >>>>>>>> I am on it. >>>>>>>> >>>>>>>>> >>>>>>>>> On Mon, Mar 30, 2020 at 2:39 PM Aditya Toshniwal < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> Hi Hackers, >>>>>>>>>> >>>>>>>>>> Attached is the patch to implement search objects functionality >>>>>>>>>> in pgadmin. >>>>>>>>>> The feature will allow a user to search for any object in a >>>>>>>>>> database. >>>>>>>>>> Highlights of the feature: >>>>>>>>>> 1) Search any object with user input text with at least 3 >>>>>>>>>> characters. >>>>>>>>>> 2) Search can be done on a specific object type by selecting from >>>>>>>>>> the types dropdown. >>>>>>>>>> 3) The search results grid will show object name, object type and >>>>>>>>>> the object path on the browser tree. On double clicking the record, it will >>>>>>>>>> locate that object on the browser tree. The columns object name and type >>>>>>>>>> are sortable. >>>>>>>>>> 4) The object nodes which are disabled (hidden) using preferences >>>>>>>>>> will not be visible in the types dropdown. However, in the case of all >>>>>>>>>> types, the search records will be visible for those types greyed out. >>>>>>>>>> 5) You can also access search objects dialog using the button on >>>>>>>>>> the browser toolbar. >>>>>>>>>> >>>>>>>>>> Python and JS test cases added. Docs updated. >>>>>>>>>> Please review. >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Thanks and Regards, >>>>>>>>>> Aditya Toshniwal >>>>>>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | >>>>>>>>>> Pune >>>>>>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> *Thanks & Regards* >>>>>>>>> *Akshay Joshi* >>>>>>>>> >>>>>>>>> *Sr. Software Architect* >>>>>>>>> *EnterpriseDB Software India Private Limited* >>>>>>>>> *Mobile: +91 976-788-8246* >>>>>>>>> >>>>>>>> >>>>>> >>>>>> -- >>>>>> Thanks and Regards, >>>>>> Aditya Toshniwal >>>>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>>>> "Don't Complain about Heat, Plant a TREE" >>>>>> >>>>> >>>> >>>> -- >>>> Thanks and Regards, >>>> Aditya Toshniwal >>>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>>> "Don't Complain about Heat, Plant a TREE" >>>> >>> >>> >>> -- >>> Thanks and Regards, >>> Aditya Toshniwal >>> pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune >>> "Don't Complain about Heat, Plant a TREE" >>> >> > > -- > Thanks and Regards, > Aditya Toshniwal > pgAdmin Hacker | Sr. Software Engineer | EnterpriseDB India | Pune > "Don't Complain about Heat, Plant a TREE" > -- *Thanks & Regards* *Akshay Joshi* *Sr. Software Architect* *EnterpriseDB Software India Private Limited* *Mobile: +91 976-788-8246* ^ permalink raw reply [nested|flat] 12+ messages in thread
end of thread, other threads:[~2020-04-06 12:33 UTC | newest] Thread overview: 12+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-03-30 09:09 [pgAdmin][RM2172] Search Objects Functionality Aditya Toshniwal <[email protected]> 2020-04-01 12:28 ` Akshay Joshi <[email protected]> 2020-04-01 12:30 ` Akshay Joshi <[email protected]> 2020-04-02 04:01 ` Khushboo Vashi <[email protected]> 2020-04-02 10:39 ` Khushboo Vashi <[email protected]> 2020-04-02 10:59 ` Aditya Toshniwal <[email protected]> 2020-04-02 11:19 ` Khushboo Vashi <[email protected]> 2020-04-02 12:24 ` Aditya Toshniwal <[email protected]> 2020-04-03 09:13 ` Aditya Toshniwal <[email protected]> 2020-04-06 09:52 ` Khushboo Vashi <[email protected]> 2020-04-06 10:21 ` Aditya Toshniwal <[email protected]> 2020-04-06 12:33 ` Akshay Joshi <[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