delta_parser.ts.legacy 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {Delta, PrimitiveDelta} from "./delta";
  2. import {
  3. NodeCreation,
  4. NodeDeletion,
  5. EdgeCreation,
  6. EdgeUpdate,
  7. EdgeTargetType,
  8. } from "./delta";
  9. import {DeltaRegistry} from "./delta_registry";
  10. import {UUID} from "./types";
  11. export class DeltaParser {
  12. readonly deltaRegistry: DeltaRegistry;
  13. constructor(deltaRegistry) {
  14. this.deltaRegistry = deltaRegistry;
  15. }
  16. private getDependency<T>(hash): T {
  17. const result = this.deltaRegistry.deltas.get(hash);
  18. if (result === undefined) throw new Error("Could not dependency: " + hash);
  19. return result as T;
  20. }
  21. loadEdgeTarget({type, ...rest}): EdgeTargetType {
  22. if (type === "value") {
  23. const {value} = rest;
  24. return value;
  25. }
  26. if (type === "node") {
  27. const {creation} = rest;
  28. return this.getDependency<NodeCreation>(creation);
  29. }
  30. throw new Error("Unknown edge target type: " + type);
  31. }
  32. loadDelta({type, ...rest}): Delta {
  33. if (type === "NodeCreation") {
  34. const {id} = rest;
  35. return this.deltaRegistry.newNodeCreation(new UUID(id));
  36. }
  37. if (type === "EdgeCreation") {
  38. const {source, label, target} = rest;
  39. return this.deltaRegistry.newEdgeCreation(
  40. this.getDependency<NodeCreation>(source),
  41. label,
  42. this.loadEdgeTarget(target));
  43. }
  44. if (type === "EdgeUpdate") {
  45. const {overwrites, target} = rest;
  46. return this.deltaRegistry.newEdgeUpdate(
  47. this.getDependency<EdgeCreation|EdgeUpdate>(overwrites),
  48. this.loadEdgeTarget(target));
  49. }
  50. if (type === "NodeDeletion") {
  51. const {creation, deletedOutgoingEdges, afterIncomingEdges} = rest;
  52. return this.deltaRegistry.newNodeDeletion(
  53. this.getDependency<NodeCreation>(creation),
  54. deletedOutgoingEdges.map(d => this.getDependency<EdgeCreation|EdgeUpdate>(d)),
  55. afterIncomingEdges.map(d => this.getDependency<EdgeUpdate|NodeDeletion>(d)));
  56. }
  57. if (type === "Transaction") {
  58. const {type, deltas, dependencies, description} = rest;
  59. return this.deltaRegistry.newTransaction(
  60. deltas.map(d => this.getDependency<Delta>(d)),
  61. description,
  62. dependencies.map(d => this.getDependency<Delta>(d)));
  63. }
  64. throw new Error("Unknown delta type: " + type);
  65. }
  66. }