Skip to content

Commit adf94c3

Browse files
committed
move writeArray() into buffer v2 from base
1 parent 7ce8469 commit adf94c3

File tree

2 files changed

+59
-60
lines changed

2 files changed

+59
-60
lines changed

src/buffer/base.ts

Lines changed: 2 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
DEFAULT_MAX_BUFFER_SIZE,
1111
} from "./index";
1212
import {
13-
ArrayPrimitive,
1413
isInteger,
1514
timestampToMicros,
1615
timestampToNanos,
@@ -27,8 +26,8 @@ const DEFAULT_MAX_NAME_LENGTH = 127;
2726
abstract class SenderBufferBase implements SenderBuffer {
2827
private bufferSize: number;
2928
private readonly maxBufferSize: number;
30-
private buffer: Buffer<ArrayBuffer>;
31-
private position: number;
29+
protected buffer: Buffer<ArrayBuffer>;
30+
protected position: number;
3231
private endOfLastRow: number;
3332

3433
private hasTable: boolean;
@@ -398,43 +397,6 @@ abstract class SenderBufferBase implements SenderBuffer {
398397
this.position = this.buffer.writeDoubleLE(data, this.position);
399398
}
400399

401-
protected writeArray(
402-
arr: unknown[],
403-
dimensions: number[],
404-
type: ArrayPrimitive,
405-
) {
406-
this.checkCapacity([], 1 + dimensions.length * 4);
407-
this.writeByte(dimensions.length);
408-
for (let i = 0; i < dimensions.length; i++) {
409-
this.writeInt(dimensions[i]);
410-
}
411-
412-
this.checkCapacity([], SenderBufferBase.arraySize(dimensions, type));
413-
this.writeArrayValues(arr, dimensions);
414-
}
415-
416-
private writeArrayValues(arr: unknown[], dimensions: number[]) {
417-
if (Array.isArray(arr[0])) {
418-
for (let i = 0; i < arr.length; i++) {
419-
this.writeArrayValues(arr[i] as unknown[], dimensions);
420-
}
421-
} else {
422-
const type = typeof arr[0];
423-
switch (type) {
424-
case "number":
425-
for (let i = 0; i < arr.length; i++) {
426-
this.position = this.buffer.writeDoubleLE(
427-
arr[i] as number,
428-
this.position,
429-
);
430-
}
431-
break;
432-
default:
433-
throw new Error(`Unsupported array type [type=${type}]`);
434-
}
435-
}
436-
}
437-
438400
private writeEscaped(data: string, quoted = false) {
439401
for (const ch of data) {
440402
if (ch > "\\") {
@@ -471,25 +433,6 @@ abstract class SenderBufferBase implements SenderBuffer {
471433
}
472434
}
473435
}
474-
475-
private static arraySize(dimensions: number[], type: ArrayPrimitive): number {
476-
let numOfElements = 1;
477-
for (let i = 0; i < dimensions.length; i++) {
478-
numOfElements *= dimensions[i];
479-
}
480-
481-
switch (type) {
482-
case "number":
483-
return numOfElements * 8;
484-
case "boolean":
485-
return numOfElements;
486-
case "string":
487-
// in case of string[] capacity check is done separately for each array element
488-
return 0;
489-
default:
490-
throw new Error(`Unsupported array type [type=${type}]`);
491-
}
492-
}
493436
}
494437

495438
export { SenderBufferBase };

src/buffer/bufferv2.ts

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { SenderOptions } from "../options";
33
import { SenderBuffer } from "./index";
44
import { SenderBufferBase } from "./base";
5-
import { getDimensions, validateArray } from "../utils";
5+
import { ArrayPrimitive, getDimensions, validateArray } from "../utils";
66

77
const COLUMN_TYPE_DOUBLE: number = 10;
88
const COLUMN_TYPE_NULL: number = 33;
@@ -65,6 +65,62 @@ class SenderBufferV2 extends SenderBufferBase {
6565
});
6666
return this;
6767
}
68+
69+
private writeArray(
70+
arr: unknown[],
71+
dimensions: number[],
72+
type: ArrayPrimitive,
73+
) {
74+
this.checkCapacity([], 1 + dimensions.length * 4);
75+
this.writeByte(dimensions.length);
76+
for (let i = 0; i < dimensions.length; i++) {
77+
this.writeInt(dimensions[i]);
78+
}
79+
80+
this.checkCapacity([], SenderBufferV2.arraySize(dimensions, type));
81+
this.writeArrayValues(arr, dimensions);
82+
}
83+
84+
private writeArrayValues(arr: unknown[], dimensions: number[]) {
85+
if (Array.isArray(arr[0])) {
86+
for (let i = 0; i < arr.length; i++) {
87+
this.writeArrayValues(arr[i] as unknown[], dimensions);
88+
}
89+
} else {
90+
const type = typeof arr[0];
91+
switch (type) {
92+
case "number":
93+
for (let i = 0; i < arr.length; i++) {
94+
this.position = this.buffer.writeDoubleLE(
95+
arr[i] as number,
96+
this.position,
97+
);
98+
}
99+
break;
100+
default:
101+
throw new Error(`Unsupported array type [type=${type}]`);
102+
}
103+
}
104+
}
105+
106+
private static arraySize(dimensions: number[], type: ArrayPrimitive): number {
107+
let numOfElements = 1;
108+
for (let i = 0; i < dimensions.length; i++) {
109+
numOfElements *= dimensions[i];
110+
}
111+
112+
switch (type) {
113+
case "number":
114+
return numOfElements * 8;
115+
case "boolean":
116+
return numOfElements;
117+
case "string":
118+
// in case of string[] capacity check is done separately for each array element
119+
return 0;
120+
default:
121+
throw new Error(`Unsupported array type [type=${type}]`);
122+
}
123+
}
68124
}
69125

70126
export { SenderBufferV2 };

0 commit comments

Comments
 (0)