Skip to content
Snippets Groups Projects
Commit 196ba061 authored by Allen Gilliland's avatar Allen Gilliland
Browse files

Merge pull request #932 from metabase/database_metadata_endpoint

Database metabase endpoint
parents e652397f 87f87a69
No related branches found
No related tags found
No related merge requests found
......@@ -83,6 +83,14 @@
(write-check Database id)
(cascade-delete Database :id id))
(defendpoint GET "/:id/metadata"
"Get metadata about a `Database`, including all of its `Tables` and `Fields`.
Returns DB, fields, field FKs, and field values."
[id]
(->404 (Database id)
read-check
(hydrate [:tables [:fields :target :values]])))
(defendpoint GET "/:id/autocomplete_suggestions"
"Return a list of autocomplete suggestions for a given PREFIX.
This is intened for use with the ACE Editor when the User is typing raw SQL.
......
......@@ -2,7 +2,8 @@
(:require [korma.core :refer :all, :exclude [defentity update]]
[metabase.api.common :refer [*current-user*]]
[metabase.db :refer :all]
[metabase.models.interface :refer :all]))
[metabase.models.interface :refer :all]
[metabase.util :as u]))
(defrecord DatabaseInstance []
;; preserve normal IFn behavior so things like ((sel :one Database) :id) work correctly
......@@ -24,8 +25,10 @@
(types :details :json, :engine :keyword)
timestamped]
(post-select [_ db]
(map->DatabaseInstance db))
(post-select [_ {:keys [id] :as database}]
(map->DatabaseInstance
(u/assoc* database
:tables (delay (sel :many 'metabase.models.table/Table :db_id id :active true (order :display_name :ASC))))))
(pre-cascade-delete [_ {:keys [id] :as database}]
(cascade-delete 'metabase.models.table/Table :db_id id)))
......
......@@ -4,7 +4,7 @@
[metabase.db :refer :all]
(metabase.models [common :as common]
[database :refer [Database]]
[field-values :refer [field-should-have-field-values? create-field-values-if-needed]]
[field-values :refer [FieldValues field-should-have-field-values? create-field-values-if-needed]]
[foreign-key :refer [ForeignKey]]
[hydrate :refer [hydrate]]
[interface :refer :all])
......@@ -91,7 +91,7 @@
(contains? field :special_type))
(create-field-values-if-needed (sel :one [this :id :table_id :base_type :special_type :field_type] :id id))))
(post-select [this {:keys [table_id parent_id] :as field}]
(post-select [this {:keys [id table_id parent_id] :as field}]
(map->FieldInstance
(u/assoc* field
:table (delay (sel :one 'metabase.models.table/Table :id table_id))
......@@ -100,6 +100,7 @@
:parent (when parent_id
(delay (this parent_id)))
:children (delay (sel :many this :parent_id (:id field)))
:values (delay (sel :many [FieldValues :field_id :values] :field_id id))
:qualified-name-components (delay (qualified-name-components <>))
:qualified-name (delay (apply str (interpose "." @(:qualified-name-components <>)))))))
......
......@@ -4,6 +4,7 @@
[metabase.driver :as driver]
[metabase.driver.mongo.test-data :as mongo-test-data]
(metabase.models [database :refer [Database]]
[field :refer [Field]]
[table :refer [Table]])
[metabase.test.data :refer :all]
(metabase.test.data [datasets :as datasets]
......@@ -153,6 +154,70 @@
(set ((user->client :rasta) :get 200 "meta/db")))))
;; ## GET /api/meta/table/:id/query_metadata
;; TODO - add in example with Field :values
(expect
(match-$ (db)
{:created_at $
:engine "h2"
:id $
:updated_at $
:name "Test Database"
:organization_id nil
:description nil
:tables [(match-$ (Table (id :categories))
{:description nil
:entity_type nil
:visibility_type nil
:name "CATEGORIES"
:display_name "Categories"
:fields [(match-$ (Field (id :categories :id))
{:description nil
:table_id (id :categories)
:special_type "id"
:name "ID"
:display_name "Id"
:updated_at $
:active true
:id $
:field_type "info"
:position 0
:target nil
:preview_display true
:created_at $
:base_type "BigIntegerField"
:parent_id nil
:parent nil
:values []})
(match-$ (Field (id :categories :name))
{:description nil
:table_id (id :categories)
:special_type "name"
:name "NAME"
:display_name "Name"
:updated_at $
:active true
:id $
:field_type "info"
:position 0
:target nil
:preview_display true
:created_at $
:base_type "TextField"
:parent_id nil
:parent nil
:values []})]
:rows 75
:updated_at $
:entity_name nil
:active true
:id (id :categories)
:db_id (db-id)
:created_at $})]})
(let [resp ((user->client :rasta) :get 200 (format "meta/db/%d/metadata" (db-id)))]
(assoc resp :tables (filter #(= "CATEGORIES" (:name %)) (:tables resp)))))
;; # DB TABLES ENDPOINTS
;; ## GET /api/meta/db/:id/tables
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment