Updated interface definitions as per new Swagger yaml file Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/0a82d13b Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/0a82d13b Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/0a82d13b
Branch: refs/heads/feature/5.x/swagger-docs Commit: 0a82d13b19ea0f8aa3aabcd140caaf3274a8e5b4 Parents: 79af7dd Author: Kasper Sørensen <[email protected]> Authored: Mon Jun 13 22:15:34 2016 -0700 Committer: Kasper Sørensen <[email protected]> Committed: Mon Jun 13 22:15:34 2016 -0700 ---------------------------------------------------------------------- .../service/controllers/ColumnController.java | 2 +- .../controllers/DataSourceController.java | 2 +- .../service/controllers/SchemaController.java | 2 +- .../service/controllers/TableController.java | 2 +- .../controllers/TableDataController.java | 26 +- .../TenantInteractionScenarioTest.java | 4 +- service-webapp/swagger.yaml | 503 +++++++++++++++++++ 7 files changed, 526 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java index 7d6d5ff..c811def 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/ColumnController.java @@ -77,7 +77,7 @@ public class ColumnController { map.put("name", column.getName()); map.put("table", tableName); map.put("schema", schemaName); - map.put("data-context", dataSourceName); + map.put("datasource", dataSourceName); map.put("tenant", tenantName); map.put("metadata", metadata); http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java index 9c678ff..524cc09 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/DataSourceController.java @@ -82,7 +82,7 @@ public class DataSourceController { map.put("name", dataSourceName); map.put("tenant", tenantName); map.put("updateable", dataContext instanceof UpdateableDataContext); - map.put("query", UriBuilder.fromPath("/{tenant}/{dataContext}/query").build(tenantName, dataSourceName)); + map.put("query_uri", UriBuilder.fromPath("/{tenant}/{dataContext}/query").build(tenantName, dataSourceName)); map.put("schemas", schemaLinks); return map; } http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java index 6208d49..993c1d3 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/SchemaController.java @@ -72,7 +72,7 @@ public class SchemaController { final Map<String, Object> map = new LinkedHashMap<>(); map.put("type", "schema"); map.put("name", schemaName); - map.put("data-context", dataSourceName); + map.put("datasource", dataSourceName); map.put("tenant", tenantName); map.put("tables", tableLinks); return map; http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java index 4157dac..c914289 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableController.java @@ -77,7 +77,7 @@ public class TableController { map.put("type", "table"); map.put("name", tableName); map.put("schema", schemaName); - map.put("data-context", dataSourceName); + map.put("datasource", dataSourceName); map.put("tenant", tenantName); map.put("columns", columnsLinks); return map; http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java index c48d74f..bae9923 100644 --- a/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java +++ b/service-webapp/src/main/java/org/apache/metamodel/service/controllers/TableDataController.java @@ -19,13 +19,16 @@ package org.apache.metamodel.service.controllers; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.metamodel.DataContext; +import org.apache.metamodel.UpdateCallback; +import org.apache.metamodel.UpdateScript; import org.apache.metamodel.UpdateSummary; import org.apache.metamodel.UpdateableDataContext; -import org.apache.metamodel.insert.InsertInto; +import org.apache.metamodel.insert.RowInsertionBuilder; import org.apache.metamodel.query.Query; import org.apache.metamodel.schema.Table; import org.apache.metamodel.service.app.DataContextTraverser; @@ -75,7 +78,7 @@ public class TableDataController { @ResponseBody public Map<String, Object> post(@PathVariable("tenant") String tenantId, @PathVariable("dataContext") String dataSourceName, @PathVariable("schema") String schemaId, - @PathVariable("table") String tableId, @RequestBody Map<String, Object> inputMap) { + @PathVariable("table") String tableId, @RequestBody final List<Map<String, Object>> inputRecords) { final TenantContext tenantContext = tenantRegistry.getTenantContext(tenantId); final UpdateableDataContext dataContext = tenantContext.getDataSourceRegistry().openDataContextForUpdate(dataSourceName); @@ -84,13 +87,18 @@ public class TableDataController { final Table table = traverser.getTable(schemaId, tableId); - final InsertInto insert = new InsertInto(table); - for (Entry<String, Object> entry : inputMap.entrySet()) { - insert.value(entry.getKey(), entry.getValue()); - } - - final UpdateableDataContext updateableDataContext = (UpdateableDataContext) dataContext; - final UpdateSummary result = updateableDataContext.executeUpdate(insert); + final UpdateSummary result = dataContext.executeUpdate(new UpdateScript() { + @Override + public void run(UpdateCallback callback) { + for (Map<String, Object> inputMap : inputRecords) { + final RowInsertionBuilder insert = callback.insertInto(table); + for (Entry<String, Object> entry : inputMap.entrySet()) { + insert.value(entry.getKey(), entry.getValue()); + } + insert.execute(); + } + } + }); final Map<String, Object> response = new LinkedHashMap<>(); response.put("status", "ok"); http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java ---------------------------------------------------------------------- diff --git a/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java b/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java index 793f88c..5706153 100644 --- a/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java +++ b/service-webapp/src/test/java/org/apache/metamodel/service/controllers/TenantInteractionScenarioTest.java @@ -158,7 +158,7 @@ public class TenantInteractionScenarioTest { // insert into table (x2) { final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post( - "/tenant1/mydata/s/mydata/t/hello_world/d").content("{'greeting':'Howdy','who':'MetaModel'}" + "/tenant1/mydata/s/mydata/t/hello_world/d").content("[{'greeting':'Howdy','who':'MetaModel'}]" .replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect( MockMvcResultMatchers.status().isOk()).andReturn(); @@ -168,7 +168,7 @@ public class TenantInteractionScenarioTest { } { final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post( - "/tenant1/mydata/s/mydata/t/hello_world/d").content("{'greeting':'Hi','who':'Apache'}" + "/tenant1/mydata/s/mydata/t/hello_world/d").content("[{'greeting':'Hi','who':'Apache'}]" .replace('\'', '"')).contentType(MediaType.APPLICATION_JSON)).andExpect( MockMvcResultMatchers.status().isOk()).andReturn(); http://git-wip-us.apache.org/repos/asf/metamodel/blob/0a82d13b/service-webapp/swagger.yaml ---------------------------------------------------------------------- diff --git a/service-webapp/swagger.yaml b/service-webapp/swagger.yaml new file mode 100644 index 0000000..1edd47a --- /dev/null +++ b/service-webapp/swagger.yaml @@ -0,0 +1,503 @@ +swagger: '2.0' +info: + title: Apache MetaModel RESTful API + description: Delivers 'MetaModel-as-a-Service' for unified data federation. + version: "5.0.0" +produces: + - application/json +paths: + /: + get: + summary: Hello MetaModel + description: An endpoint that provides a confirmation that the system is operational + responses: + 200: + description: The system is operational + schema: + type: object + properties: + ping: + type: string + description: Should return 'pong!' when the system is operational + application: + type: string + description: The name of the application running (Apache MetaModel) + version: + type: string + description: The version of the application running + server-time: + type: object + properties: + timestamp: + type: integer + format: int64 + description: The server-time in timestamp format (millis since 1st of January 1970) + iso8601: + type: string + description: The server-time in ISO-8601 format + canonical-hostname: + type: string + description: The canonical hostname of the server + /{tenant}: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + put: + summary: Create new tenant + responses: + 200: + description: Tenant created + schema: + properties: + type: + type: string + description: The type of entity (tenant) + name: + type: string + description: The tenant name/identifier + 409: + description: Tenant already exist + schema: + $ref: "#/definitions/error" + get: + summary: Get tenant information + description: Provides basic information about a tenant of the system + responses: + 404: + description: Tenant not found + schema: + $ref: "#/definitions/error" + 200: + description: Tenant found + schema: + type: object + properties: + type: + type: string + description: The type of entity (tenant) + name: + type: string + description: The tenant name/identifier + datasources: + type: array + items: + type: object + properties: + name: + type: string + description: The name of the datasource + uri: + type: string + format: uri + description: A link to the datasource information + delete: + summary: Delete tenant + description: Deletes a tenant from the system + responses: + 200: + description: Tenant deleted + schema: + type: object + properties: + type: + type: string + description: The type of entity (tenant) + name: + type: string + description: The tenant name/identifier + 404: + description: Tenant not found + schema: + $ref: "#/definitions/error" + /{tenant}/{datasource}: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + - name: datasource + in: path + type: string + description: The datasource name + required: true + get: + responses: + 200: + description: Datasource found + schema: + type: object + properties: + type: + type: string + description: The type of entity (datasource) + name: + type: string + description: The datasource name + tenant: + type: string + description: The tenant name + updateable: + type: boolean + description: Is this datasource updateable? + query_uri: + type: string + description: A link to the query endpoint for this datasource + format: uri + schemas: + type: array + description: The schemas of this datasource + items: + type: object + properties: + name: + type: string + description: The schema name + uri: + type: string + description: A link to the schema information + format: uri + 404: + description: Datasource not found + schema: + $ref: "#/definitions/error" + /{tenant}/{datasource}/q: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + - name: datasource + in: path + type: string + description: The datasource name + required: true + get: + description: Executes a query on the datasource + parameters: + - name: sql + in: query + type: string + description: The MetaModel-flavoured SQL query to execute + required: true + - name: offset + in: query + type: string + description: An offset / first-row flag to set on the query + required: false + - name: limit + in: query + type: string + description: A limit / max-rows flag to set on the query + required: false + responses: + 200: + description: Query executed + schema: + $ref: "#/definitions/queryResponse" + 400: + description: Failure while parsing query + schema: + $ref: "#/definitions/error" + 404: + description: Datasource not found + schema: + $ref: "#/definitions/error" + 500: + description: Failure while executing query + schema: + $ref: "#/definitions/error" + /{tenant}/{datasource}/s/{schema}: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + - name: datasource + in: path + type: string + description: The datasource name + required: true + - name: schema + in: path + type: string + description: The schema name + required: true + get: + responses: + 200: + description: Schema found + schema: + type: object + properties: + type: + type: string + description: The type of entity (schema) + name: + type: string + description: The schema name + datasource: + type: string + description: The datasource name + tables: + type: array + description: The names of the schema's tables + items: + type: object + properties: + name: + type: string + description: The table name + uri: + type: string + description: A link to the table information + format: uri + 404: + description: Schema not found + schema: + $ref: "#/definitions/error" + /{tenant}/{datasource}/s/{schema}/t/{table}: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + - name: datasource + in: path + type: string + description: The datasource name + required: true + - name: schema + in: path + type: string + description: The schema name + required: true + - name: table + in: path + type: string + description: The table name + required: true + get: + responses: + 200: + description: Table found + schema: + type: object + properties: + type: + type: string + description: The type of entity (table) + name: + type: string + description: The table name + schema: + type: string + description: The schema name + datasource: + type: string + description: The datasource name + tenant: + type: string + description: The tenant name + columns: + type: array + description: The names of the table's columns + items: + type: object + properties: + name: + type: string + description: The column name + uri: + type: string + description: A link to the column information + format: uri + 404: + description: Table not found + schema: + $ref: "#/definitions/error" + /{tenant}/{datasource}/s/{schema}/t/{table}/d: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + - name: datasource + in: path + type: string + description: The datasource name + required: true + - name: schema + in: path + type: string + description: The schema name + required: true + - name: table + in: path + type: string + description: The table name + required: true + get: + description: Gets the data of the table + responses: + 200: + description: Query executed + schema: + $ref: "#/definitions/queryResponse" + 400: + description: Failure while parsing query + schema: + $ref: "#/definitions/error" + 404: + description: Table not found + schema: + $ref: "#/definitions/error" + 500: + description: Failure while executing query + schema: + $ref: "#/definitions/error" + post: + description: Inserts data to the table + parameters: + - name: inputData + in: body + description: The data to insert + required: true + schema: + type: array + items: + description: A record to insert where each key is expected to match a column name and each value is the value to put. + type: object + responses: + 200: + description: Data inserted + #TODO + 404: + description: Table not found + schema: + $ref: "#/definitions/error" + /{tenant}/{datasource}/s/{schema}/t/{table}/c/{column}: + parameters: + - name: tenant + in: path + type: string + description: The tenant name + required: true + - name: datasource + in: path + type: string + description: The datasource name + required: true + - name: schema + in: path + type: string + description: The schema name + required: true + - name: table + in: path + type: string + description: The table name + required: true + - name: column + in: path + type: string + description: The column name + required: true + get: + description: Gets information about a column + responses: + 200: + description: Query executed + schema: + type: object + properties: + type: + type: string + description: The type of entity (column) + name: + type: string + description: The column name + table: + type: string + description: The table name + schema: + type: string + description: The schema name + datasource: + type: string + description: The datasource name + tenant: + type: string + description: The tenant name + metadata: + type: object + description: Metadata about the column + properties: + number: + type: integer + description: The column number (0-based) + size: + type: integer + description: The column size + nullable: + type: boolean + description: Is the column nullable? + primary-key: + type: boolean + description: Is the column a primary key? + indexed: + type: boolean + description: Is the column indexed? + column-type: + type: string + description: The column type (as interpreted/adapted by Apache MetaModel) + native-type: + type: string + description: The native column type (as defined by the datasource itself) + remarks: + type: string + description: Any remarks on the column + 404: + description: Column not found + schema: + $ref: "#/definitions/error" +definitions: + queryResponse: + description: Represents the result of a query - a dataset + type: object + properties: + type: + type: string + description: The type of entity (dataset) + headers: + type: array + description: The dataset header names + items: + type: string + data: + type: array + description: The actual data returned by the query + items: + type: array + items: + type: object + error: + description: Elaborates the error that occurred + type: object + properties: + code: + type: integer + description: The HTTP status code + message: + type: string + description: A humanly readable error message + additional_details: + type: object + description: Any auxilary details to further elaborate the error
