UNPKG

envio

Version:

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

402 lines (369 loc) • 12.8 kB
// Generated by ReScript, PLEASE EDIT WITH CARE 'use strict'; var Utils = require("./Utils.res.js"); var Js_exn = require("rescript/lib/js/js_exn.js"); var Lodash = require("./bindings/Lodash.res.js"); var Js_dict = require("rescript/lib/js/js_dict.js"); var Belt_Array = require("rescript/lib/js/belt_Array.js"); var Belt_Option = require("rescript/lib/js/belt_Option.js"); var Caml_option = require("rescript/lib/js/caml_option.js"); var TableIndices = require("./TableIndices.res.js"); var ErrorHandling = require("./ErrorHandling.res.js"); var Caml_exceptions = require("rescript/lib/js/caml_exceptions.js"); function make(hash) { return { dict: {}, hash: hash }; } function set(self, key, value) { self.dict[self.hash(key)] = value; } function setByHash(self, hash, value) { self.dict[hash] = value; } function hasByHash(self, hash) { return Utils.Dict.has(self.dict, hash); } function getUnsafeByHash(self, hash) { return self.dict[hash]; } function get(self, key) { return self.dict[self.hash(key)]; } function values(self) { return Js_dict.values(self.dict); } function clone(self) { return { dict: Lodash.cloneDeep(self.dict), hash: self.hash }; } var UnexpectedIdNotDefinedOnEntity = /* @__PURE__ */Caml_exceptions.create("InMemoryTable.Entity.UnexpectedIdNotDefinedOnEntity"); function getEntityIdUnsafe(entity) { var id = entity.id; if (id !== undefined) { return Caml_option.valFromOption(id); } else { return ErrorHandling.mkLogAndRaise(undefined, "Property 'id' does not exist on expected entity object", { RE_EXN_ID: UnexpectedIdNotDefinedOnEntity }); } } function makeIndicesSerializedToValue(index, relatedEntityIdsOpt) { var relatedEntityIds = relatedEntityIdsOpt !== undefined ? Caml_option.valFromOption(relatedEntityIdsOpt) : new Set(); var empty_dict = {}; var empty_hash = TableIndices.Index.toString; var empty = { dict: empty_dict, hash: empty_hash }; set(empty, index, [ index, relatedEntityIds ]); return empty; } function make$1() { return { table: { dict: {}, hash: (function (str) { return str; }) }, fieldNameIndices: { dict: {}, hash: TableIndices.Index.getFieldName } }; } var UndefinedKey = /* @__PURE__ */Caml_exceptions.create("InMemoryTable.Entity.UndefinedKey"); function updateIndices(self, entity, entityIndices) { entityIndices.forEach(function (index) { var fieldName = TableIndices.Index.getFieldName(index); var fieldValue = Js_dict.get(entity, fieldName); if (!TableIndices.Index.evaluate(index, fieldName, fieldValue)) { entityIndices.delete(index); return ; } }); Belt_Array.forEach(Object.keys(self.fieldNameIndices.dict), (function (fieldName) { var match = Js_dict.get(entity, fieldName); var match$1 = Js_dict.get(self.fieldNameIndices.dict, fieldName); if (match !== undefined && match$1 !== undefined) { var fieldValue = Caml_option.valFromOption(match); return Belt_Array.forEach(Js_dict.values(match$1.dict), (function (param) { var relatedEntityIds = param[1]; var index = param[0]; if (TableIndices.Index.evaluate(index, fieldName, fieldValue)) { relatedEntityIds.add(getEntityIdUnsafe(entity)); entityIndices.add(index); } else { relatedEntityIds.delete(getEntityIdUnsafe(entity)); } })); } ErrorHandling.mkLogAndRaise(undefined, "Expected field name to exist on the referenced index and the provided entity", { RE_EXN_ID: UndefinedKey, _1: fieldName }); })); } function deleteEntityFromIndices(self, entityId, entityIndices) { entityIndices.forEach(function (index) { var match = Belt_Option.flatMap(get(self.fieldNameIndices, index), (function (__x) { return get(__x, index); })); if (match !== undefined) { match[1].delete(entityId); } entityIndices.delete(index); }); } function initValue(inMemTable, key, entity, allowOverWriteEntityOpt) { var allowOverWriteEntity = allowOverWriteEntityOpt !== undefined ? allowOverWriteEntityOpt : false; var shouldWriteEntity = allowOverWriteEntity || Belt_Option.isNone(Js_dict.get(inMemTable.table.dict, inMemTable.table.hash(key))); if (!shouldWriteEntity) { return ; } var entityIndices = new Set(); var initialStoreRow; if (entity !== undefined) { var entity$1 = Caml_option.valFromOption(entity); updateIndices(inMemTable, entity$1, entityIndices); initialStoreRow = { TAG: "InitialReadFromDb", _0: { TAG: "AlreadySet", _0: entity$1 } }; } else { initialStoreRow = { TAG: "InitialReadFromDb", _0: "NotSet" }; } inMemTable.table.dict[inMemTable.table.hash(key)] = { entityRow: initialStoreRow, entityIndices: entityIndices }; } function set$1(inMemTable, entityUpdate, shouldSaveHistory, containsRollbackDiffChangeOpt) { var containsRollbackDiffChange = containsRollbackDiffChangeOpt !== undefined ? containsRollbackDiffChangeOpt : false; var match = get(inMemTable.table, entityUpdate.entityId); var match$1; if (match !== undefined) { var previous_values = match.entityRow; if (previous_values.TAG === "Updated") { var previous_values$1 = previous_values._0; var entityRow = { TAG: "Updated", _0: { latest: entityUpdate, history: shouldSaveHistory ? ( previous_values$1.latest.checkpointId === entityUpdate.checkpointId ? Utils.$$Array.setIndexImmutable(previous_values$1.history, previous_values$1.history.length - 1 | 0, entityUpdate) : Belt_Array.concatMany([ previous_values$1.history, [entityUpdate] ]) ) : previous_values$1.history, containsRollbackDiffChange: previous_values$1.containsRollbackDiffChange } }; match$1 = { entityRow: entityRow, entityIndices: match.entityIndices }; } else { match$1 = { entityRow: { TAG: "Updated", _0: { latest: entityUpdate, history: shouldSaveHistory ? [entityUpdate] : [], containsRollbackDiffChange: containsRollbackDiffChange } }, entityIndices: match.entityIndices }; } } else { match$1 = { entityRow: { TAG: "Updated", _0: { latest: entityUpdate, history: shouldSaveHistory ? [entityUpdate] : [], containsRollbackDiffChange: containsRollbackDiffChange } }, entityIndices: new Set() }; } var entityIndices = match$1.entityIndices; var entity = entityUpdate.entityUpdateAction; if (typeof entity !== "object") { deleteEntityFromIndices(inMemTable, entityUpdate.entityId, entityIndices); } else { updateIndices(inMemTable, entity._0, entityIndices); } set(inMemTable.table, entityUpdate.entityId, { entityRow: match$1.entityRow, entityIndices: entityIndices }); } function rowToEntity(row) { var match = row.entityRow; if (match.TAG === "Updated") { var entity = match._0.latest.entityUpdateAction; if (typeof entity !== "object") { return ; } else { return Caml_option.some(entity._0); } } var entity$1 = match._0; if (typeof entity$1 !== "object") { return ; } else { return Caml_option.some(entity$1._0); } } function getUnsafe(inMemTable) { return function (key) { return rowToEntity(inMemTable.table.dict[key]); }; } function hasIndex(inMemTable, fieldName, operator) { return function (fieldValueHash) { var indicesSerializedToValue = inMemTable.fieldNameIndices.dict[fieldName]; if (indicesSerializedToValue === undefined) { return false; } var key = fieldName + ":" + operator + ":" + fieldValueHash; return indicesSerializedToValue.dict[key] !== undefined; }; } function getUnsafeOnIndex(inMemTable, fieldName, operator) { var getEntity = getUnsafe(inMemTable); return function (fieldValueHash) { var indicesSerializedToValue = inMemTable.fieldNameIndices.dict[fieldName]; if (indicesSerializedToValue === undefined) { return Js_exn.raiseError("Unexpected error. Must have an index on field " + fieldName); } var key = fieldName + ":" + operator + ":" + fieldValueHash; var match = indicesSerializedToValue.dict[key]; if (match !== undefined) { return Belt_Array.keepMap(Array.from(match[1]), (function (entityId) { if (hasByHash(inMemTable.table, entityId)) { return getEntity(entityId); } })); } else { return Js_exn.raiseError("Unexpected error. Must have an index for the value " + fieldValueHash + " on field " + fieldName); } }; } function addEmptyIndex(inMemTable, index) { var fieldName = TableIndices.Index.getFieldName(index); var relatedEntityIds = new Set(); Belt_Array.forEach(Js_dict.values(inMemTable.table.dict), (function (row) { var entity = rowToEntity(row); if (entity === undefined) { return ; } var entity$1 = Caml_option.valFromOption(entity); var fieldValue = entity$1[fieldName]; if (TableIndices.Index.evaluate(index, fieldName, fieldValue)) { row.entityIndices.add(index); relatedEntityIds.add(getEntityIdUnsafe(entity$1)); return ; } })); var indicesSerializedToValue = get(inMemTable.fieldNameIndices, index); if (indicesSerializedToValue === undefined) { return set(inMemTable.fieldNameIndices, index, makeIndicesSerializedToValue(index, Caml_option.some(relatedEntityIds))); } var match = get(indicesSerializedToValue, index); if (match !== undefined) { return ; } else { return set(indicesSerializedToValue, index, [ index, relatedEntityIds ]); } } function addIdToIndex(inMemTable, index, entityId) { var indicesSerializedToValue = get(inMemTable.fieldNameIndices, index); if (indicesSerializedToValue === undefined) { return set(inMemTable.fieldNameIndices, index, makeIndicesSerializedToValue(index, Caml_option.some(new Set().add(entityId)))); } var match = get(indicesSerializedToValue, index); if (match !== undefined) { match[1].add(entityId); return ; } else { return set(indicesSerializedToValue, index, [ index, new Set().add(entityId) ]); } } function rows(inMemTable) { return Belt_Array.map(Js_dict.values(inMemTable.table.dict), (function (v) { return v.entityRow; })); } function values$1(inMemTable) { return Belt_Array.keepMap(Js_dict.values(inMemTable.table.dict), rowToEntity); } function clone$1(param) { var fieldNameIndices = param.fieldNameIndices; return { table: clone(param.table), fieldNameIndices: { dict: Js_dict.fromArray(Belt_Array.map(Js_dict.entries(fieldNameIndices.dict), (function (param) { return [ param[0], clone(param[1]) ]; }))), hash: fieldNameIndices.hash } }; } var Entity = { UnexpectedIdNotDefinedOnEntity: UnexpectedIdNotDefinedOnEntity, getEntityIdUnsafe: getEntityIdUnsafe, makeIndicesSerializedToValue: makeIndicesSerializedToValue, make: make$1, UndefinedKey: UndefinedKey, updateIndices: updateIndices, deleteEntityFromIndices: deleteEntityFromIndices, initValue: initValue, setRow: set, set: set$1, rowToEntity: rowToEntity, getRow: get, getUnsafe: getUnsafe, hasIndex: hasIndex, getUnsafeOnIndex: getUnsafeOnIndex, addEmptyIndex: addEmptyIndex, addIdToIndex: addIdToIndex, rows: rows, values: values$1, clone: clone$1 }; exports.make = make; exports.set = set; exports.setByHash = setByHash; exports.hasByHash = hasByHash; exports.getUnsafeByHash = getUnsafeByHash; exports.get = get; exports.values = values; exports.clone = clone; exports.Entity = Entity; /* Utils Not a pure module */