UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

196 lines (176 loc) • 9.46 kB
// Generated by ReScript, PLEASE EDIT WITH CARE 'use strict'; var Table = require("./Table.res.js"); var Js_string = require("rescript/lib/js/js_string.js"); var Belt_Array = require("rescript/lib/js/belt_Array.js"); var S$RescriptSchema = require("rescript-schema/src/S.res.js"); var variants = [ "SET", "DELETE" ]; var name = "ENVIO_HISTORY_CHANGE"; var schema = S$RescriptSchema.$$enum(variants); var RowAction = { variants: variants, name: name, schema: schema }; var changeFieldName = "envio_change"; var checkpointIdFieldName = "checkpoint_id"; function makeSetUpdateSchema(entitySchema) { return S$RescriptSchema.object(function (s) { s.tag(changeFieldName, "SET"); return { entityId: s.f("id", S$RescriptSchema.string), entityUpdateAction: { TAG: "Set", _0: s.flatten(entitySchema) }, checkpointId: s.f(checkpointIdFieldName, S$RescriptSchema.$$int) }; }); } var historyTablePrefix = "envio_history_"; function historyTableName(entityName, entityIndex) { var fullName = historyTablePrefix + entityName; if (fullName.length <= 63) { return fullName; } var entityIndexStr = String(entityIndex); return Js_string.slice(0, 63 - entityIndexStr.length | 0, fullName) + entityIndexStr; } function fromTable(table, schema, entityIndex) { var dataFields = Belt_Array.keepMap(table.fields, (function (field) { if (field.TAG !== "Field") { return ; } var field$1 = field._0; var match = field$1.fieldName; if (match === "id") { return { TAG: "Field", _0: { fieldName: "id", fieldType: field$1.fieldType, fieldSchema: field$1.fieldSchema, isArray: field$1.isArray, isNullable: field$1.isNullable, isPrimaryKey: true, isIndex: field$1.isIndex, linkedEntity: field$1.linkedEntity, defaultValue: field$1.defaultValue } }; } else { return { TAG: "Field", _0: { fieldName: field$1.fieldName, fieldType: field$1.fieldType, fieldSchema: field$1.fieldSchema, isArray: field$1.isArray, isNullable: true, isPrimaryKey: field$1.isPrimaryKey, isIndex: false, linkedEntity: field$1.linkedEntity, defaultValue: field$1.defaultValue } }; } })); var actionField = Table.mkField(changeFieldName, name, S$RescriptSchema.never, undefined, undefined, undefined, undefined, undefined, undefined); var checkpointIdField = Table.mkField(checkpointIdFieldName, "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined); var entityTableName = table.tableName; var historyTableName$1 = historyTableName(entityTableName, entityIndex); var table$1 = Table.mkTable(historyTableName$1, undefined, Belt_Array.concat(dataFields, [ checkpointIdField, actionField ])); var setUpdateSchema = makeSetUpdateSchema(schema); var allFieldNames = Belt_Array.map(table$1.fields, (function (field) { return Table.getFieldName(field); })); var allFieldNamesStr = Belt_Array.map(allFieldNames, (function (name) { return "\"" + name + "\""; })).join(", "); var selectParts = Belt_Array.map(allFieldNames, (function (fieldName) { if (fieldName === "id") { return "u.id"; } else if (fieldName === checkpointIdFieldName) { return "u.checkpoint_id"; } else if (fieldName === changeFieldName) { return "'DELETE'"; } else { return "NULL"; } })); var selectPartsStr = selectParts.join(", "); var makeInsertDeleteUpdatesQuery = function (pgSchema) { return "INSERT INTO \"" + pgSchema + "\".\"" + historyTableName$1 + "\" (" + allFieldNamesStr + ")\nSELECT " + selectPartsStr + "\nFROM UNNEST($1::text[], $2::int[]) AS u(id, checkpoint_id)"; }; var dataFieldNames = Belt_Array.keep(Belt_Array.map(table$1.fields, (function (field) { return Table.getFieldName(field); })), (function (fieldName) { if (fieldName !== changeFieldName) { return fieldName !== checkpointIdFieldName; } else { return false; } })); var dataFieldsCommaSeparated = Belt_Array.map(dataFieldNames, (function (name) { return "\"" + name + "\""; })).join(", "); var makeGetRollbackRemovedIdsQuery = function (pgSchema) { return "SELECT DISTINCT id\nFROM \"" + pgSchema + "\".\"" + historyTableName$1 + "\"\nWHERE \"" + checkpointIdFieldName + "\" > $1\n AND NOT EXISTS (\n SELECT 1\n FROM \"" + pgSchema + "\".\"" + historyTableName$1 + "\" h\n WHERE h.id = \"" + historyTableName$1 + "\".id\n AND h.\"" + checkpointIdFieldName + "\" <= $1\n )"; }; var makeGetRollbackRestoredEntitiesQuery = function (pgSchema) { return "SELECT DISTINCT ON (id) " + dataFieldsCommaSeparated + "\nFROM \"" + pgSchema + "\".\"" + historyTableName$1 + "\"\nWHERE \"" + checkpointIdFieldName + "\" <= $1\n AND EXISTS (\n SELECT 1\n FROM \"" + pgSchema + "\".\"" + historyTableName$1 + "\" h\n WHERE h.id = \"" + historyTableName$1 + "\".id\n AND h.\"" + checkpointIdFieldName + "\" > $1\n )\nORDER BY id, \"" + checkpointIdFieldName + "\" DESC"; }; return { table: table$1, setUpdateSchema: setUpdateSchema, setUpdateSchemaRows: S$RescriptSchema.array(setUpdateSchema), makeInsertDeleteUpdatesQuery: makeInsertDeleteUpdatesQuery, makeGetRollbackRemovedIdsQuery: makeGetRollbackRemovedIdsQuery, makeGetRollbackRestoredEntitiesQuery: makeGetRollbackRestoredEntitiesQuery }; } function makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema) { var historyTableRef = "\"" + pgSchema + "\".\"" + historyTableName(entityName, entityIndex) + "\""; return "WITH anchors AS (\n SELECT t.id, MAX(t." + checkpointIdFieldName + ") AS keep_checkpoint_id\n FROM " + historyTableRef + " t WHERE t." + checkpointIdFieldName + " <= $1\n GROUP BY t.id\n)\nDELETE FROM " + historyTableRef + " d\nUSING anchors a\nWHERE d.id = a.id\n AND (\n d." + checkpointIdFieldName + " < a.keep_checkpoint_id\n OR (\n d." + checkpointIdFieldName + " = a.keep_checkpoint_id AND\n NOT EXISTS (\n SELECT 1 FROM " + historyTableRef + " ps \n WHERE ps.id = d.id AND ps." + checkpointIdFieldName + " > $1\n ) \n )\n );"; } function pruneStaleEntityHistory(sql, entityName, entityIndex, pgSchema, safeCheckpointId) { return sql.unsafe(makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema), [safeCheckpointId], {prepare: true}); } function makeBackfillHistoryQuery(pgSchema, entityName, entityIndex) { var historyTableRef = "\"" + pgSchema + "\".\"" + historyTableName(entityName, entityIndex) + "\""; return "WITH target_ids AS (\n SELECT UNNEST($1::TEXT[]) AS id\n),\nmissing_history AS (\n SELECT e.*\n FROM \"" + pgSchema + "\".\"" + entityName + "\" e\n JOIN target_ids t ON e.id = t.id\n LEFT JOIN " + historyTableRef + " h ON h.id = e.id\n WHERE h.id IS NULL\n)\nINSERT INTO " + historyTableRef + "\nSELECT *, 0 AS " + checkpointIdFieldName + ", '" + "SET" + "' as " + changeFieldName + "\nFROM missing_history;"; } function backfillHistory(sql, pgSchema, entityName, entityIndex, ids) { return sql.unsafe(makeBackfillHistoryQuery(pgSchema, entityName, entityIndex), [ids], {prepare: true}); } function insertDeleteUpdates(sql, pgSchema, entityHistory, batchDeleteEntityIds, batchDeleteCheckpointIds) { return sql.unsafe(entityHistory.makeInsertDeleteUpdatesQuery(pgSchema), [ batchDeleteEntityIds, batchDeleteCheckpointIds ], {prepare: true}); } function rollback(sql, pgSchema, entityName, entityIndex, rollbackTargetCheckpointId) { return sql.unsafe("DELETE FROM \"" + pgSchema + "\".\"" + historyTableName(entityName, entityIndex) + "\" WHERE \"" + checkpointIdFieldName + "\" > $1;", [rollbackTargetCheckpointId], {prepare: true}); } var maxPgTableNameLength = 63; exports.RowAction = RowAction; exports.changeFieldName = changeFieldName; exports.checkpointIdFieldName = checkpointIdFieldName; exports.makeSetUpdateSchema = makeSetUpdateSchema; exports.maxPgTableNameLength = maxPgTableNameLength; exports.historyTablePrefix = historyTablePrefix; exports.historyTableName = historyTableName; exports.fromTable = fromTable; exports.makePruneStaleEntityHistoryQuery = makePruneStaleEntityHistoryQuery; exports.pruneStaleEntityHistory = pruneStaleEntityHistory; exports.makeBackfillHistoryQuery = makeBackfillHistoryQuery; exports.backfillHistory = backfillHistory; exports.insertDeleteUpdates = insertDeleteUpdates; exports.rollback = rollback; /* schema Not a pure module */