diff --git a/lib/ecto_psql_extras.ex b/lib/ecto_psql_extras.ex index 3641a99..2844dda 100644 --- a/lib/ecto_psql_extras.ex +++ b/lib/ecto_psql_extras.ex @@ -6,6 +6,14 @@ defmodule EctoPSQLExtras do @callback info :: %{ required(:title) => binary, required(:columns) => [%{name: atom, type: atom}], + required(:parameters) => [ + %{ + required(:name) => atom, + required(:type) => atom, + optional(:default) => term, + optional(:description) => binary + } + ], optional(:order_by) => [{atom, :asc | :desc}], optional(:index) => integer, optional(:default_args) => list, diff --git a/lib/queries/all_locks.ex b/lib/queries/all_locks.ex index 43ae9cd..b024d94 100644 --- a/lib/queries/all_locks.ex +++ b/lib/queries/all_locks.ex @@ -13,7 +13,8 @@ defmodule EctoPSQLExtras.AllLocks do %{name: :query_snippet, type: :string}, %{name: :mode, type: :string}, %{name: :age, type: :interval} - ] + ], + parameters: [] } end diff --git a/lib/queries/bloat.ex b/lib/queries/bloat.ex index 6925d75..146f758 100644 --- a/lib/queries/bloat.ex +++ b/lib/queries/bloat.ex @@ -12,7 +12,8 @@ defmodule EctoPSQLExtras.Bloat do %{name: :object_name, type: :string}, %{name: :bloat, type: :numeric}, %{name: :waste, type: :bytes} - ] + ], + parameters: [] } end diff --git a/lib/queries/blocking.ex b/lib/queries/blocking.ex index 699884f..f17f570 100644 --- a/lib/queries/blocking.ex +++ b/lib/queries/blocking.ex @@ -12,7 +12,8 @@ defmodule EctoPSQLExtras.Blocking do %{name: :blocking_pid, type: :integer}, %{name: :blocked_statement, type: :string}, %{name: :blocked_duration, type: :interval} - ] + ], + parameters: [] } end diff --git a/lib/queries/cache_hit.ex b/lib/queries/cache_hit.ex index 9805f6b..6824af1 100644 --- a/lib/queries/cache_hit.ex +++ b/lib/queries/cache_hit.ex @@ -8,7 +8,8 @@ defmodule EctoPSQLExtras.CacheHit do columns: [ %{name: :name, type: :string}, %{name: :ratio, type: :numeric} - ] + ], + parameters: [] } end diff --git a/lib/queries/calls.ex b/lib/queries/calls.ex index a80669c..0df20a7 100644 --- a/lib/queries/calls.ex +++ b/lib/queries/calls.ex @@ -13,6 +13,14 @@ defmodule EctoPSQLExtras.Calls do %{name: :prop_exec_time, type: :percent}, %{name: :calls, type: :integer}, %{name: :sync_io_time, type: :interval} + ], + parameters: [ + %{ + name: :limit, + type: :integer, + default: 10, + description: "Maximum queries to return." + } ] } end diff --git a/lib/queries/calls_17.ex b/lib/queries/calls_17.ex index b0b7ddf..a7d290d 100644 --- a/lib/queries/calls_17.ex +++ b/lib/queries/calls_17.ex @@ -13,6 +13,14 @@ defmodule EctoPSQLExtras.Calls17 do %{name: :prop_exec_time, type: :percent}, %{name: :calls, type: :integer}, %{name: :sync_io_time, type: :interval} + ], + parameters: [ + %{ + name: :limit, + type: :integer, + default: 10, + description: "Maximum queries to return." + } ] } end diff --git a/lib/queries/calls_legacy.ex b/lib/queries/calls_legacy.ex index 502a628..94d5856 100644 --- a/lib/queries/calls_legacy.ex +++ b/lib/queries/calls_legacy.ex @@ -12,6 +12,14 @@ defmodule EctoPSQLExtras.CallsLegacy do %{name: :prop_exec_time, type: :percent}, %{name: :calls, type: :integer}, %{name: :sync_io_time, type: :interval} + ], + parameters: [ + %{ + name: :limit, + type: :integer, + default: 10, + description: "Maximum queries to return." + } ] } end diff --git a/lib/queries/connections.ex b/lib/queries/connections.ex index 6b01ea5..c86b3de 100644 --- a/lib/queries/connections.ex +++ b/lib/queries/connections.ex @@ -8,7 +8,8 @@ defmodule EctoPSQLExtras.Connections do %{name: :username, type: :string}, %{name: :client_address, type: :string}, %{name: :application_name, type: :string} - ] + ], + parameters: [] } end diff --git a/lib/queries/db_settings.ex b/lib/queries/db_settings.ex index 5629583..b3a7792 100644 --- a/lib/queries/db_settings.ex +++ b/lib/queries/db_settings.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.DbSettings do %{name: :setting, type: :string}, %{name: :unit, type: :string}, %{name: :short_desc, type: :string} - ] + ], + parameters: [] } end diff --git a/lib/queries/diagnose.ex b/lib/queries/diagnose.ex index 31015ef..4a84057 100644 --- a/lib/queries/diagnose.ex +++ b/lib/queries/diagnose.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.Diagnose do %{name: :ok, type: :boolean}, %{name: :check_name, type: :string}, %{name: :message, type: :string} - ] + ], + parameters: [] } end diff --git a/lib/queries/duplicate_indexes.ex b/lib/queries/duplicate_indexes.ex index 4ed7dc1..9681a88 100644 --- a/lib/queries/duplicate_indexes.ex +++ b/lib/queries/duplicate_indexes.ex @@ -12,7 +12,8 @@ defmodule EctoPSQLExtras.DuplicateIndexes do %{name: :idx2, type: :string}, %{name: :idx3, type: :string}, %{name: :idx4, type: :string} - ] + ], + parameters: [] } end diff --git a/lib/queries/extensions.ex b/lib/queries/extensions.ex index ec1a6f2..a00e0ac 100644 --- a/lib/queries/extensions.ex +++ b/lib/queries/extensions.ex @@ -11,7 +11,8 @@ defmodule EctoPSQLExtras.Extensions do %{name: :default_version, type: :string}, %{name: :installed_version, type: :string}, %{name: :comment, type: :string} - ] + ], + parameters: [] } end diff --git a/lib/queries/index_cache_hit.ex b/lib/queries/index_cache_hit.ex index 6ffb964..2432ea9 100644 --- a/lib/queries/index_cache_hit.ex +++ b/lib/queries/index_cache_hit.ex @@ -13,7 +13,8 @@ defmodule EctoPSQLExtras.IndexCacheHit do %{name: :block_reads, type: :integer}, %{name: :total_read, type: :integer}, %{name: :ratio, type: :numeric} - ] + ], + parameters: [] } end diff --git a/lib/queries/index_size.ex b/lib/queries/index_size.ex index 61834f3..ed9d4e5 100644 --- a/lib/queries/index_size.ex +++ b/lib/queries/index_size.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.IndexSize do %{name: :schema, type: :string}, %{name: :name, type: :string}, %{name: :size, type: :bytes} - ] + ], + parameters: [] } end diff --git a/lib/queries/index_usage.ex b/lib/queries/index_usage.ex index 36ef701..f0c2573 100644 --- a/lib/queries/index_usage.ex +++ b/lib/queries/index_usage.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.IndexUsage do %{name: :name, type: :string}, %{name: :percent_of_times_index_used, type: :numeric}, %{name: :rows_in_table, type: :int} - ] + ], + parameters: [] } end diff --git a/lib/queries/indexes.ex b/lib/queries/indexes.ex index b0ef27b..3abc299 100644 --- a/lib/queries/indexes.ex +++ b/lib/queries/indexes.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.Indexes do %{name: :indexname, type: :string}, %{name: :tablename, type: :string}, %{name: :columns, type: :string} - ] + ], + parameters: [] } end diff --git a/lib/queries/kill_all.ex b/lib/queries/kill_all.ex index 5a306fa..f02b423 100644 --- a/lib/queries/kill_all.ex +++ b/lib/queries/kill_all.ex @@ -6,7 +6,8 @@ defmodule EctoPSQLExtras.KillAll do title: "Kill all the active database connections", columns: [ %{name: :killed, type: :boolean} - ] + ], + parameters: [] } end diff --git a/lib/queries/locks.ex b/lib/queries/locks.ex index f5f3fa2..9e123a0 100644 --- a/lib/queries/locks.ex +++ b/lib/queries/locks.ex @@ -13,7 +13,8 @@ defmodule EctoPSQLExtras.Locks do %{name: :query_snippet, type: :string}, %{name: :mode, type: :string}, %{name: :age, type: :interval} - ] + ], + parameters: [] } end diff --git a/lib/queries/long_running_queries.ex b/lib/queries/long_running_queries.ex index 8585d13..bba64ff 100644 --- a/lib/queries/long_running_queries.ex +++ b/lib/queries/long_running_queries.ex @@ -11,6 +11,14 @@ defmodule EctoPSQLExtras.LongRunningQueries do %{name: :pid, type: :int}, %{name: :duration, type: :interval}, %{name: :query, type: :string} + ], + parameters: [ + %{ + name: :threshold, + type: :string, + default: "500 milliseconds", + description: "Minimum query duration." + } ] } end diff --git a/lib/queries/null_indexes.ex b/lib/queries/null_indexes.ex index 8db7768..ab4fa16 100644 --- a/lib/queries/null_indexes.ex +++ b/lib/queries/null_indexes.ex @@ -14,6 +14,14 @@ defmodule EctoPSQLExtras.NullIndexes do %{name: :indexed_column, type: :string}, %{name: :null_frac, type: :string}, %{name: :expected_saving, type: :string} + ], + parameters: [ + %{ + name: :min_relation_size_mb, + type: :integer, + default: 0, + description: "Minimum relation size in megabytes." + } ] } end diff --git a/lib/queries/outliers.ex b/lib/queries/outliers.ex index 9d11067..6f32c78 100644 --- a/lib/queries/outliers.ex +++ b/lib/queries/outliers.ex @@ -13,6 +13,14 @@ defmodule EctoPSQLExtras.Outliers do %{name: :prop_exec_time, type: :percent}, %{name: :calls, type: :integer}, %{name: :sync_io_time, type: :interval} + ], + parameters: [ + %{ + name: :limit, + type: :integer, + default: 10, + description: "Maximum queries to return." + } ] } end diff --git a/lib/queries/outliers_17.ex b/lib/queries/outliers_17.ex index a6bd8ab..a12a682 100644 --- a/lib/queries/outliers_17.ex +++ b/lib/queries/outliers_17.ex @@ -13,6 +13,14 @@ defmodule EctoPSQLExtras.Outliers17 do %{name: :prop_exec_time, type: :percent}, %{name: :calls, type: :integer}, %{name: :sync_io_time, type: :interval} + ], + parameters: [ + %{ + name: :limit, + type: :integer, + default: 10, + description: "Maximum queries to return." + } ] } end diff --git a/lib/queries/outliers_legacy.ex b/lib/queries/outliers_legacy.ex index 6e51426..b7f16f2 100644 --- a/lib/queries/outliers_legacy.ex +++ b/lib/queries/outliers_legacy.ex @@ -13,6 +13,14 @@ defmodule EctoPSQLExtras.OutliersLegacy do %{name: :prop_exec_time, type: :percent}, %{name: :calls, type: :integer}, %{name: :sync_io_time, type: :interval} + ], + parameters: [ + %{ + name: :limit, + type: :integer, + default: 10, + description: "Maximum queries to return." + } ] } end diff --git a/lib/queries/records_rank.ex b/lib/queries/records_rank.ex index de09523..8b6c382 100644 --- a/lib/queries/records_rank.ex +++ b/lib/queries/records_rank.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.RecordsRank do %{name: :schema, type: :string}, %{name: :name, type: :string}, %{name: :estimated_count, type: :integer} - ] + ], + parameters: [] } end diff --git a/lib/queries/seq_scans.ex b/lib/queries/seq_scans.ex index bb612d7..af126fd 100644 --- a/lib/queries/seq_scans.ex +++ b/lib/queries/seq_scans.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.SeqScans do %{name: :schema, type: :string}, %{name: :name, type: :string}, %{name: :count, type: :integer} - ] + ], + parameters: [] } end diff --git a/lib/queries/ssl_used.ex b/lib/queries/ssl_used.ex index f0a1bd3..ae4fdcf 100644 --- a/lib/queries/ssl_used.ex +++ b/lib/queries/ssl_used.ex @@ -7,7 +7,8 @@ defmodule EctoPSQLExtras.SSLUsed do index: 9, columns: [ %{name: :ssl_is_used, type: :boolean} - ] + ], + parameters: [] } end diff --git a/lib/queries/table_cache_hit.ex b/lib/queries/table_cache_hit.ex index db63d81..e4d950a 100644 --- a/lib/queries/table_cache_hit.ex +++ b/lib/queries/table_cache_hit.ex @@ -13,7 +13,8 @@ defmodule EctoPSQLExtras.TableCacheHit do %{name: :block_reads, type: :integer}, %{name: :total_read, type: :integer}, %{name: :ratio, type: :numeric} - ] + ], + parameters: [] } end diff --git a/lib/queries/table_foreign_keys.ex b/lib/queries/table_foreign_keys.ex index 0ffd452..9b9f145 100644 --- a/lib/queries/table_foreign_keys.ex +++ b/lib/queries/table_foreign_keys.ex @@ -4,12 +4,20 @@ defmodule EctoPSQLExtras.TableForeignKeys do def info do %{ title: "Foreign keys info", + default_args: [table_name: nil], columns: [ %{name: :table_name, type: :string}, %{name: :constraint_name, type: :string}, %{name: :column_name, type: :string}, %{name: :foreign_table_name, type: :string}, %{name: :foreign_column_name, type: :string} + ], + parameters: [ + %{ + name: :table_name, + type: :string, + description: "Filter foreign keys by table name. Omit to search all tables." + } ] } end diff --git a/lib/queries/table_indexes_size.ex b/lib/queries/table_indexes_size.ex index 49df2fa..76285d2 100644 --- a/lib/queries/table_indexes_size.ex +++ b/lib/queries/table_indexes_size.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.TableIndexesSize do %{name: :schema, type: :string}, %{name: :table, type: :string}, %{name: :index_size, type: :bytes} - ] + ], + parameters: [] } end diff --git a/lib/queries/table_schema.ex b/lib/queries/table_schema.ex index 9c152e7..775cf2c 100644 --- a/lib/queries/table_schema.ex +++ b/lib/queries/table_schema.ex @@ -4,12 +4,20 @@ defmodule EctoPSQLExtras.TableSchema do def info do %{ title: "Column names and types", + default_args: [table_name: nil], columns: [ %{name: :column_name, type: :string}, %{name: :data_type, type: :string}, %{name: :is_nullable, type: :boolean}, %{name: :column_default, type: :string}, %{name: :table_name, type: :string} + ], + parameters: [ + %{ + name: :table_name, + type: :string, + description: "Filter results by table name. Omit to search all tables." + } ] } end diff --git a/lib/queries/table_size.ex b/lib/queries/table_size.ex index cb6ccdc..a1c221c 100644 --- a/lib/queries/table_size.ex +++ b/lib/queries/table_size.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.TableSize do %{name: :schema, type: :string}, %{name: :name, type: :string}, %{name: :size, type: :bytes} - ] + ], + parameters: [] } end diff --git a/lib/queries/total_index_size.ex b/lib/queries/total_index_size.ex index 487dd3d..1c9f8fa 100644 --- a/lib/queries/total_index_size.ex +++ b/lib/queries/total_index_size.ex @@ -7,7 +7,8 @@ defmodule EctoPSQLExtras.TotalIndexSize do index: 13, columns: [ %{name: :size, type: :bytes} - ] + ], + parameters: [] } end diff --git a/lib/queries/total_table_size.ex b/lib/queries/total_table_size.ex index cc7f230..5f9c10b 100644 --- a/lib/queries/total_table_size.ex +++ b/lib/queries/total_table_size.ex @@ -10,7 +10,8 @@ defmodule EctoPSQLExtras.TotalTableSize do %{name: :schema, type: :string}, %{name: :name, type: :string}, %{name: :size, type: :bytes} - ] + ], + parameters: [] } end diff --git a/lib/queries/unused_indexes.ex b/lib/queries/unused_indexes.ex index a883db4..9715fb5 100644 --- a/lib/queries/unused_indexes.ex +++ b/lib/queries/unused_indexes.ex @@ -12,6 +12,14 @@ defmodule EctoPSQLExtras.UnusedIndexes do %{name: :index, type: :string}, %{name: :index_size, type: :bytes}, %{name: :index_scans, type: :integer} + ], + parameters: [ + %{ + name: :min_scans, + type: :integer, + default: 50, + description: "Filter results with at least this many scans." + } ] } end diff --git a/lib/queries/vacuum_stats.ex b/lib/queries/vacuum_stats.ex index 56379e1..bce996b 100644 --- a/lib/queries/vacuum_stats.ex +++ b/lib/queries/vacuum_stats.ex @@ -14,7 +14,8 @@ defmodule EctoPSQLExtras.VacuumStats do %{name: :dead_rowcount, type: :string}, %{name: :autovacuum_threshold, type: :string}, %{name: :expect_autovacuum, type: :string} - ] + ], + parameters: [] } end diff --git a/test/ecto_psql_extras_test.exs b/test/ecto_psql_extras_test.exs index 9ded40d..edfb391 100644 --- a/test/ecto_psql_extras_test.exs +++ b/test/ecto_psql_extras_test.exs @@ -27,6 +27,14 @@ defmodule EctoPSQLExtrasTest do assert column.type end + assert is_list(info.parameters) + + for parameter <- info.parameters do + assert is_atom(parameter.name) + assert is_atom(parameter.type) + assert Map.keys(parameter) -- [:name, :type, :default, :description] == [] + end + for {order_by, dir} <- info[:order_by] || [] do assert dir in [:asc, :desc] assert Enum.find(info.columns, &(&1.name == order_by))