Skip to content

Commit f59f711

Browse files
(tree) Tag incremental summary APIs as @Alpha (#25918)
The APIs neede to enable incremental summary have been tagged as @ alpha so that they can be used by applications. The list of APIs that are marked @ alpha: - `configuredSharedTreeAlpha` - This is a new API which is similar to `configuredSharedTreeBeta` but has a couple more options exposed for configuring incremental summaries. - `SharedTreeOptionsAlpha` - Extension of `SharedTreeOptionsBeta` that includes options to enable incremental summarization. - `IncrementalEncodingPolicy` - Policy type to determine whether a node / field should be incrementally encoded. - `incrementalEncodingPolicyForAllowedTypes` - This function returns an `IncrementalEncodingPolicy` which will determine if `AllowedTypes` are opted into incremental summarization. - `incrementalSummaryHint` - This is a symbol that should be put in the metadata property of `AllowedTypes` to opt-in these types to be incrementally summarized. [AB#54252](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/54252) [AB#46028](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/46028)
1 parent 1d81d1a commit f59f711

File tree

21 files changed

+119
-113
lines changed

21 files changed

+119
-113
lines changed

packages/dds/tree/api-report/tree.alpha.api.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ export type ConciseTree<THandle = IFluidHandle> = Exclude<TreeLeafValue, IFluidH
169169
[key: string]: ConciseTree<THandle>;
170170
};
171171

172+
// @alpha
173+
export function configuredSharedTreeAlpha(options: SharedTreeOptions): SharedObjectKind<ITree>;
174+
172175
// @beta
173176
export function configuredSharedTreeBeta(options: SharedTreeOptionsBeta): SharedObjectKind<ITree>;
174177

@@ -427,6 +430,15 @@ export type ImplicitFieldSchema = FieldSchema | ImplicitAllowedTypes;
427430
// @alpha
428431
export function importCompatibilitySchemaSnapshot(config: JsonCompatibleReadOnly): TreeViewConfiguration;
429432

433+
// @alpha
434+
export type IncrementalEncodingPolicy = (nodeIdentifier: string | undefined, fieldKey: string) => boolean;
435+
436+
// @alpha
437+
export function incrementalEncodingPolicyForAllowedTypes(rootSchema: TreeSchema): IncrementalEncodingPolicy;
438+
439+
// @alpha
440+
export const incrementalSummaryHint: unique symbol;
441+
430442
// @alpha
431443
export function independentInitializedView<const TSchema extends ImplicitFieldSchema>(config: TreeViewConfiguration<TSchema>, options: ForestOptions & ICodecOptions, content: ViewContent): TreeViewAlpha<TSchema>;
432444

@@ -1022,8 +1034,9 @@ export interface SharedTreeFormatOptions {
10221034
}
10231035

10241036
// @alpha @input
1025-
export interface SharedTreeOptions extends Partial<CodecWriteOptions>, Partial<SharedTreeFormatOptions>, SharedTreeOptionsBeta {
1037+
export interface SharedTreeOptions extends SharedTreeOptionsBeta, Partial<CodecWriteOptions>, Partial<SharedTreeFormatOptions> {
10261038
readonly enableSharedBranches?: boolean;
1039+
shouldEncodeIncrementally?: IncrementalEncodingPolicy;
10271040
}
10281041

10291042
// @beta @input
@@ -1475,6 +1488,7 @@ export interface TreeChangeEventsBeta<TNode extends TreeNode = TreeNode> extends
14751488
// @alpha
14761489
export enum TreeCompressionStrategy {
14771490
Compressed = 0,
1491+
CompressedIncremental = 2,
14781492
Uncompressed = 1
14791493
}
14801494

packages/dds/tree/src/feature-libraries/chunked-forest/codec/codecs.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,7 @@ import {
2929
type Brand,
3030
type JsonCompatibleReadOnly,
3131
} from "../../../util/index.js";
32-
import {
33-
TreeCompressionStrategy,
34-
TreeCompressionStrategyExtended,
35-
type TreeCompressionStrategyPrivate,
36-
} from "../../treeCompressionUtils.js";
32+
import { TreeCompressionStrategy } from "../../treeCompressionUtils.js";
3733

3834
import { decode } from "./chunkDecoding.js";
3935
import type { FieldBatch } from "./fieldBatch.js";
@@ -109,7 +105,7 @@ export interface IncrementalDecoder {
109105
export interface IncrementalEncoderDecoder extends IncrementalEncoder, IncrementalDecoder {}
110106

111107
export interface FieldBatchEncodingContext {
112-
readonly encodeType: TreeCompressionStrategyPrivate;
108+
readonly encodeType: TreeCompressionStrategy;
113109
readonly idCompressor: IIdCompressor;
114110
readonly originatorId: SessionId;
115111
readonly schema?: SchemaAndPolicy;
@@ -190,7 +186,7 @@ export function makeFieldBatchCodec(options: CodecWriteOptions): FieldBatchCodec
190186
case TreeCompressionStrategy.Uncompressed:
191187
encoded = uncompressedEncodeFn(data);
192188
break;
193-
case TreeCompressionStrategyExtended.CompressedIncremental:
189+
case TreeCompressionStrategy.CompressedIncremental:
194190
assert(
195191
writeVersion >= FieldBatchFormatVersion.v2,
196192
0xca0 /* Unsupported FieldBatchFormatVersion for incremental encoding; must be v2 or higher */,

packages/dds/tree/src/feature-libraries/chunked-forest/codec/incrementalEncodingPolicy.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
* Licensed under the MIT License.
44
*/
55

6-
import type { FieldKey, TreeNodeSchemaIdentifier } from "../../../core/index.js";
7-
86
/**
97
* Policy to determine whether a node / field should be incrementally encoded.
108
* @param nodeIdentifier - The identifier of the node containing the field.
@@ -16,18 +14,19 @@ import type { FieldKey, TreeNodeSchemaIdentifier } from "../../../core/index.js"
1614
* but allows reuse of previously encoded unchanged subtrees.
1715
* Thus it should only be enabled for large subtrees which are modified infrequently.
1816
* TODO: AB#9068: Measure the actual overhead.
17+
* @alpha
1918
*/
2019
export type IncrementalEncodingPolicy = (
21-
nodeIdentifier: TreeNodeSchemaIdentifier | undefined,
22-
fieldKey: FieldKey,
20+
nodeIdentifier: string | undefined,
21+
fieldKey: string,
2322
) => boolean;
2423

2524
/**
2625
* Default policy for incremental encoding is to not encode incrementally.
2726
*/
2827
export const defaultIncrementalEncodingPolicy: IncrementalEncodingPolicy = (
29-
nodeIdentifier: TreeNodeSchemaIdentifier | undefined,
30-
fieldKey: FieldKey,
28+
nodeIdentifier: string | undefined,
29+
fieldKey: string,
3130
): boolean => {
3231
return false;
3332
};

packages/dds/tree/src/feature-libraries/forest-summary/forestSummarizer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ import {
4848
ForestIncrementalSummaryBuilder,
4949
forestSummaryContentKey,
5050
} from "./incrementalSummaryBuilder.js";
51-
import { TreeCompressionStrategyExtended } from "../treeCompressionUtils.js";
51+
import { TreeCompressionStrategy } from "../treeCompressionUtils.js";
5252
import type { IFluidHandle } from "@fluidframework/core-interfaces";
5353

5454
/**
@@ -85,7 +85,7 @@ export class ForestSummarizer implements Summarizable {
8585
this.codec = makeForestSummarizerCodec(options, fieldBatchCodec);
8686
this.incrementalSummaryBuilder = new ForestIncrementalSummaryBuilder(
8787
encoderContext.encodeType ===
88-
TreeCompressionStrategyExtended.CompressedIncremental /* enableIncrementalSummary */,
88+
TreeCompressionStrategy.CompressedIncremental /* enableIncrementalSummary */,
8989
(cursor: ITreeCursorSynchronous) => this.forest.chunkField(cursor),
9090
shouldEncodeIncrementally,
9191
initialSequenceNumber,

packages/dds/tree/src/feature-libraries/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,7 @@ export {
190190
type Observer,
191191
} from "./flex-tree/index.js";
192192

193-
export {
194-
TreeCompressionStrategy,
195-
TreeCompressionStrategyExtended,
196-
type TreeCompressionStrategyPrivate,
197-
} from "./treeCompressionUtils.js";
193+
export { TreeCompressionStrategy } from "./treeCompressionUtils.js";
198194

199195
export { valueSchemaAllows } from "./valueUtilities.js";
200196

packages/dds/tree/src/feature-libraries/modular-schema/modularChangeCodecs.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@ import {
4040
chunkFieldSingle,
4141
defaultChunkPolicy,
4242
} from "../chunked-forest/index.js";
43-
import {
44-
TreeCompressionStrategy,
45-
type TreeCompressionStrategyPrivate,
46-
} from "../treeCompressionUtils.js";
43+
import { TreeCompressionStrategy } from "../treeCompressionUtils.js";
4744

4845
import type { FieldChangeEncodingContext, FieldChangeHandler } from "./fieldChangeHandler.js";
4946
import type {
@@ -81,7 +78,7 @@ export function makeModularChangeCodecFamily(
8178
>,
8279
fieldsCodec: FieldBatchCodec,
8380
codecOptions: ICodecOptions,
84-
chunkCompressionStrategy: TreeCompressionStrategyPrivate = TreeCompressionStrategy.Compressed,
81+
chunkCompressionStrategy: TreeCompressionStrategy = TreeCompressionStrategy.Compressed,
8582
): ICodecFamily<ModularChangeset, ChangeEncodingContext> {
8683
return makeCodecFamily(
8784
Array.from(fieldKindConfigurations.entries(), ([version, fieldKinds]) => [
@@ -121,7 +118,7 @@ function makeModularChangeCodec(
121118
>,
122119
fieldsCodec: FieldBatchCodec,
123120
codecOptions: ICodecOptions,
124-
chunkCompressionStrategy: TreeCompressionStrategyPrivate = TreeCompressionStrategy.Compressed,
121+
chunkCompressionStrategy: TreeCompressionStrategy = TreeCompressionStrategy.Compressed,
125122
): ModularChangeCodec {
126123
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
127124
const getMapEntry = ({ kind, formatVersion }: FieldKindConfigurationEntry) => {

packages/dds/tree/src/feature-libraries/treeCompressionUtils.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,9 @@ export enum TreeCompressionStrategy {
2020
* Use this when debugging or testing and needing to inspect encoded tree content.
2121
*/
2222
Uncompressed = 1,
23-
}
24-
25-
/**
26-
* A private extension of {@link TreeCompressionStrategy} for strategies that are not intended for public use just yet.
27-
*/
28-
export enum TreeCompressionStrategyExtended {
2923
/**
30-
* Optimized for encoded size, same as TreeCompressionStrategy.Compressed. It also enables incremental encoding
24+
* Optimized for encoded size, same as TreeCompressionStrategy.Compressed but it enables incremental encoding
3125
* of the data.
32-
* @remarks
33-
* TODO: AB#41865
34-
* This needs to be stabilized to allow opting into it.
35-
* It could possibly be made the default instead of {@link TreeCompressionStrategy.Compressed}.
3626
*/
3727
CompressedIncremental = 2,
3828
}
39-
40-
export type TreeCompressionStrategyPrivate =
41-
| TreeCompressionStrategy
42-
| TreeCompressionStrategyExtended;

packages/dds/tree/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export {
5252
type TreeIndex,
5353
type TreeIndexKey,
5454
type TreeIndexNodes,
55+
type IncrementalEncodingPolicy,
5556
} from "./feature-libraries/index.js";
5657

5758
export {
@@ -287,10 +288,13 @@ export {
287288
exportCompatibilitySchemaSnapshot,
288289
importCompatibilitySchemaSnapshot,
289290
checkCompatibility,
291+
incrementalSummaryHint,
292+
incrementalEncodingPolicyForAllowedTypes,
290293
} from "./simple-tree/index.js";
291294
export {
292295
SharedTree,
293296
configuredSharedTree,
297+
configuredSharedTreeAlpha,
294298
configuredSharedTreeBeta,
295299
configuredSharedTreeBetaLegacy,
296300
} from "./treeFactory.js";

packages/dds/tree/src/shared-tree-core/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export {
2727
type SummaryElementParser,
2828
type SummaryElementStringifier,
2929
type ClonableSchemaAndPolicy,
30-
type SharedTreeCoreOptionsInternal as SharedTreCoreOptionsInternal,
30+
type SharedTreeCoreOptionsInternal,
3131
} from "./sharedTreeCore.js";
3232

3333
export type { ResubmitMachine } from "./resubmitMachine.js";

packages/dds/tree/src/shared-tree/sharedTree.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ import {
6464
makeSchemaCodec,
6565
makeTreeChunker,
6666
type IncrementalEncodingPolicy,
67-
type TreeCompressionStrategyPrivate,
6867
} from "../feature-libraries/index.js";
6968
// eslint-disable-next-line import-x/no-internal-modules
7069
import type { FormatV1 } from "../feature-libraries/schema-index/index.js";
@@ -75,7 +74,7 @@ import {
7574
type ClonableSchemaAndPolicy,
7675
getCodecTreeForEditManagerFormatWithChange,
7776
getCodecTreeForMessageFormatWithChange,
78-
type SharedTreCoreOptionsInternal,
77+
type SharedTreeCoreOptionsInternal,
7978
MessageFormatVersion,
8079
SharedTreeCore,
8180
EditManagerFormatVersion,
@@ -656,26 +655,19 @@ export function getCodecTreeForSharedTreeFormat(
656655
export type SharedTreeOptionsBeta = ForestOptions;
657656

658657
/**
659-
* Configuration options for SharedTree.
658+
* Configuration options for SharedTree with alpha features.
660659
* @alpha @input
661660
*/
662661
export interface SharedTreeOptions
663-
extends Partial<CodecWriteOptions>,
664-
Partial<SharedTreeFormatOptions>,
665-
SharedTreeOptionsBeta {
662+
extends SharedTreeOptionsBeta,
663+
Partial<CodecWriteOptions>,
664+
Partial<SharedTreeFormatOptions> {
666665
/**
667666
* Experimental feature flag to enable shared branches.
668667
* This feature is not yet complete and should not be used in production.
669668
* Defaults to false.
670669
*/
671670
readonly enableSharedBranches?: boolean;
672-
}
673-
674-
export interface SharedTreeOptionsInternal
675-
extends Partial<SharedTreCoreOptionsInternal>,
676-
Partial<ForestOptions>,
677-
Partial<SharedTreeFormatOptionsInternal> {
678-
disposeForksAfterTransaction?: boolean;
679671
/**
680672
* Returns whether a node / field should be incrementally encoded.
681673
* @remarks
@@ -684,6 +676,12 @@ export interface SharedTreeOptionsInternal
684676
shouldEncodeIncrementally?: IncrementalEncodingPolicy;
685677
}
686678

679+
export interface SharedTreeOptionsInternal
680+
extends SharedTreeOptions,
681+
Partial<SharedTreeCoreOptionsInternal> {
682+
disposeForksAfterTransaction?: boolean;
683+
}
684+
687685
/**
688686
* Configuration options for SharedTree's internal tree storage.
689687
* @beta @input
@@ -707,11 +705,6 @@ export interface SharedTreeFormatOptions {
707705
treeEncodeType: TreeCompressionStrategy;
708706
}
709707

710-
export interface SharedTreeFormatOptionsInternal
711-
extends Omit<SharedTreeFormatOptions, "treeEncodeType"> {
712-
treeEncodeType: TreeCompressionStrategyPrivate;
713-
}
714-
715708
/**
716709
* Used to distinguish between different forest types.
717710
* @remarks
@@ -814,6 +807,7 @@ export const defaultSharedTreeOptions: Required<SharedTreeOptionsInternal> = {
814807
shouldEncodeIncrementally: defaultIncrementalEncodingPolicy,
815808
editManagerFormatSelector: clientVersionToEditManagerFormatVersion,
816809
messageFormatSelector: clientVersionToMessageFormatVersion,
810+
enableSharedBranches: false,
817811
};
818812

819813
/**

0 commit comments

Comments
 (0)