envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
196 lines (176 loc) • 9.46 kB
JavaScript
// 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 */