UNPKG

envio

Version:

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

147 lines (125 loc) 4.32 kB
// Generated by ReScript, PLEASE EDIT WITH CARE import * as Table from "./Table.res.mjs"; import * as Js_string from "@rescript/runtime/lib/es6/Js_string.js"; import * as Stdlib_BigInt from "@rescript/runtime/lib/es6/Stdlib_BigInt.js"; import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs"; let variants = [ "SET", "DELETE" ]; let name = "ENVIO_HISTORY_CHANGE"; let schema = S$RescriptSchema.$$enum(variants); let config = { name: name, variants: variants, schema: schema }; let RowAction = { variants: variants, name: name, schema: schema, config: config }; let changeFieldName = "envio_change"; let checkpointIdFieldName = "envio_checkpoint_id"; let changeFieldType = { type: "Enum", config: config }; let unsafeCheckpointIdSchema = S$RescriptSchema.transform(S$RescriptSchema.setName(S$RescriptSchema.string, "CheckpointId"), s => ({ p: string => { let v = Stdlib_BigInt.fromString(string); if (v !== undefined) { return v; } else { return s.fail("The string is not valid CheckpointId", undefined); } }, s: bigint => bigint.toString() })); function makeSetUpdateSchema(entitySchema) { return S$RescriptSchema.object(s => { s.tag(changeFieldName, "SET"); return { type: "SET", entityId: s.f(Table.idFieldName, S$RescriptSchema.string), entity: s.flatten(entitySchema), checkpointId: s.f(checkpointIdFieldName, unsafeCheckpointIdSchema) }; }); } let historyTablePrefix = "envio_history_"; function historyTableName(entityName, entityIndex) { let fullName = historyTablePrefix + entityName; if (fullName.length <= 63) { return fullName; } let entityIndexStr = entityIndex.toString(); return Js_string.slice(0, 63 - entityIndexStr.length | 0, fullName) + entityIndexStr; } function makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema) { let historyTableRef = `"` + pgSchema + `"."` + historyTableName(entityName, entityIndex) + `"`; return `WITH anchors AS ( SELECT t.id, MAX(t.` + checkpointIdFieldName + `) AS keep_checkpoint_id FROM ` + historyTableRef + ` t WHERE t.` + checkpointIdFieldName + ` <= $1 GROUP BY t.id ) DELETE FROM ` + historyTableRef + ` d USING anchors a WHERE d.id = a.id AND ( d.` + checkpointIdFieldName + ` < a.keep_checkpoint_id OR ( d.` + checkpointIdFieldName + ` = a.keep_checkpoint_id AND NOT EXISTS ( SELECT 1 FROM ` + historyTableRef + ` ps WHERE ps.id = d.id AND ps.` + checkpointIdFieldName + ` > $1 ) ) );`; } function pruneStaleEntityHistory(sql, entityName, entityIndex, pgSchema, safeCheckpointId) { return sql.unsafe(makePruneStaleEntityHistoryQuery(entityName, entityIndex, pgSchema), [safeCheckpointId.toString()], {prepare: true}); } function makeBackfillHistoryQuery(pgSchema, entityName, entityIndex) { let historyTableRef = `"` + pgSchema + `"."` + historyTableName(entityName, entityIndex) + `"`; return `WITH target_ids AS ( SELECT UNNEST($1::` + "TEXT" + `[]) AS id ), missing_history AS ( SELECT e.* FROM "` + pgSchema + `"."` + entityName + `" e JOIN target_ids t ON e.id = t.id LEFT JOIN ` + historyTableRef + ` h ON h.id = e.id WHERE h.id IS NULL ) INSERT INTO ` + historyTableRef + ` SELECT *, 0 AS ` + checkpointIdFieldName + `, '` + "SET" + `' as ` + changeFieldName + ` FROM missing_history;`; } function backfillHistory(sql, pgSchema, entityName, entityIndex, ids) { return sql.unsafe(makeBackfillHistoryQuery(pgSchema, entityName, entityIndex), [ids], {prepare: true}); } function rollback(sql, pgSchema, entityName, entityIndex, rollbackTargetCheckpointId) { return sql.unsafe(`DELETE FROM "` + pgSchema + `"."` + historyTableName(entityName, entityIndex) + `" WHERE "` + checkpointIdFieldName + `" > $1;`, [rollbackTargetCheckpointId.toString()], {prepare: true}); } let checkpointIdFieldType = "UInt64"; let maxPgTableNameLength = 63; export { RowAction, changeFieldName, checkpointIdFieldName, checkpointIdFieldType, changeFieldType, unsafeCheckpointIdSchema, makeSetUpdateSchema, maxPgTableNameLength, historyTablePrefix, historyTableName, makePruneStaleEntityHistoryQuery, pruneStaleEntityHistory, makeBackfillHistoryQuery, backfillHistory, rollback, } /* schema Not a pure module */