const output_mysql : type_output = { "render": function (input_data) { return ( input_data["domains"] .map( (domain) => lib_plankton.string.coin( "CREATE TABLE\n\t`{{name}}`(\n{{entries}}\n\t){{comment}}\n;", { "name": domain["name"], "comment": ( ( ! domain.hasOwnProperty("description") || (domain["description"] === null) ) ? "" : lib_plankton.string.coin( " COMMENT '{{comment}}'", { "comment": domain["description"], } ) ), "entries": ( ( [] // key field .concat( (domain["key_field"] === null) ? [] : lib_plankton.string.coin( "`{{name}}` {{parameters}}", { "name": domain["key_field"]["name"], "parameters": ( [ "INTEGER", "PRIMARY KEY", "AUTO INCREMENT", ] .concat( ( ! domain["key_field"].hasOwnProperty("description") || (domain["key_field"]["description"] === null) ) ? [] : [ lib_plankton.string.coin( "COMMENT '{{comment}}'", { "comment": domain["key_field"]["description"], } ), ] ) .join(" ") ), } ) ) // data fields .concat( domain["data_fields"] .map( (data_field) => lib_plankton.string.coin( "`{{name}}` {{parameters}}", { "name": data_field["name"], "parameters": ( ( // type [ { "boolean": "BOOLEAN", "integer": "INTEGER", "string_short": "VARCHAR(63)", "string_medium": "VARCHAR(255)", "string_long": "TEXT", }[data_field["type"]], ] // nullability .concat( data_field["nullable"] ? ["NULL"] : [] ) // comment .concat( ( ! data_field.hasOwnProperty("description") || (data_field["description"] === null) ) ? [] : [ lib_plankton.string.coin( "COMMENT '{{comment}}'", { "comment": data_field["description"], } ), ] ) ) .join(" ") ) } ) ) ) // constraints .concat( domain["constraints"] .map( (constraint) => { switch (constraint["kind"]) { default: { throw (new Error("unhandled constraint kind: " + constraint["kind"])); break; } case "foreign_key": { return lib_plankton.string.coin( "FOREIGN KEY ({{fields}}) REFERENCES `{{reference_name}}`({{reference_fields}})", { "fields": ( constraint["parameters"]["fields"] .map(x => ('`' + x + '`')) .join(",") ), "reference_name": constraint["parameters"]["reference"]["name"], "reference_fields": ( constraint["parameters"]["reference"]["fields"] .map(x => ('`' + x + '`')) .join(",") ), } ); break; } case "unique": { return lib_plankton.string.coin( "UNIQUE ({{fields}})", { "fields": ( constraint["parameters"]["fields"] .map(x => ('`' + x + '`')) .join(",") ), } ); break; } } } ) ) ) .map(x => ("\t\t" + x)) .join(",\n") ), } ) ) .map(x => (x + "\n")) .join("\n") ); }, };