Skip to content

Commit 9368de8

Browse files
committed
using a LiteralContext to save the literalized objects in the state checkpoint
1 parent 6636493 commit 9368de8

File tree

4 files changed

+435
-55
lines changed

4 files changed

+435
-55
lines changed

src/data/collections/mutable/MutableReference.ts

+21-4
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { MutationOp } from '../../model/mutable/MutationOp';
33
import { HashedObject } from '../../model/immutable/HashedObject';
44
import { Timestamps } from 'util/timestamps';
55
import { Hash } from '../../model/hashing';
6-
import { ClassRegistry } from '../../model';
6+
import { ClassRegistry, Context, LiteralContext } from '../../model';
77
import { MultiMap } from 'util/multimap';
88
import { Identity } from 'data/identity';
99
import { BaseCollection, CollectionConfig, CollectionOp } from './Collection';
@@ -103,17 +103,35 @@ class MutableReference<T> extends BaseCollection<T> {
103103
}
104104

105105
exportMutableState() {
106+
107+
let objectValue : (LiteralContext|undefined);
108+
let literalValue : any;
109+
110+
if (this._value instanceof HashedObject) {
111+
const context = new Context();
112+
this._value.toContext(context);
113+
objectValue = context.toLiteralContext();
114+
} else {
115+
literalValue = this._value;
116+
}
117+
106118
return {
107119
_sequence: this._sequence,
108120
_timestamp: this._timestamp,
109-
_value: this._value
121+
_objectValue: objectValue,
122+
_literalValue: literalValue
110123
};
111124
}
112125

113126
importMutableState(state: any) {
114127
this._sequence = state._sequence;
115128
this._timestamp = state._timestamp;
116-
this._value = state._value;
129+
130+
if (state._objectValue !== undefined) {
131+
this._value = HashedObject.fromLiteralContext(state._objectValue) as any as T;
132+
} else {
133+
this._value = state._literalValue;
134+
}
117135
}
118136

119137
async validate(references: Map<Hash, HashedObject>) {
@@ -147,7 +165,6 @@ class RefUpdateOp<T> extends CollectionOp<T> {
147165
timestamp?: string;
148166
value?: T;
149167

150-
151168
constructor(targetObject?: MutableReference<T>, value?: T, sequence?: number, author?: Identity) {
152169
super(targetObject);
153170

src/data/collections/mutable/MutableSet.ts

+36-8
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { MutableContentEvents } from '../../model/mutable/MutableObject';
22
import { HashedObject } from '../../model/immutable/HashedObject';
33
import { Hash } from '../../model/hashing/Hashing';
44
import { MutationOp } from 'data/model/mutable/MutationOp';
5-
import { HashedSet, HashedSetLiteralized } from 'data/model/immutable/HashedSet';
5+
import { HashedSet } from 'data/model/immutable/HashedSet';
66
import { HashReference } from 'data/model/immutable/HashReference';
77
import { Logger, LogLevel } from 'util/logging';
88
import { MultiMap } from 'util/multimap';
9-
import { ClassRegistry, Context } from 'data/model';
9+
import { ClassRegistry, Context, LiteralContext } from 'data/model';
1010
import { BaseCollection, Collection, CollectionConfig, CollectionOp } from './Collection';
1111
import { Identity } from 'data/identity';
1212

@@ -208,18 +208,46 @@ class MutableSet<T> extends BaseCollection<T> implements Collection<T> {
208208
}
209209

210210
exportMutableState() {
211+
212+
const literalElements = {} as any;
213+
const context = new Context();
214+
215+
for (const [hash, elmt] of this._elements.entries()) {
216+
if (elmt instanceof HashedObject) {
217+
elmt.toContext(context);
218+
} else {
219+
literalElements[hash] = elmt;
220+
}
221+
}
222+
211223
return {
212-
_elements: Object.fromEntries(this._elements.entries()),
213-
_currentAddOpRefs: Object.fromEntries([...this._currentAddOpRefs.entries()].map(([key, value]) => [key, value.literalize()]))
224+
_objectElements: context.toLiteralContext(),
225+
_literalElements: literalElements,
226+
_currentAddOpRefs: Object.fromEntries([...this._currentAddOpRefs.entries()].map(([key, value]) => [key, value.literalize().value]))
214227
};
215228
}
216229

217230
importMutableState(state: {
218-
_elements: {[key: string]: T},
219-
_currentAddOpRefs: {[key: string]: {value: HashedSetLiteralized }}
231+
_objectElements: LiteralContext,
232+
_literalElements: {[key: string]: any},
233+
_currentAddOpRefs: {[key: string]: any}
220234
}): void {
221-
this._elements = new Map(Object.entries(state._elements));
222-
this._currentAddOpRefs = new Map(Object.entries(state._currentAddOpRefs).map(([key, value]) => [key, HashedSet.deliteralize(value, new Context())]));
235+
236+
this._elements = new Map();
237+
238+
const context = new Context();
239+
context.fromLiteralContext(state._objectElements);
240+
241+
for (const hash of context.rootHashes) {
242+
this._elements.set(hash, HashedObject.fromContext(context, hash) as any as T);
243+
}
244+
245+
for (const [hash, literal] of Object.entries(state._literalElements)) {
246+
this._elements.set(hash, literal);
247+
}
248+
249+
const emptyContext = new Context();
250+
this._currentAddOpRefs = new Map(Object.entries(state._currentAddOpRefs).map(([key, value]) => [key, HashedSet.deliteralize(value, emptyContext)]));
223251
}
224252

225253
async validate(references: Map<Hash, HashedObject>) {

src/data/model/immutable/HashedSet.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Context } from '../literals/Context';
44

55
import { Dependency } from '../literals/LiteralUtils';
66

7-
export type HashedSetLiteralized = {
7+
type HashedSetLiteral = {
88
value: { _type: string, _hashes: string[], _elements: any[] },
99
dependencies: Map<Hash, Dependency>,
1010
}
@@ -89,7 +89,7 @@ class HashedSet<T> {
8989
return result;
9090
}
9191

92-
literalize(path='', context?: Context) : HashedSetLiteralized {
92+
literalize(path='', context?: Context) : HashedSetLiteral {
9393

9494
let dependencies = new Map<Hash, Dependency>();
9595

@@ -167,4 +167,5 @@ class HashedSet<T> {
167167

168168
}
169169

170-
export { HashedSet };
170+
export { HashedSet };
171+
export type { HashedSetLiteral };

0 commit comments

Comments
 (0)