@cloudbitmaps/roaring 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PRIVACY.md +3 -3
- package/README.md +6 -5
- package/dist/bin/export-segments.js +76 -25
- package/dist/bin/export-segments.js.map +2 -2
- package/dist/index.d.ts +22 -11
- package/dist/index.js +76 -25
- package/dist/index.js.map +2 -2
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -136,14 +136,17 @@ export interface CacheOptions {
|
|
|
136
136
|
/**
|
|
137
137
|
* Ceiling on how many segments' `.crbm` readers (each holding a parsed index) the store keeps open at once
|
|
138
138
|
* (default 1024) — the steady-state memory bound for a long-running server that reads across many segments.
|
|
139
|
-
* Past it the least-recently-used segment's reader is evicted; re-opening it later is one cheap tail GET.
|
|
139
|
+
* Past it the least-recently-used segment's reader is evicted; re-opening it later is one cheap tail GET. A reader of a small generation, one whose whole object came with its tail read,
|
|
140
|
+
* also holds its chunk bytes, so a read of it makes no chunk request until the reader is evicted or the pointer refresh
|
|
141
|
+
* moves it on; a store with no timed refresh (`genTtlMs: 0`, or no registry) keeps none.
|
|
140
142
|
* Applies whenever the store builds its own read path — a backend or a bare `IStorageDriver`. A pre-built
|
|
141
143
|
* `StorageChunkSource` manages its own reader cache.
|
|
142
144
|
*/
|
|
143
145
|
readonly readerMax?: number;
|
|
144
146
|
/**
|
|
145
|
-
* Aggregate byte ceiling on what the open readers hold, their parsed `.crbm` indices
|
|
146
|
-
* generation carries
|
|
147
|
+
* Aggregate byte ceiling on what the open readers hold, their parsed `.crbm` indices, the metadata a
|
|
148
|
+
* generation carries, and the chunk bytes a reader keeps when its tail read returned a whole object whose chunks
|
|
149
|
+
* total at most this ceiling divided by {@link CacheOptions.readerMax} (default 64 MiB) — the byte half
|
|
147
150
|
* of the memory bound, complementing the {@link CacheOptions.readerMax} *count* bound. A wide/dense segment's
|
|
148
151
|
* parsed index can reach about 1.3 MB, so a count-only bound could let the open readers pin over a GB and blow a small
|
|
149
152
|
* heap (e.g. a 128 MB Lambda); this evicts the least-recently-used reader once the summed index footprint
|
|
@@ -959,11 +962,15 @@ export declare class CloudRoaring {
|
|
|
959
962
|
*/
|
|
960
963
|
export interface BaseCombineOptions extends IdRange {
|
|
961
964
|
/**
|
|
962
|
-
*
|
|
963
|
-
*
|
|
964
|
-
*
|
|
965
|
-
*
|
|
966
|
-
* `concurrency`
|
|
965
|
+
* How far ahead each operand is read: a positive integer, default 32. The library's own stores read each operand as
|
|
966
|
+
* one stream of coalesced ranges (chunks that sit near each other are one request), and `concurrency` is how many
|
|
967
|
+
* range requests a stream holds ahead of the read, in flight or landed and not yet used. So about
|
|
968
|
+
* `concurrency × operands` requests are in flight at most, and, since a range is at most 1 MiB (one chunk, when a chunk
|
|
969
|
+
* is larger), about `concurrency × operands` MiB are held, whatever the segment's size. The stream opens 4 ranges wide
|
|
970
|
+
* (or `concurrency`, if lower) and widens as ranges are taken, so a read that stops early has asked for little past
|
|
971
|
+
* where it stopped, and a read that fits one range makes one request however many chunks it needs. A source that
|
|
972
|
+
* reads chunk by chunk (a custom one) is read as before: `concurrency` chunk keys at once, opening 8 wide. A running
|
|
973
|
+
* stream holds its operand's reader outside the reader cache's bounds until it ends or the segment moves on.
|
|
967
974
|
*/
|
|
968
975
|
readonly concurrency?: number;
|
|
969
976
|
/** Override the store's per-op denial-of-wallet budget for this call (`false` lifts it). */
|
|
@@ -1318,12 +1325,14 @@ export declare class Segment {
|
|
|
1318
1325
|
/**
|
|
1319
1326
|
* Chunk-skipping intersection: stream the ids in **this** segment AND every segment in `others`, ascending.
|
|
1320
1327
|
* Fetches only the Storage chunks present in *all* operands (a key absent from any operand contributes nothing
|
|
1321
|
-
* and is never downloaded),
|
|
1322
|
-
* (Lambda-friendly) regardless of segment size. Pass `concurrency` to tune that window (
|
|
1328
|
+
* and is never downloaded), reading each operand's as coalesced ranges under a bounded in-flight window — so the Storage
|
|
1329
|
+
* footprint stays small (Lambda-friendly) regardless of segment size. Pass `concurrency` to tune that window (the range
|
|
1330
|
+
* requests held ahead per operand: a positive integer, 32 by default).
|
|
1323
1331
|
* AND is commutative, so `a.intersect([b])` and `b.intersect([a])` yield the same ids. Pass `budget` to
|
|
1324
1332
|
* override the store's per-op denial-of-wallet budget for this call (or `false` to lift it).
|
|
1325
1333
|
*/
|
|
1326
1334
|
intersect(others: Segment[], options?: CombineOptions): IdStream;
|
|
1335
|
+
private intersectAs;
|
|
1327
1336
|
/**
|
|
1328
1337
|
* Materialize `this ∩ others…` (minus `exclude`) as a **new generation of `dest`** — `dest`'s previous contents
|
|
1329
1338
|
* are superseded, not added to. Streaming + bounded-memory; the result is one immutable object published
|
|
@@ -1356,6 +1365,7 @@ export declare class Segment {
|
|
|
1356
1365
|
* segment once (`unionInto`, or a load) is the cheaper shape.
|
|
1357
1366
|
*/
|
|
1358
1367
|
union(others: Segment[], options?: CombineOptions): IdStream;
|
|
1368
|
+
private unionAs;
|
|
1359
1369
|
/** Materialize `this ∪ others…` (minus `exclude`) as a **new generation of `dest`** — see {@link intersectInto}. */
|
|
1360
1370
|
unionInto(dest: Segment, others: Segment[], options?: MaterializeOptions): Promise<MaterializeResult>;
|
|
1361
1371
|
/**
|
|
@@ -1374,6 +1384,7 @@ export declare class Segment {
|
|
|
1374
1384
|
* the suppression folds into the same pass rather than materializing an intermediate segment first.
|
|
1375
1385
|
*/
|
|
1376
1386
|
andNot(excludes: Segment[], options?: BaseCombineOptions): IdStream;
|
|
1387
|
+
private andNotAs;
|
|
1377
1388
|
/** Materialize `this \ (excludes…)` as a **new generation of `dest`** — see {@link intersectInto}. */
|
|
1378
1389
|
andNotInto(dest: Segment, excludes: Segment[], options?: AndNotIntoOptions): Promise<MaterializeResult>;
|
|
1379
1390
|
/**
|
|
@@ -1389,4 +1400,4 @@ export declare class Segment {
|
|
|
1389
1400
|
}): Promise<CostReport>;
|
|
1390
1401
|
}
|
|
1391
1402
|
export { MemoryStorage, LocalFsStorage, CrbmStorageChunkSource, destroySegment, eraseNamespace, excludingReservedRows, readRetentionPolicy, MIN_EXPIRES_AT_MS, InProcessKeystore, NodeAead, aadFor, CloudRoaringError, ValidationError, WriteConflictError, IntegrityError, NotFoundError, UnsupportedError, CapabilityError, TransientError, KeyUnavailableError, BudgetExceededError, isCloudRoaringError, isWriteConflictError, isTransientError, isNotFoundError, isIntegrityError, isValidationError, CrbmReader, BufferReader, CountingMetricsSink, RecordingAuditSink, DEFAULT_RETRY_POLICY, AWS_US_EAST_1_ONDEMAND, ELASTICACHE_REDIS_US_EAST_1_ONDEMAND, ONE_REDIS_HA_CLUSTER, } from '@cloudbitmaps/core';
|
|
1392
|
-
export type { Aead, AeadSealed, AuditEvent, BlobReader, BlobSink, Budget, BudgetOption, ChunkRef, Clock, CodecBitmap, CodecInterface, ConsistencyErrorEntry, ConsistencyIssue, ConsistencyReport, CostReport, CrbmCrypto, CrbmReaderOptions, CrbmStorageChunkSourceOptions, DestroyResult, ClearRegistrySummary, DropResult, EncodedChunk, EraseDeps, EstimateInput, ExportFailure, ExportFormat, ExportManifest, ExportOptions, ExportSink, ExportWriter, ExportedSegment, GenKey, GenerationEntry, GenerationMetadata, GovernanceMeta, IAuditSink, IKeystore, IMetricsSink, IRegistryDriver, IStorageDriver, IdRange, InProcessKeystoreOptions, LoadGuard, LoadInput, LoadOptions, LoadRefusal, LoadResult, LocalFsStorageOptions, MemoryStorageOptions, MetricEvent, MetricOpName, MetricsSnapshot, NewRegistryRecord, PinnedAt, PinnedObject, PortableBitmap, PricingProfile, RedisNodeType, RedisSizing, RegCaps, RegistryPatch, RegistryRecord, RegistryStatus, RegistrySummary, RetentionPolicy, RetireEntry, RetireExpiredOptions, RetireExpiredResult, RetryPolicy, Rng, RollbackResult, SealedRegistrySummary, SegmentInfo, SegmentRef, SegmentSize, SegmentSizing, SetRetentionResult, StorageBackend, StorageCaps, StorageChunkSource, Token, Workload, WrappedDek, } from '@cloudbitmaps/core';
|
|
1403
|
+
export type { Aead, AeadSealed, AuditEvent, BlobReader, BlobSink, Budget, BudgetOption, ChunkRef, Clock, CodecBitmap, CodecInterface, ConsistencyErrorEntry, ConsistencyIssue, ConsistencyReport, CostReport, CrbmCrypto, CrbmReaderOptions, CrbmStorageChunkSourceOptions, DestroyResult, ClearRegistrySummary, DropResult, EncodedChunk, EraseDeps, EstimateInput, ExportFailure, ExportFormat, ExportManifest, ExportOptions, ExportSink, ExportWriter, ExportedSegment, GenKey, GenerationEntry, GenerationMetadata, GovernanceMeta, IAuditSink, IKeystore, IMetricsSink, IRegistryDriver, IStorageDriver, IdRange, InProcessKeystoreOptions, LoadGuard, LoadInput, LoadOptions, LoadRefusal, LoadResult, LocalFsStorageOptions, MemoryStorageOptions, MetricEvent, MetricOpName, MetricsSnapshot, NewRegistryRecord, PinnedAt, PinnedObject, PortableBitmap, PricingProfile, RedisNodeType, RedisSizing, RegCaps, RegistryPatch, RegistryRecord, RegistryStatus, RegistrySummary, RegistryWriteOptions, RetentionPolicy, RetireEntry, RetireExpiredOptions, RetireExpiredResult, RetryPolicy, Rng, RollbackResult, SealedRegistrySummary, SegmentInfo, SegmentRef, SegmentSize, SegmentSizing, SetRetentionResult, StorageBackend, StorageCaps, StorageChunkSource, Token, Workload, WrappedDek, } from '@cloudbitmaps/core';
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
estimateCost,
|
|
24
24
|
groundedReport,
|
|
25
25
|
loadSegment,
|
|
26
|
+
loadSegmentChunks,
|
|
26
27
|
mapWithConcurrency,
|
|
27
28
|
resolveBudget,
|
|
28
29
|
resolvePerOpBudget,
|
|
@@ -450,7 +451,8 @@ function bitmapAsLoadInput(input) {
|
|
|
450
451
|
var roaringCodec = {
|
|
451
452
|
empty: () => SafeBitmap.empty(),
|
|
452
453
|
fromValues: (values) => SafeBitmap.fromValues(values),
|
|
453
|
-
safeDeserialize: (bytes, maxBytes, options) => SafeBitmap.safeDeserialize(bytes, maxBytes, options)
|
|
454
|
+
safeDeserialize: (bytes, maxBytes, options) => SafeBitmap.safeDeserialize(bytes, maxBytes, options),
|
|
455
|
+
owns: (bitmap) => bitmap instanceof SafeBitmap
|
|
454
456
|
};
|
|
455
457
|
|
|
456
458
|
// src/system-clock.ts
|
|
@@ -875,7 +877,7 @@ var CloudRoaring = class _CloudRoaring {
|
|
|
875
877
|
const metadata = options?.metadata;
|
|
876
878
|
let result;
|
|
877
879
|
try {
|
|
878
|
-
|
|
880
|
+
const loadOptions = {
|
|
879
881
|
...options?.allowEmpty === void 0 ? {} : { allowEmpty: options.allowEmpty },
|
|
880
882
|
...options?.guard === void 0 ? {} : { guard: options.guard },
|
|
881
883
|
...metadata === void 0 ? {} : { metadata },
|
|
@@ -888,7 +890,8 @@ var CloudRoaring = class _CloudRoaring {
|
|
|
888
890
|
// as a side effect of adding a guard whose entire purpose is preventing data loss. Opt in with `keep`.
|
|
889
891
|
keep: options?.keep ?? KEEP_EVERY_GENERATION,
|
|
890
892
|
...options?.audit === void 0 ? {} : { audit: options.audit }
|
|
891
|
-
}
|
|
893
|
+
};
|
|
894
|
+
result = ids instanceof CombineChunks ? await loadSegmentChunks(dest, ids.chunks, deps, loadOptions) : await loadSegment(dest, ids, deps, loadOptions);
|
|
892
895
|
} finally {
|
|
893
896
|
this.engine.invalidate(dest);
|
|
894
897
|
}
|
|
@@ -1692,6 +1695,32 @@ var EMPTY_IDS = {
|
|
|
1692
1695
|
async *batches() {
|
|
1693
1696
|
}
|
|
1694
1697
|
};
|
|
1698
|
+
var AS_IDS = {
|
|
1699
|
+
none: EMPTY_IDS,
|
|
1700
|
+
failing,
|
|
1701
|
+
intersect: (engine, refs, opts) => withBatches(engine.intersect(refs, opts), () => engine.intersectBatches(refs, opts)),
|
|
1702
|
+
union: (engine, refs, opts) => withBatches(engine.union(refs, opts), () => engine.unionBatches(refs, opts)),
|
|
1703
|
+
andNot: (engine, base, refs, opts) => withBatches(engine.andNot(base, refs, opts), () => engine.andNotBatches(base, refs, opts))
|
|
1704
|
+
};
|
|
1705
|
+
var NO_CHUNKS = {
|
|
1706
|
+
async *[Symbol.asyncIterator]() {
|
|
1707
|
+
}
|
|
1708
|
+
};
|
|
1709
|
+
var CombineChunks = class {
|
|
1710
|
+
constructor(chunks) {
|
|
1711
|
+
this.chunks = chunks;
|
|
1712
|
+
}
|
|
1713
|
+
chunks;
|
|
1714
|
+
};
|
|
1715
|
+
var AS_CHUNKS = {
|
|
1716
|
+
none: NO_CHUNKS,
|
|
1717
|
+
failing: (err) => ({
|
|
1718
|
+
[Symbol.asyncIterator]: () => ({ next: () => Promise.reject(err) })
|
|
1719
|
+
}),
|
|
1720
|
+
intersect: (engine, refs, opts) => engine.intersectChunks(refs, opts),
|
|
1721
|
+
union: (engine, refs, opts) => engine.unionChunks(refs, opts),
|
|
1722
|
+
andNot: (engine, base, refs, opts) => engine.andNotChunks(base, refs, opts)
|
|
1723
|
+
};
|
|
1695
1724
|
var KEEP_EVERY_GENERATION = Number.MAX_SAFE_INTEGER;
|
|
1696
1725
|
var makeSegment;
|
|
1697
1726
|
var minting = false;
|
|
@@ -1983,23 +2012,27 @@ var Segment = class _Segment {
|
|
|
1983
2012
|
/**
|
|
1984
2013
|
* Chunk-skipping intersection: stream the ids in **this** segment AND every segment in `others`, ascending.
|
|
1985
2014
|
* Fetches only the Storage chunks present in *all* operands (a key absent from any operand contributes nothing
|
|
1986
|
-
* and is never downloaded),
|
|
1987
|
-
* (Lambda-friendly) regardless of segment size. Pass `concurrency` to tune that window (
|
|
2015
|
+
* and is never downloaded), reading each operand's as coalesced ranges under a bounded in-flight window — so the Storage
|
|
2016
|
+
* footprint stays small (Lambda-friendly) regardless of segment size. Pass `concurrency` to tune that window (the range
|
|
2017
|
+
* requests held ahead per operand: a positive integer, 32 by default).
|
|
1988
2018
|
* AND is commutative, so `a.intersect([b])` and `b.intersect([a])` yield the same ids. Pass `budget` to
|
|
1989
2019
|
* override the store's per-op denial-of-wallet budget for this call (or `false` to lift it).
|
|
1990
2020
|
*/
|
|
1991
2021
|
intersect(others, options) {
|
|
1992
|
-
|
|
2022
|
+
return this.intersectAs(AS_IDS, others, options);
|
|
2023
|
+
}
|
|
2024
|
+
intersectAs(out, others, options) {
|
|
2025
|
+
if (this.expired() || others.some((o) => o.expired())) return out.none;
|
|
1993
2026
|
const exclude = this.liveExcludes(options);
|
|
1994
2027
|
let engine;
|
|
1995
2028
|
try {
|
|
1996
2029
|
engine = this.combineEngine([this, ...others, ...exclude]) ?? this.engine;
|
|
1997
2030
|
} catch (err) {
|
|
1998
|
-
return failing(err);
|
|
2031
|
+
return out.failing(err);
|
|
1999
2032
|
}
|
|
2000
2033
|
const refs = [this.ref, ...others.map((o) => o.ref)];
|
|
2001
2034
|
const opts = this.refsIn(options, exclude);
|
|
2002
|
-
return
|
|
2035
|
+
return out.intersect(engine, refs, opts);
|
|
2003
2036
|
}
|
|
2004
2037
|
/**
|
|
2005
2038
|
* Materialize `this ∩ others…` (minus `exclude`) as a **new generation of `dest`** — `dest`'s previous contents
|
|
@@ -2026,7 +2059,12 @@ var Segment = class _Segment {
|
|
|
2026
2059
|
this.combineEngine([this, ...others, ...options?.exclude ?? []]);
|
|
2027
2060
|
return this.timed(
|
|
2028
2061
|
"intersectInto",
|
|
2029
|
-
() => this.materialize(
|
|
2062
|
+
() => this.materialize(
|
|
2063
|
+
dest.ref,
|
|
2064
|
+
new CombineChunks(this.intersectAs(AS_CHUNKS, others, options)),
|
|
2065
|
+
"intersectInto",
|
|
2066
|
+
options
|
|
2067
|
+
)
|
|
2030
2068
|
);
|
|
2031
2069
|
}
|
|
2032
2070
|
/**
|
|
@@ -2040,26 +2078,29 @@ var Segment = class _Segment {
|
|
|
2040
2078
|
* segment once (`unionInto`, or a load) is the cheaper shape.
|
|
2041
2079
|
*/
|
|
2042
2080
|
union(others, options) {
|
|
2081
|
+
return this.unionAs(AS_IDS, others, options);
|
|
2082
|
+
}
|
|
2083
|
+
unionAs(out, others, options) {
|
|
2043
2084
|
const live = others.filter((o) => !o.expired());
|
|
2044
2085
|
if (this.expired()) {
|
|
2045
|
-
if (live.length === 0) return
|
|
2046
|
-
return live[0].
|
|
2086
|
+
if (live.length === 0) return out.none;
|
|
2087
|
+
return live[0].unionAs(out, live.slice(1), options);
|
|
2047
2088
|
}
|
|
2048
2089
|
if (live.length === 0 && others.length > 0) {
|
|
2049
2090
|
const exclude2 = this.liveExcludes(options);
|
|
2050
|
-
return exclude2.length > 0 ? this.
|
|
2091
|
+
return exclude2.length > 0 ? this.andNotAs(out, [...exclude2], options) : this.unionAs(out, [], options);
|
|
2051
2092
|
}
|
|
2052
|
-
if (live.length !== others.length) return this.
|
|
2093
|
+
if (live.length !== others.length) return this.unionAs(out, live, options);
|
|
2053
2094
|
const exclude = this.liveExcludes(options);
|
|
2054
2095
|
let engine;
|
|
2055
2096
|
try {
|
|
2056
2097
|
engine = this.combineEngine([this, ...others, ...exclude]) ?? this.engine;
|
|
2057
2098
|
} catch (err) {
|
|
2058
|
-
return failing(err);
|
|
2099
|
+
return out.failing(err);
|
|
2059
2100
|
}
|
|
2060
2101
|
const refs = [this.ref, ...others.map((o) => o.ref)];
|
|
2061
2102
|
const opts = this.refsIn(options, exclude);
|
|
2062
|
-
return
|
|
2103
|
+
return out.union(engine, refs, opts);
|
|
2063
2104
|
}
|
|
2064
2105
|
/** Materialize `this ∪ others…` (minus `exclude`) as a **new generation of `dest`** — see {@link intersectInto}. */
|
|
2065
2106
|
async unionInto(dest, others, options) {
|
|
@@ -2067,7 +2108,12 @@ var Segment = class _Segment {
|
|
|
2067
2108
|
this.combineEngine([this, ...others, ...options?.exclude ?? []]);
|
|
2068
2109
|
return this.timed(
|
|
2069
2110
|
"unionInto",
|
|
2070
|
-
() => this.materialize(
|
|
2111
|
+
() => this.materialize(
|
|
2112
|
+
dest.ref,
|
|
2113
|
+
new CombineChunks(this.unionAs(AS_CHUNKS, others, options)),
|
|
2114
|
+
"unionInto",
|
|
2115
|
+
options
|
|
2116
|
+
)
|
|
2071
2117
|
);
|
|
2072
2118
|
}
|
|
2073
2119
|
/**
|
|
@@ -2086,25 +2132,25 @@ var Segment = class _Segment {
|
|
|
2086
2132
|
* the suppression folds into the same pass rather than materializing an intermediate segment first.
|
|
2087
2133
|
*/
|
|
2088
2134
|
andNot(excludes, options) {
|
|
2089
|
-
|
|
2135
|
+
return this.andNotAs(AS_IDS, excludes, options);
|
|
2136
|
+
}
|
|
2137
|
+
andNotAs(out, excludes, options) {
|
|
2138
|
+
if (this.expired()) return out.none;
|
|
2090
2139
|
const liveExcludes = excludes.filter((e) => !e.expired());
|
|
2091
2140
|
if (liveExcludes.length === 0 && excludes.length > 0) {
|
|
2092
|
-
return this.
|
|
2141
|
+
return this.unionAs(out, [], options == null ? void 0 : readOptions(options));
|
|
2093
2142
|
}
|
|
2094
|
-
if (liveExcludes.length !== excludes.length) return this.
|
|
2143
|
+
if (liveExcludes.length !== excludes.length) return this.andNotAs(out, liveExcludes, options);
|
|
2095
2144
|
let engine;
|
|
2096
2145
|
try {
|
|
2097
2146
|
engine = this.combineEngine([this, ...excludes]) ?? this.engine;
|
|
2098
2147
|
} catch (err) {
|
|
2099
|
-
return failing(err);
|
|
2148
|
+
return out.failing(err);
|
|
2100
2149
|
}
|
|
2101
2150
|
const base = this.ref;
|
|
2102
2151
|
const refs = excludes.map((o) => o.ref);
|
|
2103
2152
|
const opts = options == null ? void 0 : readOptions(options);
|
|
2104
|
-
return
|
|
2105
|
-
engine.andNot(base, refs, opts),
|
|
2106
|
-
() => engine.andNotBatches(base, refs, opts)
|
|
2107
|
-
);
|
|
2153
|
+
return out.andNot(engine, base, refs, opts);
|
|
2108
2154
|
}
|
|
2109
2155
|
/** Materialize `this \ (excludes…)` as a **new generation of `dest`** — see {@link intersectInto}. */
|
|
2110
2156
|
async andNotInto(dest, excludes, options) {
|
|
@@ -2112,7 +2158,12 @@ var Segment = class _Segment {
|
|
|
2112
2158
|
this.combineEngine([this, ...excludes]);
|
|
2113
2159
|
return this.timed(
|
|
2114
2160
|
"andNotInto",
|
|
2115
|
-
() => this.materialize(
|
|
2161
|
+
() => this.materialize(
|
|
2162
|
+
dest.ref,
|
|
2163
|
+
new CombineChunks(this.andNotAs(AS_CHUNKS, excludes, options)),
|
|
2164
|
+
"andNotInto",
|
|
2165
|
+
options
|
|
2166
|
+
)
|
|
2116
2167
|
);
|
|
2117
2168
|
}
|
|
2118
2169
|
/**
|