diff --git a/README.md b/README.md index 5515d756..8aab02f3 100644 --- a/README.md +++ b/README.md @@ -2383,6 +2383,34 @@ Expects the following parameters: Returns [`Promise`](#body) +#### `dataSources.getTables(conn, name, options)` + +Retrieve tables + +Expects the following parameters: + +- conn ([`Connection`](#connection)) + +- name (`string`) + +- options (`object`) + +Returns [`Promise`](#body) + +#### `dataSources.getTableMetadata(conn, name, options)` + +Retrieve the named table metadata + +Expects the following parameters: + +- conn ([`Connection`](#connection)) + +- name (`string`) + +- options (`object`) + +Returns [`Promise`](#body) + #### DataSourceQuery One of the following values: diff --git a/lib/dataSources.js b/lib/dataSources.js index 122f93b1..44fb67d1 100644 --- a/lib/dataSources.js +++ b/lib/dataSources.js @@ -110,6 +110,38 @@ const getMetadata = (conn, name, opts = {}) => { }).then(httpBody); }; +const getTableMetadata = (conn, dsName, opts) => { + const headers = conn.headers(); + headers.set('Accept', opts.accept || 'text/turtle'); + headers.set('Content-Type', 'application/json'); + const body = { + table_name: opts.table_name, + table_type: opts.table_type, + }; + if (opts.catalog) { + body.catalog = opts.catalog; + } + if (opts.schema) { + body.schema = opts.schema; + } + + return fetch( + conn.request('admin', 'data_sources', dsName, 'table_metadata'), + { + method: 'POST', + body: JSON.stringify(body), + headers, + } + ).then(httpBody); +}; + +const getTables = (conn, name) => { + const headers = conn.headers(); + return fetch(conn.request('admin', 'data_sources', name, 'tables'), { + headers, + }).then(httpBody); +}; + const updateMetadata = (conn, name, metadata, opts = {}) => { const headers = conn.headers(); headers.set('Content-Type', opts.contentType || 'text/turtle'); @@ -197,6 +229,8 @@ module.exports = { add, available, getMetadata, + getTableMetadata, + getTables, info, list, listInfo, diff --git a/lib/index.d.ts b/lib/index.d.ts index f2ae5ba8..f904c242 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -1537,6 +1537,24 @@ declare namespace Stardog { */ function updateMetadata(conn: Connection, name: string, metadata: T, options?: object): Promise; + /** + * Retrieve tables + * + * @param {Connection} conn the Stardog server connection + * @param {string} name the data source name + * @param {object} options additional options if needed + */ + function getTables(conn: Connection, name: string, options: object): Promise; + + /** + * Retrieve the named table metadata + * + * @param {Connection} conn the Stardog server connection + * @param {string} name the table name + * @param {object} options additional options if needed + */ + function getTableMetadata(conn: Connection, name: string, options: object): Promise; + type DataSourceQuery = string | { query: string, options: object }; /** diff --git a/test/dataSources.spec.js b/test/dataSources.spec.js index 0a574c39..e8ecd3b5 100644 --- a/test/dataSources.spec.js +++ b/test/dataSources.spec.js @@ -10,6 +10,16 @@ const dataSourceMetadata = fs.readFileSync( 'utf8' ); +const dataSourceTables = fs.readFileSync( + path.resolve(`${__dirname}/fixtures/data_source_tables.json`), + 'utf8' +); + +const dataSourceTableMetadata = fs.readFileSync( + path.resolve(`${__dirname}/fixtures/data_source_table_metadata.ttl`), + 'utf8' +); + describe('data_sources', () => { let conn; const aDSName = 'MyDataSource'; @@ -142,6 +152,33 @@ describe('data_sources', () => { })); }); + describe('getTables', () => { + it('returns the tables for a data source', () => + assureExists() + .then(() => dataSources.getTables(conn, aDSName)) + .then(res => { + expect(res.status).toBe(200); + expect(res.body).toEqual(dataSourceTables); + })); + }); + + describe('getTableMetadata', () => { + it('returns the metadata of a table', () => + assureExists() + .then(() => + dataSources.getTableMetadata(conn, aDSName, { + table_name: 'table-name', + table_type: 'TABLE', + catalog: 'catalog', + schema: 'schema', + }) + ) + .then(res => { + expect(res.status).toBe(200); + expect(res.body).toEqual(dataSourceTableMetadata); + })); + }); + describe('updateMetadata', () => { it('updates the metadata of a data source', () => assureExists() diff --git a/test/fixtures/data_source_table_metadata.ttl b/test/fixtures/data_source_table_metadata.ttl new file mode 100644 index 00000000..97995480 --- /dev/null +++ b/test/fixtures/data_source_table_metadata.ttl @@ -0,0 +1,92 @@ +@prefix tbl: . +@prefix sqlcase: . +@prefix sdialect: . +@prefix : . +@prefix tbldef: . +@prefix jdbcmd: . +@prefix dc: . +@prefix ds: . +@prefix prov: . +@prefix coldef: . +@prefix skos: . +@prefix swrl: . +@prefix sh: . +@prefix qt: . +@prefix jdbcds: . +@prefix stardog: . +@prefix xsd: . +@prefix md: . +@prefix rdf: . +@prefix swrlb: . +@prefix so: . +@prefix col: . +@prefix sqldbprd: . +@prefix qtdef: . +@prefix sqlnullc: . +@prefix tblmd: . +@prefix rdfs: . +@prefix tbltype: . +@prefix sqldb: . +@prefix dialect: . +@prefix owl: . +@prefix reg: . +@prefix foaf: . + + +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 col:columnDataType "12"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:primaryKey "0"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 col:columnDecimalDigits "6"^^xsd:int . + tblmd:indexedColumn . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:column coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 col:columnDecimalDigits "0"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 col:columnName "last_update" ; + col:columnTypeString "timestamp" . + col:uniqueKey "0"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C3 col:columnTypeString "varchar" . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor col:uniqueKeySet ; + tblmd:rowCount 2.0E2 . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 col:columnNullability false . + tblmd:indexOrdinalPosition "0"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 col:columnOrdinalPosition "4"^^xsd:int . + tblmd:indexCardinality 2.0E2 . + tblmd:isUnique false . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 col:columnSize "10"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:column coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 col:columnDecimalDigits "0"^^xsd:int . + tblmd:isUnique true ; + tblmd:indexName "actor_pkey" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 col:columnSize "29"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 col:columnOrdinalPosition "2"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:hasIndex ; + qt:tableType tbltype:TABLE ; + qt:tableName "actor" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C3 col:columnNullability false ; + col:columnName "last_name" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C4 col:columnDataType "93"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:column coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C3 . + tblmd:indexColumnId "0"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor qt:schema "public" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 col:columnName "actor_id" . + tblmd:indexType "3" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 col:columnName "first_name" ; + col:columnSize "45"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:hasIndex . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 col:columnNullability false . + tblmd:indexName "idx_actor_last_name" . + tblmd:indexColumnId "2"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C3 col:columnOrdinalPosition "3"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 col:columnTypeString "serial" ; + col:columnDataType "4"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C3 col:columnDataType "12"^^xsd:int ; + col:columnDecimalDigits "0"^^xsd:int . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:column coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 . + tblmd:indexedColumn . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor qt:catalog "dvdrental" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C2 col:columnTypeString "varchar" . + tblmd:indexType "3" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C3 col:columnSize "45"^^xsd:int . + tblmd:indexOrdinalPosition "0"^^xsd:int . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 col:columnOrdinalPosition "1"^^xsd:int . + tblmd:indexCardinality 2.0E2 . +tbldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor tblmd:dataSourceName "aaatest" . +coldef:aaatest%5CTABLE%5Cdvdrental%5Cpublic%5Cactor%5C1 col:columnNullability false . \ No newline at end of file diff --git a/test/fixtures/data_source_tables.json b/test/fixtures/data_source_tables.json new file mode 100644 index 00000000..ca4a0222 --- /dev/null +++ b/test/fixtures/data_source_tables.json @@ -0,0 +1,20 @@ +[ + { + "catalog": "dvdrental", + "schema": "public", + "table_name": "actor", + "table_type": "TABLE" + }, + { + "catalog": "dvdrental", + "schema": "public", + "table_name": "actor_actor_id_seq", + "table_type": "SEQUENCE" + }, + { + "catalog": "dvdrental", + "schema": "public", + "table_name": "actor_info", + "table_type": "VIEW" + }, +] \ No newline at end of file