``` include "lib.sync"
assocs2attrs(assocs, attrs, orig_attrs) { for [assoc, attr, orig_attr] in { {orig_attr = null; assoc = null; attr = null} | {assoc = null; attr = orig_attr; orig_attr <> null;} | { orig_attr = null; attr."enclosingClass" = assoc."src"; attr."type" = assoc."dest"; attr."name" = assoc."name"; attr."is_primary" = false; } } }
classes2tables(classes, tables, traces) { for [, , trace] in { { table."name" = class."name"; trace."class" = classid; trace."table" = tableid; } | { class = null; table = null; trace = null; } } }
nullableFindBy(d, v, k) { findByNoChangeD(d, v, k) | { v = null; k = null } }
inTrace(v1, v2, trace) { var key; nullableFindBy(trace, v1, key); nullableFindBy(trace, v2, key); }
isPrimitiveType(attr, classifiers) { var attrTypeRef, type; attrTypeRef = attr."type"; type = classifiers.!attrTypeRef; type."__type" == "primitive";
}
isClassType(attr, classifiers) { var attrTypeRef, type; attrTypeRef = attr."type"; type = classifiers.!attrTypeRef; type."__type" == "class"; }
attrType2columnType(attrTypeRef, columnType, classifiers) { { var type, typeName, ref; {findValueBy(classifiers, columnType, ref, type) | {ref=null;columnType=null;}} ref = attrTypeRef; type."__type" = "primitive"; } | { attrTypeRef = null; columnType = null; } }
filterClassAttrs(attrs, pattrs, classifiers) { for [attr, pattr] in [attrs, pattrs] { {pattr = attr; isPrimitiveType(attr, classifiers)} | {pattr = null; isClassType(attr, classifiers)} | {attr = null; pattr = null;} } }
attrs2columns(attrs, columns, a2cTraces, c2tTraces, classifiers) { var primitiveAttrs; filterClassAttrs(attrs, primitiveAttrs, classifiers); for [, , ] in { {attr = null; column = null; trace = null;} | { var columnType, attrType, classRef, tableRef; columnType = column."type"; attrType = attr."type"; attrType2columnType(attrType, columnType, classifiers);
column."name" = attr."name";
classRef = attr."enclosingClass";
tableRef = column."table";
inTrace<attr1="class", attr2="table">(classRef, tableRef, c2tTraces);
trace."attr" = attrid;
trace."column" = columnid;
}
}
}
columnRef2table(columnRef, table, columns, tables) { var column, tableRef; column = columns.!columnRef; tableRef = column."table"; table = !tables.tableRef; }
attrs2prims(attrs, a2cTraces, columns, tables, classifiers) { for [] in { { var table, columnid; attr."is_primary" = false; isPrimitiveType(attr, classifiers); inTrace(attrid, columnid, a2cTraces); columnRef2table(columnid, table, columns, tables); table."pkey" <> columnid; } | { var table, columnid; attr."is_primary" = true; isPrimitiveType(attr, classifiers); inTrace(attrid, columnid, a2cTraces); columnRef2table(columnid, table, columns, tables); table."pkey" = columnid; } | { attr."is_primary" = false; isClassType(attr, classifiers); } | attr = null } }
noNullPKey(tables) { for [table] in [tables] { table."pkey" <> null | table = null } }
filterPrimitiveAttrs(attrs, pattrs, classifiers) { for [attr, pattr] in [attrs, pattrs] { {pattr = attr; isClassType(attr, classifiers);} | {pattr = null; isPrimitiveType(attr, classifiers);} | {attr = null; pattr = null;} } }
attrs2fkeys(attrs, fkeys, c2tTraces, tables, classifiers) { var classAttrs; filterPrimitiveAttrs(attrs, classAttrs, classifiers); for [, ] in { {attr = null; fkey = null;} | { var typeTableRef, attrType, classRef, tableRef, name, table; typeTableRef = fkey."reference"; attrType = attr."type"; inTrace(attrType, typeTableRef, c2tTraces);
name = attr."name";
fkey."name" = name;
name <> "__super";
classRef = attr."enclosingClass";
tableRef = fkey."table";
inTrace<attr1="class", attr2="table">(classRef, tableRef, c2tTraces);
fkey."col" = table."pkey";
table = !tables.typeTableRef;
} |
{
attr = null;
fkey."name" == "__super";
}
}
}
filterNonSuperFKeys(fkeys, superFKeys) { for [fkey, super] in [fkeys, superFKeys] { {fkey = super; fkey."name" == "__super";} | {super = null; fkey."name" <> "__super"} | {fkey = null; super = null;} } }
supers2fkeys(classes, fkeys, tables, c2tTrace) { var supers; filterNonSuperFKeys(fkeys, supers); for [, ] in { { var generalClassRef, generalTableRef, tableRef, table; generalClassRef = class."parent"; generalClassRef <> null; generalTableRef = fkey."reference"; inTrace(generalClassRef, generalTableRef, c2tTrace); fkey."name" = "__super"; tableRef = fkey."table"; inTrace(classid, tableRef, c2tTrace); table."pkey" = fkey."col"; table = !tables.generalTableRef; } | { class."parent" = null; fkey = null; } | { class = null; fkey = null; } } }
typeMapper(generalObjs, specializedObjs) { for [general, specialized] in [generalObjs, specializedObjs] { {general."__type" = type; specialized = general;} | {general."__type" <> type; specialized = null;} | {general = null; specialized = null;} } }
main(classifiers, attrs, assocs, tables, columns, fkeys) { var allattrs, classTableTrace, attrColumnTrace, classes; typeMapper(classifiers, classes); nullableRefMaintainer(classes, classes); assocs2attrs(assocs, allattrs, attrs); containmentRefMaintainer(allattrs, classifiers); nullableRefMaintainer(allattrs, classifiers); classes2tables(classes, tables, classTableTrace); attrs2columns(allattrs, columns, attrColumnTrace, classTableTrace, classifiers); attrs2prims(allattrs, attrColumnTrace, columns, tables, classifiers); noNullPKey(tables); attrs2fkeys(allattrs, fkeys, classTableTrace, tables, classifiers); supers2fkeys(classes, fkeys, tables, classTableTrace); } ```