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