Skip to content

Commit 53d82c2

Browse files
Implement Load Enumerations Request
1 parent 39c1304 commit 53d82c2

File tree

8 files changed

+2728
-443
lines changed

8 files changed

+2728
-443
lines changed

src/TileDBClient/TileDBClient.ts

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,24 @@ import {
77
OrganizationApi,
88
NotebookApi,
99
TasksApi,
10-
UserApi
10+
UserApi,
11+
LoadEnumerationsRequest
1112
} from '../v1';
1213
import UDF from '../UDF';
1314
import Sql from '../Sql';
1415
import Groups from '../Groups';
15-
import { ConfigurationParameters, Configuration, Layout } from '../v2';
16+
import {
17+
ConfigurationParameters,
18+
Configuration,
19+
Layout,
20+
Datatype
21+
} from '../v2';
1622
import TileDBQuery from '../TileDBQuery';
23+
import bufferToData from '../utils/bufferToData';
24+
import groupValuesByOffsetBytes from '../utils/groupValuesByOffsetBytes';
25+
import convertToArray from '../utils/convertToArray';
26+
import getByteLengthOfDatatype from '../utils/getByteLengthOfDatatype';
27+
import concatChars from '../utils/concatChars';
1728

1829
interface NotebookOrFileDimensions {
1930
contents: number[];
@@ -94,6 +105,88 @@ class TileDBClient {
94105
return this.ArrayApi.getArrayMetadata(namespace, array, options);
95106
}
96107

108+
public async loadEnumerationsRequest(
109+
namespace: string,
110+
array: string,
111+
config: {
112+
enumerations: string[];
113+
enumerationsMaxSize?: string;
114+
enumerationsTotalSize?: string;
115+
}
116+
) {
117+
const {
118+
enumerations,
119+
enumerationsMaxSize = '10485760',
120+
enumerationsTotalSize = '52428800'
121+
} = config;
122+
const loadEnumerationsOptions: LoadEnumerationsRequest = {
123+
config: {
124+
entries: [
125+
{
126+
key: 'sm.enumerations_max_size',
127+
value: enumerationsMaxSize
128+
},
129+
{
130+
key: 'sm.enumerations_max_total_size',
131+
value: enumerationsTotalSize
132+
}
133+
]
134+
},
135+
enumerations: enumerations
136+
};
137+
const response = await this.ArrayApi.loadEnumerations(
138+
namespace,
139+
array,
140+
loadEnumerationsOptions
141+
);
142+
143+
const resultPromises = response.data.enumerations.map(async enumeration => {
144+
const { type, data, name, offsets } = enumeration;
145+
// Data is returned as array of numbers, convert it to buffer
146+
const dataBuffer = Uint8Array.from(data).buffer;
147+
let values: any = bufferToData(dataBuffer, type as Datatype);
148+
149+
// In case of var-length data, use offsets to get results
150+
if (offsets && offsets.length) {
151+
/**
152+
* Convert offsets from uint8 array to uint64
153+
* Uint8 array: 0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0
154+
* Uint64 array: 0, 3, 8
155+
*/
156+
const offsetsBuffer = Uint8Array.from(offsets).buffer;
157+
const byteOffsets = Array.from(new BigUint64Array(offsetsBuffer));
158+
// Get how many bytes this type is
159+
const BYTE_PER_ELEMENT = getByteLengthOfDatatype(type as Datatype);
160+
/**
161+
* Convert offsets by bytes to offsets by element,
162+
* since some primitives are more than 1 byte long.
163+
*/
164+
const offsetsAsNumbers = byteOffsets.map(o =>
165+
Number(o / BigInt(BYTE_PER_ELEMENT))
166+
);
167+
168+
const groupedValues = await groupValuesByOffsetBytes(
169+
convertToArray(values),
170+
offsetsAsNumbers
171+
);
172+
173+
const valueIsString = typeof values === 'string';
174+
values = valueIsString
175+
? concatChars(groupedValues as string[][])
176+
: (groupedValues as number[][] | bigint[][]);
177+
}
178+
179+
return {
180+
name: name,
181+
type: type,
182+
values
183+
};
184+
});
185+
const result = await Promise.all(resultPromises);
186+
187+
return result;
188+
}
189+
97190
public arrayActivity(
98191
namespace: string,
99192
array: string,

src/TileDBQuery/TileDBQuery.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import dataToQuery from '../utils/dataToQuery';
22
import capnpQueryDeSerializer from '../utils/deserialization/capnpQueryDeSerializer';
3-
import { ArrayApi, ArraySchema } from '../v1';
3+
import { ArrayApi } from '../v1';
44
import {
5+
ArraySchema,
56
AttributeBufferHeader,
67
Configuration,
78
ConfigurationParameters,

src/fixtures/attributes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Datatype } from '../v1';
1+
import { Datatype } from '../v2';
22

33
export const fixedLenAttributesSchema = [
44
{

src/fixtures/attributesAndDomains.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Attribute, Dimension, Datatype } from '../v1';
1+
import { Attribute, Dimension, Datatype } from '../v2';
22

33
const attributesAndDomains: Array<Dimension | Attribute> = [
44
{

src/utils/attributeValuesToArrayBuffers/attributeValuesToArrayBuffers.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { AttributeValues } from '../../TileDBQuery';
2-
import { Attribute, Dimension } from '../../v1';
32
import dataToArrayBuffer from '../dataToArrayBuffer';
4-
import { Datatype } from '../../v2';
3+
import { Datatype, Attribute, Dimension } from '../../v2';
54
import mapToBigIntIfNeeded from '../mapToBigIntIfNeeded';
65

76
interface ValueBuffer {

src/utils/dataToQueryWriter/dataToQueryWriter.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { Dimension } from '../../v1';
21
import { ValueBuffers } from '../attributeValuesToArrayBuffers';
3-
import { Querystatus, Querytype } from '../../v2';
2+
import { Querystatus, Querytype, Dimension } from '../../v2';
43
import getRanges from '../getRanges';
54
import { QueryWrite } from '../../TileDBQuery';
65
import flatten from '../flatten';

src/utils/getWriterBody/getWriterBody.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ArraySchema } from '../../v1';
2+
import { Dimension, Attribute } from '../../v2';
23
import dataToQueryWriter from '../dataToQueryWriter';
34
import attributeValuesToArrayBuffers from '../attributeValuesToArrayBuffers';
45
import capnpQuerySerializer from '../serialization/capnpQuerySerializer';
@@ -8,8 +9,8 @@ import { QueryWrite } from '../../TileDBQuery';
89
const emptyArrayBuffer = new ArrayBuffer(0);
910

1011
const getWriterBody = (data: QueryWrite, arraySchema: ArraySchema) => {
11-
const dimensions = arraySchema.domain.dimensions;
12-
const attributes = arraySchema.attributes;
12+
const dimensions = arraySchema.domain.dimensions as Dimension[];
13+
const attributes = arraySchema.attributes as Attribute[];
1314
const valueBuffers = attributeValuesToArrayBuffers(
1415
data.values,
1516
dimensions,

0 commit comments

Comments
 (0)