@based/db 0.1.4 → 0.2.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/dist/lib/darwin_aarch64/include/cdefs.h +4 -0
- package/dist/lib/darwin_aarch64/include/selva/db.h +25 -5
- package/dist/lib/darwin_aarch64/include/selva/fields.h +34 -72
- package/dist/lib/darwin_aarch64/include/selva/selva_lang.h +7 -0
- package/dist/lib/darwin_aarch64/include/selva/types.h +9 -13
- package/dist/lib/darwin_aarch64/libdeflate.dylib +0 -0
- package/dist/lib/darwin_aarch64/libjemalloc_selva.2.dylib +0 -0
- package/dist/lib/darwin_aarch64/libnode-v22.node +0 -0
- package/dist/lib/darwin_aarch64/libnode-v23.node +0 -0
- package/dist/lib/darwin_aarch64/libnode-v24.node +0 -0
- package/dist/lib/darwin_aarch64/libnode-v25.node +0 -0
- package/dist/lib/darwin_aarch64/libselva.dylib +0 -0
- package/dist/lib/linux_aarch64/include/cdefs.h +4 -0
- package/dist/lib/linux_aarch64/include/selva/db.h +25 -5
- package/dist/lib/linux_aarch64/include/selva/fields.h +34 -72
- package/dist/lib/linux_aarch64/include/selva/selva_lang.h +7 -0
- package/dist/lib/linux_aarch64/include/selva/types.h +9 -13
- package/dist/lib/linux_aarch64/libdeflate.so +0 -0
- package/dist/lib/linux_aarch64/libnode-v22.node +0 -0
- package/dist/lib/linux_aarch64/libnode-v23.node +0 -0
- package/dist/lib/linux_aarch64/libnode-v24.node +0 -0
- package/dist/lib/linux_aarch64/libnode-v25.node +0 -0
- package/dist/lib/linux_aarch64/libselva.so +0 -0
- package/dist/lib/linux_x86_64/include/cdefs.h +4 -0
- package/dist/lib/linux_x86_64/include/selva/db.h +25 -5
- package/dist/lib/linux_x86_64/include/selva/fields.h +34 -72
- package/dist/lib/linux_x86_64/include/selva/selva_lang.h +7 -0
- package/dist/lib/linux_x86_64/include/selva/types.h +9 -13
- package/dist/lib/linux_x86_64/libdeflate.so +0 -0
- package/dist/lib/linux_x86_64/libnode-v22.node +0 -0
- package/dist/lib/linux_x86_64/libnode-v23.node +0 -0
- package/dist/lib/linux_x86_64/libnode-v24.node +0 -0
- package/dist/lib/linux_x86_64/libnode-v25.node +0 -0
- package/dist/lib/linux_x86_64/libselva.so +0 -0
- package/dist/src/client/modify/Tmp.d.ts +0 -1
- package/dist/src/client/modify/Tmp.js +14 -9
- package/dist/src/client/modify/create/index.js +6 -5
- package/dist/src/client/modify/drain.js +6 -2
- package/dist/src/client/modify/edges/binary.js +3 -2
- package/dist/src/client/modify/edges/reference.js +2 -3
- package/dist/src/client/modify/edges/references.js +2 -3
- package/dist/src/client/modify/edges/separate.js +4 -1
- package/dist/src/client/modify/edges/string.js +2 -3
- package/dist/src/client/modify/error.d.ts +29 -0
- package/dist/src/client/modify/error.js +10 -0
- package/dist/src/client/modify/props/alias.js +1 -1
- package/dist/src/client/modify/props/binary.js +1 -1
- package/dist/src/client/modify/props/cardinality.js +1 -1
- package/dist/src/client/modify/props/fixed.js +13 -14
- package/dist/src/client/modify/props/reference.js +2 -2
- package/dist/src/client/modify/props/references.js +7 -7
- package/dist/src/client/modify/props/string.js +1 -1
- package/dist/src/client/modify/props/vector.js +1 -11
- package/dist/src/client/modify/types.d.ts +1 -0
- package/dist/src/client/modify/types.js +1 -0
- package/dist/src/client/modify/validate.d.ts +1 -1
- package/dist/src/client/modify/validate.js +4 -3
- package/dist/src/client/query/BasedDbQuery.d.ts +4 -4
- package/dist/src/client/query/BasedDbQuery.js +23 -12
- package/dist/src/client/query/BasedQueryResponse.d.ts +0 -1
- package/dist/src/client/query/BasedQueryResponse.js +0 -3
- package/dist/src/client/query/aggregates/aggregation.d.ts +1 -1
- package/dist/src/client/query/aggregates/aggregation.js +123 -51
- package/dist/src/client/query/display.js +14 -8
- package/dist/src/client/query/filter/createFixedFilterBuffer.js +59 -22
- package/dist/src/client/query/filter/createReferenceFilter.js +13 -13
- package/dist/src/client/query/filter/createVariableFilterBuffer.js +6 -3
- package/dist/src/client/query/filter/filter.js +8 -0
- package/dist/src/client/query/filter/primitiveFilter.js +4 -1
- package/dist/src/client/query/filter/{toBuffer.d.ts → toByteCode.d.ts} +3 -2
- package/dist/src/client/query/filter/{toBuffer.js → toByteCode.js} +46 -12
- package/dist/src/client/query/filter/types.d.ts +1 -0
- package/dist/src/client/query/filter/types.js +33 -5
- package/dist/src/client/query/include/toByteCode.d.ts +2 -2
- package/dist/src/client/query/include/toByteCode.js +1 -1
- package/dist/src/client/query/query.d.ts +1 -1
- package/dist/src/client/query/query.js +1 -1
- package/dist/src/client/query/queryDef.js +6 -2
- package/dist/src/client/query/registerQuery.js +5 -9
- package/dist/src/client/query/subscription/index.js +5 -0
- package/dist/src/client/query/subscription/toByteCode.d.ts +6 -0
- package/dist/src/client/query/subscription/toByteCode.js +139 -0
- package/dist/src/client/query/subscription/types.d.ts +6 -0
- package/dist/src/client/query/subscription/types.js +7 -9
- package/dist/src/client/query/toByteCode/aggregates.d.ts +2 -0
- package/dist/src/client/query/toByteCode/aggregates.js +60 -0
- package/dist/src/client/query/toByteCode/alias.d.ts +2 -0
- package/dist/src/client/query/toByteCode/alias.js +24 -0
- package/dist/src/client/query/toByteCode/default.d.ts +2 -2
- package/dist/src/client/query/toByteCode/default.js +21 -24
- package/dist/src/client/query/toByteCode/id.d.ts +2 -0
- package/dist/src/client/query/toByteCode/id.js +17 -0
- package/dist/src/client/query/toByteCode/ids.d.ts +2 -0
- package/dist/src/client/query/toByteCode/ids.js +52 -0
- package/dist/src/client/query/toByteCode/offsets.d.ts +35 -0
- package/dist/src/client/query/toByteCode/offsets.js +36 -0
- package/dist/src/client/query/toByteCode/reference.d.ts +2 -0
- package/dist/src/client/query/toByteCode/reference.js +12 -0
- package/dist/src/client/query/toByteCode/references.d.ts +2 -0
- package/dist/src/client/query/toByteCode/references.js +35 -0
- package/dist/src/client/query/toByteCode/toByteCode.d.ts +4 -2
- package/dist/src/client/query/toByteCode/toByteCode.js +62 -189
- package/dist/src/client/query/types.d.ts +24 -5
- package/dist/src/client/query/validation.d.ts +5 -1
- package/dist/src/client/query/validation.js +15 -3
- package/dist/src/client/string.js +1 -1
- package/dist/src/hooks.js +2 -29
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/native.d.ts +8 -1
- package/dist/src/native.js +23 -2
- package/dist/src/server/index.d.ts +2 -0
- package/dist/src/server/index.js +11 -2
- package/dist/src/server/migrate/worker.js +87 -84
- package/dist/src/server/schema.js +3 -2
- package/dist/src/server/schemaSelvaBuffer.d.ts +4 -0
- package/dist/src/server/schemaSelvaBuffer.js +182 -0
- package/dist/src/server/subscription.d.ts +32 -0
- package/dist/src/server/subscription.js +275 -0
- package/dist/src/utils.js +2 -3
- package/package.json +5 -6
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { writeInt64, writeUint16, writeUint32 } from '@based/utils';
|
|
2
|
+
import native from '../../../native.js';
|
|
3
|
+
import { ID } from '../toByteCode/offsets.js';
|
|
4
|
+
import { QueryType } from '../types.js';
|
|
5
|
+
import { SubscriptionType } from './types.js';
|
|
6
|
+
export const collectFilters = (filter, fields, nowQueries = []) => {
|
|
7
|
+
if (filter.hasSubMeta) {
|
|
8
|
+
for (const [prop, conditions] of filter.conditions) {
|
|
9
|
+
if (fields) {
|
|
10
|
+
fields.add(prop);
|
|
11
|
+
}
|
|
12
|
+
for (const condition of conditions) {
|
|
13
|
+
if (condition.subscriptionMeta) {
|
|
14
|
+
if (condition.subscriptionMeta.now) {
|
|
15
|
+
nowQueries.push(...condition.subscriptionMeta.now);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
for (const prop of filter.conditions.keys()) {
|
|
23
|
+
if (fields) {
|
|
24
|
+
fields.add(prop);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (filter.or) {
|
|
29
|
+
collectFilters(filter.or, fields, nowQueries);
|
|
30
|
+
}
|
|
31
|
+
if (filter.and) {
|
|
32
|
+
collectFilters(filter.and, fields, nowQueries);
|
|
33
|
+
}
|
|
34
|
+
if (filter.references) {
|
|
35
|
+
for (const [prop, ref] of filter.references) {
|
|
36
|
+
if (fields) {
|
|
37
|
+
fields.add(prop);
|
|
38
|
+
}
|
|
39
|
+
collectFilters(ref, undefined, nowQueries);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return nowQueries;
|
|
43
|
+
};
|
|
44
|
+
export const collectFields = (def) => {
|
|
45
|
+
const fields = new Set();
|
|
46
|
+
if (def.include.main.len > 0) {
|
|
47
|
+
fields.add(0);
|
|
48
|
+
}
|
|
49
|
+
for (const prop of def.include.props.values()) {
|
|
50
|
+
fields.add(prop.def.prop);
|
|
51
|
+
}
|
|
52
|
+
for (const prop of def.references.keys()) {
|
|
53
|
+
fields.add(prop);
|
|
54
|
+
}
|
|
55
|
+
return fields;
|
|
56
|
+
};
|
|
57
|
+
export const collectTypes = (def, types = new Set()) => {
|
|
58
|
+
if ('references' in def) {
|
|
59
|
+
for (const ref of def.references.values()) {
|
|
60
|
+
types.add(ref.schema.id);
|
|
61
|
+
// TODO Now queries here...
|
|
62
|
+
collectTypes(ref, types);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if ('filter' in def && 'references' in def.filter) {
|
|
66
|
+
for (const ref of def.filter.references.values()) {
|
|
67
|
+
types.add(ref.schema.id);
|
|
68
|
+
collectTypes(ref);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return types;
|
|
72
|
+
};
|
|
73
|
+
export const registerSubscription = (query) => {
|
|
74
|
+
if (query.def.queryType === QueryType.id) {
|
|
75
|
+
// @ts-ignore
|
|
76
|
+
const id = query.def.target.id;
|
|
77
|
+
const fields = collectFields(query.def);
|
|
78
|
+
const typeId = query.def.schema.id;
|
|
79
|
+
const subId = native.crc32(query.buffer.subarray(ID.id + 4, query.buffer.byteLength - 4));
|
|
80
|
+
const headerLen = 16;
|
|
81
|
+
const types = collectTypes(query.def);
|
|
82
|
+
const nowQueries = collectFilters(query.def.filter, fields);
|
|
83
|
+
const buffer = new Uint8Array(headerLen + fields.size + types.size * 2 + nowQueries.length * 16);
|
|
84
|
+
buffer[0] = SubscriptionType.singleId;
|
|
85
|
+
writeUint32(buffer, subId, 1);
|
|
86
|
+
writeUint16(buffer, typeId, 5);
|
|
87
|
+
writeUint32(buffer, id, 7);
|
|
88
|
+
buffer[11] = fields.size;
|
|
89
|
+
writeUint16(buffer, types.size, 12);
|
|
90
|
+
writeUint16(buffer, nowQueries.length, 14);
|
|
91
|
+
let i = headerLen;
|
|
92
|
+
for (const field of fields) {
|
|
93
|
+
buffer[i] = field;
|
|
94
|
+
i++;
|
|
95
|
+
}
|
|
96
|
+
for (const type of types) {
|
|
97
|
+
writeUint16(buffer, type, i);
|
|
98
|
+
i += 2;
|
|
99
|
+
}
|
|
100
|
+
for (const now of nowQueries) {
|
|
101
|
+
buffer[i] = now.prop.prop;
|
|
102
|
+
buffer[i + 1] = now.ctx.operation;
|
|
103
|
+
writeUint16(buffer, now.ctx.typeId, i + 2);
|
|
104
|
+
writeInt64(buffer, now.offset, i + 4);
|
|
105
|
+
writeUint32(buffer, now.resolvedByteIndex, i + 12);
|
|
106
|
+
i += 16;
|
|
107
|
+
}
|
|
108
|
+
query.subscriptionBuffer = buffer;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const typeId = query.def.schema.id;
|
|
112
|
+
const types = collectTypes(query.def);
|
|
113
|
+
const nowQueries = collectFilters(query.def.filter, new Set());
|
|
114
|
+
const typeLen = types.has(typeId) ? types.size - 1 : types.size;
|
|
115
|
+
const headerLen = 8;
|
|
116
|
+
const buffer = new Uint8Array(headerLen + typeLen * 2 + nowQueries.length * 16);
|
|
117
|
+
buffer[0] = SubscriptionType.fullType;
|
|
118
|
+
writeUint16(buffer, typeId, 1);
|
|
119
|
+
writeUint16(buffer, typeLen, 3);
|
|
120
|
+
writeUint16(buffer, nowQueries.length, 5); // hopefully you dont have more then 255 now filters...
|
|
121
|
+
let i = headerLen;
|
|
122
|
+
for (const typeIdIt of types) {
|
|
123
|
+
if (typeIdIt !== typeId) {
|
|
124
|
+
writeUint16(buffer, typeIdIt, i);
|
|
125
|
+
i += 2;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const now of nowQueries) {
|
|
129
|
+
buffer[i] = now.prop.prop;
|
|
130
|
+
buffer[i + 1] = now.ctx.operation;
|
|
131
|
+
writeUint16(buffer, now.ctx.typeId, i + 2);
|
|
132
|
+
writeInt64(buffer, now.offset, i + 4);
|
|
133
|
+
writeUint32(buffer, now.resolvedByteIndex, i + 12);
|
|
134
|
+
i += 16;
|
|
135
|
+
}
|
|
136
|
+
query.subscriptionBuffer = buffer;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=toByteCode.js.map
|
|
@@ -3,3 +3,9 @@ export type OnData = (res: BasedQueryResponse) => any;
|
|
|
3
3
|
export type OnError = (err: Error) => any;
|
|
4
4
|
export type OnClose = () => any;
|
|
5
5
|
export type OnSubscription = (res: any, err?: Error) => void;
|
|
6
|
+
export declare enum SubscriptionType {
|
|
7
|
+
fullType = 0,
|
|
8
|
+
singleId = 1,
|
|
9
|
+
timeBasedSingleId = 2,// If any time in there just put it as 200ms for now...
|
|
10
|
+
timeBasedMulti = 3
|
|
11
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
// // filter - realy nice to add
|
|
9
|
-
// }
|
|
1
|
+
export var SubscriptionType;
|
|
2
|
+
(function (SubscriptionType) {
|
|
3
|
+
SubscriptionType[SubscriptionType["fullType"] = 0] = "fullType";
|
|
4
|
+
SubscriptionType[SubscriptionType["singleId"] = 1] = "singleId";
|
|
5
|
+
SubscriptionType[SubscriptionType["timeBasedSingleId"] = 2] = "timeBasedSingleId";
|
|
6
|
+
SubscriptionType[SubscriptionType["timeBasedMulti"] = 3] = "timeBasedMulti";
|
|
7
|
+
})(SubscriptionType || (SubscriptionType = {}));
|
|
10
8
|
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { filterToBuffer } from '../query.js';
|
|
2
|
+
import { QueryDefType, QueryType, } from '../types.js';
|
|
3
|
+
import { aggregateToBuffer, isRootCountOnly, } from '../aggregates/aggregation.js';
|
|
4
|
+
export const aggregatesQuery = (def) => {
|
|
5
|
+
const aggregateSize = def.aggregate.size || 0;
|
|
6
|
+
if (aggregateSize === 0) {
|
|
7
|
+
throw new Error('Wrong aggregate size (0)');
|
|
8
|
+
}
|
|
9
|
+
const filterSize = def.filter.size || 0;
|
|
10
|
+
if (def.type === QueryDefType.References) {
|
|
11
|
+
const buf = new Uint8Array(12 + filterSize + aggregateSize); // op + refSize + filterSize + offset + typeId + refField
|
|
12
|
+
const sz = 9 + filterSize + aggregateSize; // filterSize + offset + typeId + refField
|
|
13
|
+
buf[0] = 2 /* includeOp.REFS_AGGREGATION */;
|
|
14
|
+
buf[1] = sz;
|
|
15
|
+
buf[2] = sz >>> 8;
|
|
16
|
+
buf[3] = filterSize;
|
|
17
|
+
buf[4] = filterSize >>> 8;
|
|
18
|
+
buf[5] = def.range.offset;
|
|
19
|
+
buf[6] = def.range.offset >>> 8;
|
|
20
|
+
buf[7] = def.range.offset >>> 16;
|
|
21
|
+
buf[8] = def.range.offset >>> 24;
|
|
22
|
+
if (filterSize) {
|
|
23
|
+
buf.set(filterToBuffer(def.filter, 9), 9);
|
|
24
|
+
}
|
|
25
|
+
// required to get typeEntry and fieldSchema
|
|
26
|
+
buf[9 + filterSize] = def.schema.idUint8[0]; // typeId
|
|
27
|
+
buf[9 + 1 + filterSize] = def.schema.idUint8[1]; // typeId
|
|
28
|
+
buf[9 + 2 + filterSize] = def.target.propDef.prop; // refField
|
|
29
|
+
const aggregateBuffer = aggregateToBuffer(def.aggregate);
|
|
30
|
+
buf.set(aggregateBuffer, 9 + 3 + filterSize);
|
|
31
|
+
return { buffer: buf, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const buf = new Uint8Array(16 + filterSize + aggregateSize);
|
|
35
|
+
buf[0] = isRootCountOnly(def, filterSize)
|
|
36
|
+
? QueryType.aggregatesCountType
|
|
37
|
+
: QueryType.aggregates;
|
|
38
|
+
buf[1] = def.schema.idUint8[0];
|
|
39
|
+
buf[2] = def.schema.idUint8[1];
|
|
40
|
+
buf[3] = def.range.offset;
|
|
41
|
+
buf[4] = def.range.offset >>> 8;
|
|
42
|
+
buf[5] = def.range.offset >>> 16;
|
|
43
|
+
buf[6] = def.range.offset >>> 24;
|
|
44
|
+
buf[7] = def.range.limit;
|
|
45
|
+
buf[8] = def.range.limit >>> 8;
|
|
46
|
+
buf[9] = def.range.limit >>> 16;
|
|
47
|
+
buf[10] = def.range.limit >>> 24;
|
|
48
|
+
buf[11] = filterSize;
|
|
49
|
+
buf[12] = filterSize >>> 8;
|
|
50
|
+
if (filterSize) {
|
|
51
|
+
buf.set(filterToBuffer(def.filter, 13), 13);
|
|
52
|
+
}
|
|
53
|
+
const aggregateBuffer = aggregateToBuffer(def.aggregate);
|
|
54
|
+
buf[14 + filterSize] = aggregateSize;
|
|
55
|
+
buf[15 + filterSize] = aggregateSize >>> 8;
|
|
56
|
+
buf.set(aggregateBuffer, 16 + filterSize);
|
|
57
|
+
return { buffer: buf, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=aggregates.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { filterToBuffer } from '../query.js';
|
|
2
|
+
import { QueryType } from '../types.js';
|
|
3
|
+
import { ENCODER, writeUint16 } from '@based/utils';
|
|
4
|
+
export const aliasQuery = (def) => {
|
|
5
|
+
const filterSize = def.filter.size || 0;
|
|
6
|
+
const alias = def.target.resolvedAlias;
|
|
7
|
+
const aliasStr = ENCODER.encode(alias.value);
|
|
8
|
+
const aliasLen = aliasStr.byteLength;
|
|
9
|
+
const buf = new Uint8Array(8 + filterSize + aliasLen);
|
|
10
|
+
buf[0] = QueryType.alias;
|
|
11
|
+
writeUint16(buf, def.schema.id, 1);
|
|
12
|
+
buf[3] = alias.def.prop;
|
|
13
|
+
buf[4] = aliasLen;
|
|
14
|
+
buf[5] = aliasLen >>> 8;
|
|
15
|
+
buf.set(aliasStr, 6);
|
|
16
|
+
buf[6 + aliasLen] = filterSize;
|
|
17
|
+
buf[7 + aliasLen] = filterSize >>> 8;
|
|
18
|
+
if (filterSize) {
|
|
19
|
+
const x = filterToBuffer(def.filter, 8 + aliasLen);
|
|
20
|
+
buf.set(x, 8 + aliasLen);
|
|
21
|
+
}
|
|
22
|
+
return { buffer: buf, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=alias.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { QueryDef } from '../types.js';
|
|
2
|
-
export declare const defaultQuery: (def: QueryDef, filterSize: number, sortSize: number, searchSize: number, sort: Uint8Array, search: Uint8Array) =>
|
|
1
|
+
import { QueryDef, IntermediateByteCode } from '../types.js';
|
|
2
|
+
export declare const defaultQuery: (def: QueryDef, filterSize: number, sortSize: number, searchSize: number, sort: Uint8Array, search: Uint8Array) => IntermediateByteCode;
|
|
@@ -1,38 +1,35 @@
|
|
|
1
1
|
import { filterToBuffer, isSimpleMainFilter } from '../query.js';
|
|
2
2
|
import { QueryType } from '../types.js';
|
|
3
|
+
import { writeUint16, writeUint32 } from '@based/utils';
|
|
4
|
+
import { DEFAULT } from './offsets.js';
|
|
3
5
|
export const defaultQuery = (def, filterSize, sortSize, searchSize, sort, search) => {
|
|
4
|
-
const
|
|
6
|
+
const buffer = new Uint8Array(DEFAULT.baseSize + filterSize + sortSize + searchSize);
|
|
5
7
|
let index = 0;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
buf[index++] = def.range.limit >>> 24;
|
|
17
|
-
buf[index++] = filterSize;
|
|
18
|
-
buf[index++] = filterSize >>> 8;
|
|
19
|
-
buf[index++] = filterSize && isSimpleMainFilter(def.filter) ? 1 : 0;
|
|
8
|
+
buffer[index++] = QueryType.default;
|
|
9
|
+
writeUint16(buffer, def.schema.id, index);
|
|
10
|
+
index += 2;
|
|
11
|
+
writeUint32(buffer, def.range.offset, index);
|
|
12
|
+
index += 4;
|
|
13
|
+
writeUint32(buffer, def.range.limit, index);
|
|
14
|
+
index += 4;
|
|
15
|
+
writeUint16(buffer, filterSize, index);
|
|
16
|
+
index += 2;
|
|
17
|
+
buffer[index++] = filterSize && isSimpleMainFilter(def.filter) ? 1 : 0;
|
|
20
18
|
if (filterSize) {
|
|
21
|
-
|
|
19
|
+
buffer.set(filterToBuffer(def.filter, index), index);
|
|
22
20
|
index += filterSize;
|
|
23
21
|
}
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
writeUint16(buffer, sortSize, index);
|
|
23
|
+
index += 2;
|
|
26
24
|
if (sortSize) {
|
|
27
|
-
|
|
25
|
+
buffer.set(sort, index);
|
|
28
26
|
index += sortSize;
|
|
29
27
|
}
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
writeUint16(buffer, searchSize, index);
|
|
29
|
+
index += 2;
|
|
32
30
|
if (searchSize) {
|
|
33
|
-
|
|
34
|
-
index += searchSize;
|
|
31
|
+
buffer.set(search, index);
|
|
35
32
|
}
|
|
36
|
-
return
|
|
33
|
+
return { buffer, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
37
34
|
};
|
|
38
35
|
//# sourceMappingURL=default.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { filterToBuffer } from '../query.js';
|
|
2
|
+
import { QueryType } from '../types.js';
|
|
3
|
+
import { writeUint16, writeUint32 } from '@based/utils';
|
|
4
|
+
import { ID } from './offsets.js';
|
|
5
|
+
export const idQuery = (def) => {
|
|
6
|
+
const filterSize = def.filter.size || 0;
|
|
7
|
+
const buffer = new Uint8Array(ID.baseSize + filterSize);
|
|
8
|
+
buffer[ID.queryType] = QueryType.id;
|
|
9
|
+
writeUint16(buffer, def.schema.id, ID.type);
|
|
10
|
+
writeUint32(buffer, def.target.id, ID.id);
|
|
11
|
+
writeUint16(buffer, filterSize, ID.filterSize);
|
|
12
|
+
if (filterSize) {
|
|
13
|
+
buffer.set(filterToBuffer(def.filter, ID.filter), ID.filter);
|
|
14
|
+
}
|
|
15
|
+
return { buffer, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=id.js.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { filterToBuffer } from '../query.js';
|
|
2
|
+
import { QueryType } from '../types.js';
|
|
3
|
+
import { searchToBuffer } from '../search/index.js';
|
|
4
|
+
import { createSortBuffer } from '../sort.js';
|
|
5
|
+
import { writeUint16, writeUint32 } from '@based/utils';
|
|
6
|
+
import { IDS } from './offsets.js';
|
|
7
|
+
export const idsQuery = (def) => {
|
|
8
|
+
const filterSize = def.filter.size || 0;
|
|
9
|
+
let sort;
|
|
10
|
+
let sortSize = 0;
|
|
11
|
+
if (def.sort) {
|
|
12
|
+
sort = createSortBuffer(def.sort);
|
|
13
|
+
sortSize = sort.byteLength;
|
|
14
|
+
}
|
|
15
|
+
let search;
|
|
16
|
+
let searchSize = 0;
|
|
17
|
+
if (def.search) {
|
|
18
|
+
search = searchToBuffer(def.search);
|
|
19
|
+
searchSize = def.search.size;
|
|
20
|
+
}
|
|
21
|
+
const idsSize = def.target.ids.length * 4;
|
|
22
|
+
const buffer = new Uint8Array(IDS.baseSize + idsSize + filterSize + sortSize + searchSize);
|
|
23
|
+
let index = 0;
|
|
24
|
+
buffer[IDS.queryType] = QueryType.ids;
|
|
25
|
+
writeUint16(buffer, def.schema.id, IDS.type);
|
|
26
|
+
writeUint32(buffer, idsSize, IDS.idsSize);
|
|
27
|
+
buffer.set(new Uint8Array(def.target.ids.buffer), IDS.idsValue);
|
|
28
|
+
index = IDS.idsValue + idsSize;
|
|
29
|
+
writeUint32(buffer, def.range.offset, index);
|
|
30
|
+
index += 4;
|
|
31
|
+
writeUint32(buffer, def.range.limit, index);
|
|
32
|
+
index += 4;
|
|
33
|
+
writeUint16(buffer, filterSize, index);
|
|
34
|
+
index += 2;
|
|
35
|
+
if (filterSize) {
|
|
36
|
+
buffer.set(filterToBuffer(def.filter, index), index);
|
|
37
|
+
index += filterSize;
|
|
38
|
+
}
|
|
39
|
+
writeUint16(buffer, sortSize, index);
|
|
40
|
+
index += 2;
|
|
41
|
+
if (sortSize) {
|
|
42
|
+
buffer.set(sort, index);
|
|
43
|
+
index += sortSize;
|
|
44
|
+
}
|
|
45
|
+
writeUint16(buffer, searchSize, index);
|
|
46
|
+
index += 2;
|
|
47
|
+
if (searchSize) {
|
|
48
|
+
buffer.set(search, index);
|
|
49
|
+
}
|
|
50
|
+
return { buffer, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=ids.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const ID: {
|
|
2
|
+
baseSize: number;
|
|
3
|
+
queryType: number;
|
|
4
|
+
type: number;
|
|
5
|
+
id: number;
|
|
6
|
+
filterSize: number;
|
|
7
|
+
filter: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const IDS: {
|
|
10
|
+
baseSize: number;
|
|
11
|
+
queryType: number;
|
|
12
|
+
type: number;
|
|
13
|
+
idsSize: number;
|
|
14
|
+
idsValue: number;
|
|
15
|
+
};
|
|
16
|
+
export declare const REFERENCES: {
|
|
17
|
+
baseSize: number;
|
|
18
|
+
includeOp: number;
|
|
19
|
+
size: number;
|
|
20
|
+
filterSize: number;
|
|
21
|
+
sortSize: number;
|
|
22
|
+
offset: number;
|
|
23
|
+
limit: number;
|
|
24
|
+
filter: number;
|
|
25
|
+
};
|
|
26
|
+
export declare const REFERENCE: {
|
|
27
|
+
baseSize: number;
|
|
28
|
+
includeOp: number;
|
|
29
|
+
sizeOffset: number;
|
|
30
|
+
type: number;
|
|
31
|
+
prop: number;
|
|
32
|
+
};
|
|
33
|
+
export declare const DEFAULT: {
|
|
34
|
+
baseSize: number;
|
|
35
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const ID = {
|
|
2
|
+
baseSize: 9, // queryType(1) + type(2) + id(4) + filterSize(2)
|
|
3
|
+
queryType: 0,
|
|
4
|
+
type: 1,
|
|
5
|
+
id: 3,
|
|
6
|
+
filterSize: 7,
|
|
7
|
+
filter: 9,
|
|
8
|
+
};
|
|
9
|
+
export const IDS = {
|
|
10
|
+
baseSize: 21, // queryType(1) + type(2) + idsSize(4) + offset(4) + limit(4) + filterSize(2) + sortSize(2) + searchSize(2)
|
|
11
|
+
queryType: 0,
|
|
12
|
+
type: 1,
|
|
13
|
+
idsSize: 3,
|
|
14
|
+
idsValue: 7,
|
|
15
|
+
};
|
|
16
|
+
export const REFERENCES = {
|
|
17
|
+
baseSize: 18, // includeOp(1) + size(2) + filterSize(2) + sortSize(2) + offset(4) + limit(4) + type(2) + prop(1)
|
|
18
|
+
includeOp: 0,
|
|
19
|
+
size: 1,
|
|
20
|
+
filterSize: 3,
|
|
21
|
+
sortSize: 5,
|
|
22
|
+
offset: 7,
|
|
23
|
+
limit: 11,
|
|
24
|
+
filter: 15,
|
|
25
|
+
};
|
|
26
|
+
export const REFERENCE = {
|
|
27
|
+
baseSize: 6, // includeOp(1) + size(2) + type(2) + prop(1)
|
|
28
|
+
includeOp: 0,
|
|
29
|
+
sizeOffset: 1,
|
|
30
|
+
type: 3,
|
|
31
|
+
prop: 5,
|
|
32
|
+
};
|
|
33
|
+
export const DEFAULT = {
|
|
34
|
+
baseSize: 18, // queryType(1) + type(2) + offset(4) + limit(4) + filterSize(2) + isSimple(1) + sortSize(2) + searchSize(2)
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=offsets.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { writeUint16 } from '@based/utils';
|
|
2
|
+
import { REFERENCE } from './offsets.js';
|
|
3
|
+
export const referenceQuery = (def, size) => {
|
|
4
|
+
const buffer = new Uint8Array(REFERENCE.baseSize);
|
|
5
|
+
const sz = size + 3;
|
|
6
|
+
buffer[REFERENCE.includeOp] = 5 /* includeOp.REFERENCE */;
|
|
7
|
+
writeUint16(buffer, sz, REFERENCE.sizeOffset);
|
|
8
|
+
writeUint16(buffer, def.schema.id, REFERENCE.type);
|
|
9
|
+
buffer[REFERENCE.prop] = def.target.propDef.prop;
|
|
10
|
+
return { buffer, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { filterToBuffer } from '../query.js';
|
|
2
|
+
import { createSortBuffer } from '../sort.js';
|
|
3
|
+
import { writeUint16, writeUint32 } from '@based/utils';
|
|
4
|
+
import { REFERENCES } from './offsets.js';
|
|
5
|
+
export const referencesQuery = (def, size) => {
|
|
6
|
+
const filterSize = def.filter.size || 0;
|
|
7
|
+
let sort;
|
|
8
|
+
let sortSize = 0;
|
|
9
|
+
if (def.sort) {
|
|
10
|
+
sort = createSortBuffer(def.sort);
|
|
11
|
+
sortSize = sort.byteLength;
|
|
12
|
+
}
|
|
13
|
+
const modsSize = filterSize + sortSize;
|
|
14
|
+
const buffer = new Uint8Array(REFERENCES.baseSize + modsSize);
|
|
15
|
+
const sz = size + 7 + modsSize + 8;
|
|
16
|
+
buffer[REFERENCES.includeOp] = 4 /* includeOp.REFERENCES */;
|
|
17
|
+
writeUint16(buffer, sz, REFERENCES.size);
|
|
18
|
+
writeUint16(buffer, filterSize, REFERENCES.filterSize);
|
|
19
|
+
writeUint16(buffer, sortSize, REFERENCES.sortSize);
|
|
20
|
+
writeUint32(buffer, def.range.offset, REFERENCES.offset);
|
|
21
|
+
writeUint32(buffer, def.range.limit, REFERENCES.limit);
|
|
22
|
+
let index = REFERENCES.filter;
|
|
23
|
+
if (filterSize) {
|
|
24
|
+
buffer.set(filterToBuffer(def.filter, index), index);
|
|
25
|
+
index += filterSize;
|
|
26
|
+
}
|
|
27
|
+
if (sort) {
|
|
28
|
+
buffer.set(sort, index);
|
|
29
|
+
index += sortSize;
|
|
30
|
+
}
|
|
31
|
+
writeUint16(buffer, def.schema.id, index);
|
|
32
|
+
buffer[index + 2] = def.target.propDef.prop;
|
|
33
|
+
return { buffer, def, needsMetaResolve: def.filter.hasSubMeta };
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=references.js.map
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import { QueryDef } from '../types.js';
|
|
1
|
+
import { IntermediateByteCode, QueryDef } from '../types.js';
|
|
2
2
|
import { DbClient } from '../../index.js';
|
|
3
|
-
|
|
3
|
+
import { BasedDbQuery } from '../BasedDbQuery.js';
|
|
4
|
+
export declare function defToBuffer(db: DbClient, def: QueryDef): IntermediateByteCode[];
|
|
5
|
+
export declare const queryToBuffer: (query: BasedDbQuery) => Uint8Array<ArrayBuffer>;
|