Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
738fabb
WIP streaming data builders
trxcllnt Feb 1, 2019
ff32cbb
fix date builder tests
trxcllnt Feb 3, 2019
9e5e3ea
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6ebaa36
WIP streaming data builders
trxcllnt Feb 1, 2019
2f423ec
fix date builder tests
trxcllnt Feb 3, 2019
c609266
fix bool builder, add primitive builder tests
trxcllnt Feb 4, 2019
6b7a20e
ensure 64-bit int builders use BN to check for nulls
trxcllnt Feb 6, 2019
8a5c713
show a better error message if gulp fails
trxcllnt Mar 20, 2019
cf5f778
return signed or unsigned 53bit integers
trxcllnt Mar 20, 2019
6e64c40
ensure builder allocates aligned buffers, null bitmaps initialized to…
trxcllnt Mar 20, 2019
2b7b992
ensure union typeids buffer is an Int8Array
trxcllnt Mar 20, 2019
f7fe8c1
update builder buffer padding
trxcllnt Apr 7, 2019
1398ebd
don't clone Dictionary DataType instances in Schema assign to preserv…
trxcllnt Apr 8, 2019
fb2c9a2
cleanup
trxcllnt Apr 9, 2019
2f36741
move stream methods to io folder
trxcllnt Apr 15, 2019
385fee3
fix typo
trxcllnt Apr 15, 2019
d193141
add helper method to return the stride for a datatype
trxcllnt Apr 15, 2019
70377a1
add vectorname getter to chunked for completion
trxcllnt Apr 15, 2019
f8760cb
enumerate each type key individually now that they're a real thing
trxcllnt Apr 15, 2019
9ba9965
update row type inference sanity check
trxcllnt Apr 15, 2019
4c2ef42
add the rest of the builder types
trxcllnt Apr 15, 2019
a307273
fix readable-stream detection in firefox
trxcllnt Apr 16, 2019
f651657
update typescript, ts-jest, jest
trxcllnt Apr 16, 2019
f708190
use safe BigInt64Array constructor
trxcllnt Apr 17, 2019
15ac17c
use Object.setPrototypeOf to improve bn performance
trxcllnt May 11, 2019
0990344
add Builder throughDOM and throughNode transform streams
trxcllnt May 17, 2019
2b7a63c
update test types
trxcllnt May 22, 2019
79bfd46
fix node and dom builder streams
trxcllnt May 22, 2019
26387c7
update typescript, finish streaming builders, add comprehensive build…
trxcllnt May 27, 2019
fd46163
fix nan checks
trxcllnt May 27, 2019
d032e2d
update dependencies
trxcllnt May 27, 2019
86a6cd0
update closure compiler dependency
trxcllnt May 27, 2019
c587c33
add BufferBuilders, clean up public Builder API
trxcllnt May 29, 2019
0209e9d
update to typescript 3.5
trxcllnt May 30, 2019
84beb68
remove some property getters, clean up
trxcllnt May 30, 2019
dddba1a
ensure variablewidthbuilder supports random insertion
trxcllnt May 31, 2019
893c74f
ensure ListBuilder supports random insertion
trxcllnt Jun 1, 2019
c2673ac
add initial builder jsdoc
trxcllnt Jun 4, 2019
5b990c3
Clean up typedoc output, update typedoc to master to use typescript@3…
trxcllnt Jun 5, 2019
b2556b7
add docstring for _InternalEmptyPlaceholderRecordBatch
trxcllnt Jun 5, 2019
4b5375e
remove unnecessary jsdoc
trxcllnt Jun 5, 2019
5d4b0be
ensure bitmapbufferbuilder increments and decrements _popCount approp…
trxcllnt Jun 5, 2019
e974444
fix lint
trxcllnt Jun 5, 2019
5aea4f9
Add more specific Int64 and Uint64 Builder tests
trxcllnt Jun 5, 2019
3adf555
adds or updates most of the high-level Vector.from() methods to use t…
trxcllnt Jun 6, 2019
f250845
use a better default dictionary builder hash function
trxcllnt Jun 6, 2019
13b51db
print more details about each message
trxcllnt Jun 6, 2019
8659323
add test for builder iterable byte queueing strategy
trxcllnt Jun 6, 2019
ba755ad
use 53 bit hash fn to further avoid collisions
trxcllnt Jun 6, 2019
9c3a865
ensure byteLength is calculated for offsets buffer
trxcllnt Jun 6, 2019
c0f7f7b
fix a few minor formatting issues in arrow2csv
trxcllnt Jun 7, 2019
05acad8
fix minor row serialization issues to be compatible with console.table()
trxcllnt Jun 7, 2019
4d2a4f0
regenerate flatbuffer source from current format schemas
trxcllnt Jun 7, 2019
8b0752f
fix possible AsyncRandomAccessFile race condition retrieving filehand…
trxcllnt Jun 7, 2019
07fa443
remove default dictionary hash function
trxcllnt Jun 19, 2019
7998d2a
add createIsValidFunction example docstring
trxcllnt Jun 19, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion js/.vscode/launch.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -37,8 +37,17 @@
// "TEST_MODULE": "umd"
},
"args": [
// "-i",
"-i",
"test/unit/",
// "test/unit/builders/",

// "test/unit/builders/builder-tests.ts",
// "test/unit/builders/int64-tests.ts",
// "test/unit/builders/uint64-tests.ts",
// "test/unit/builders/date-tests.ts",
// "test/unit/builders/primitive-tests.ts",
// "test/unit/builders/dictionary-tests.ts",
// "test/unit/builders/utf8-tests.ts",

// Uncomment any of these to run individual test suites
// "test/unit/int-tests.ts",
Expand Down
36 changes: 30 additions & 6 deletions js/bin/print-buffer-alignment.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,29 +22,45 @@
const fs = require('fs');
const path = require('path');
const extension = process.env.ARROW_JS_DEBUG === 'src' ? '.ts' : '';
const { AsyncMessageReader } = require(`../index${extension}`);
const { RecordBatch, AsyncMessageReader } = require(`../index${extension}`);
const { VectorLoader } = require(`../targets/apache-arrow/visitor/vectorloader`);

(async () => {

const readable = process.argv.length < 3 ? process.stdin : fs.createReadStream(path.resolve(process.argv[2]));
const reader = new AsyncMessageReader(readable);

let recordBatchIndex = 0, dictionaryBatchIndex = 0;
let schema, recordBatchIndex = 0, dictionaryBatchIndex = 0;

for await (let message of reader) {

let bufferRegions = [];

if (message.isSchema()) {
schema = message.header();
continue;
} else if (message.isRecordBatch()) {
bufferRegions = message.header().buffers;
const header = message.header();
bufferRegions = header.buffers;
const body = await reader.readMessageBody(message.bodyLength);
console.log(`record batch ${++recordBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadRecordBatch(schema, header, body);
console.log(`record batch ${++recordBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
})}`);
} else if (message.isDictionaryBatch()) {
bufferRegions = message.header().data.buffers;
const header = message.header();
bufferRegions = header.data.buffers;
const type = schema.dictionaries.get(header.id);
const body = await reader.readMessageBody(message.bodyLength);
console.log(`dictionary batch ${++dictionaryBatchIndex}, byteOffset ${body.byteOffset}`);
const recordBatch = loadDictionaryBatch(header.data, body, type);
console.log(`dictionary batch ${++dictionaryBatchIndex}: ${JSON.stringify({
offset: body.byteOffset,
length: body.byteLength,
numRows: recordBatch.length,
dictionaryId: header.id,
})}`);
}

bufferRegions.forEach(({ offset, length }, i) => {
Expand All@@ -55,3 +71,11 @@ const { AsyncMessageReader } = require(`../index${extension}`);
await reader.return();

})().catch((e) => { console.error(e); process.exit(1); });

function loadRecordBatch(schema, header, body) {
return new RecordBatch(schema, header.length, new VectorLoader(body, header.nodes, header.buffers).visitMany(schema.fields));
}

function loadDictionaryBatch(header, body, dictionaryType) {
return RecordBatch.new(new VectorLoader(body, header.nodes, header.buffers).visitMany([dictionaryType]));
}
1 change: 0 additions & 1 deletion js/gulp/closure-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -99,7 +99,6 @@ const createClosureArgs = (entry_point, externs) => ({
// formatting: `PRETTY_PRINT`,
// debug: true,
compilation_level: `ADVANCED`,
allow_method_call_decomposing: true,
package_json_entry_names: `module,jsnext:main,main`,
assume_function_wrapper: true,
js_output_file: `${mainExport}.js`,
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/test-task.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,7 +32,7 @@ const parseXML = promisify(require('xml2js').parseString);
const jestArgv = [];
argv.verbose && jestArgv.push(`--verbose`);
argv.coverage
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`)
? jestArgv.push(`-c`, `jest.coverage.config.js`, `--coverage`, `-i`)
: jestArgv.push(`-c`, `jest.config.js`, `-i`)

const jest = path.join(path.parse(require.resolve(`jest`)).dir, `../bin/jest.js`);
Expand Down
2 changes: 1 addition & 1 deletion js/gulp/util.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -129,7 +129,7 @@ function spawnGulpCommandInChildProcess(command, target, format) {
env: { ...process.env, NODE_NO_WARNINGS: `1` }
};
return asyncDone(() => child_process.spawn(`node`, args, opts))
.catch((e) => { throw { message: `${command}:${taskName(target, format)}` }; });
.catch((e) => { throw `Error in "${command}:${taskName(target, format)}" task`; });
}

const logAndDie = (e) => { if (e) { process.exit(1); } };
Expand Down
Loading