envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
402 lines (369 loc) • 12.8 kB
JavaScript
// Generated by ReScript, PLEASE EDIT WITH CARE
;
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 */