From 2f4a3491e0a8593041e828964095cac77a31d0e8 Mon Sep 17 00:00:00 2001 From: Brian Hulette Date: Fri, 12 Jan 2018 13:11:20 -0500 Subject: [PATCH] Minor tweaks --- js/src/predicate.ts | 17 ++++++++++------- js/src/table.ts | 21 +++++++-------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/js/src/predicate.ts b/js/src/predicate.ts index 2b0be44d472dc..1fedc98d1c41e 100644 --- a/js/src/predicate.ts +++ b/js/src/predicate.ts @@ -19,11 +19,11 @@ export abstract class Value { } } -class Literal extends Value { +export class Literal extends Value { constructor(public v: T) { super(); } } -class Col extends Value { +export class Col extends Value { vector: Vector; colidx: number; @@ -55,7 +55,7 @@ export abstract class Predicate { ands(): Predicate[] { return [this]; } } -abstract class ComparisonPredicate extends Predicate { +export abstract class ComparisonPredicate extends Predicate { constructor(public readonly left: Value, public readonly right: Value) { super(); } @@ -105,7 +105,7 @@ class Or extends CombinationPredicate { } } -class Equals extends ComparisonPredicate { +export class Equals extends ComparisonPredicate { protected _bindLitLit(_: Vector[], left: Literal, right: Literal): PredicateFunc { const rtrn: boolean = left.v == right.v; return () => rtrn; @@ -121,6 +121,9 @@ class Equals extends ComparisonPredicate { const col_func = col.bind(cols); if (col.vector instanceof DictionaryVector) { // Assume that there is only one key with the value `lit.v` + // TODO: add lazily-computed reverse dictionary lookups, associated + // with col.vector.data so that we only have to do this once per + // dictionary let key = -1; for (; ++key < col.vector.data.length;) { if (col.vector.data.get(key) === lit.v) { @@ -146,7 +149,7 @@ class Equals extends ComparisonPredicate { } } -class LTeq extends ComparisonPredicate { +export class LTeq extends ComparisonPredicate { protected _bindLitLit(_: Vector[], left: Literal, right: Literal): PredicateFunc { const rtrn: boolean = left.v <= right.v; return () => rtrn; @@ -164,7 +167,7 @@ class LTeq extends ComparisonPredicate { } } -class GTeq extends ComparisonPredicate { +export class GTeq extends ComparisonPredicate { protected _bindLitLit(_: Vector[], left: Literal, right: Literal): PredicateFunc { const rtrn: boolean = left.v >= right.v; return () => rtrn; @@ -183,4 +186,4 @@ class GTeq extends ComparisonPredicate { } export function lit(n: number): Value { return new Literal(n); } -export function col(n: string): Value { return new Col(n); } +export function col(n: string): Col { return new Col(n); } diff --git a/js/src/table.ts b/js/src/table.ts index 613699f0b66b1..620a4a701c80f 100644 --- a/js/src/table.ts +++ b/js/src/table.ts @@ -37,8 +37,6 @@ export class TableRow { } export interface DataFrame { - readonly batches: Vector[][]; - readonly lengths: Uint32Array; filter(predicate: Predicate): DataFrame; scan(next: NextFunc): void; count(): number; @@ -129,23 +127,18 @@ export class Table implements DataFrame { } class FilteredDataFrame implements DataFrame { - readonly lengths: Uint32Array; - readonly batches: Vector[][]; - constructor (readonly parent: DataFrame, private predicate: Predicate) { - this.batches = parent.batches; - this.lengths = parent.lengths; - } + constructor (readonly parent: Table, private predicate: Predicate) {} scan(next: NextFunc) { // inlined version of this: // this.parent.scan((idx, columns) => { // if (this.predicate(idx, columns)) next(idx, columns); // }); - for (let batch = -1; ++batch < this.lengths.length;) { - const length = this.lengths[batch]; + for (let batch = -1; ++batch < this.parent.lengths.length;) { + const length = this.parent.lengths[batch]; // load batches - const columns = this.batches[batch]; + const columns = this.parent.batches[batch]; const predicate = this.predicate.bind(columns); // yield all indices @@ -163,11 +156,11 @@ class FilteredDataFrame implements DataFrame { // }); // return sum; let sum = 0; - for (let batch = -1; ++batch < this.lengths.length;) { - const length = this.lengths[batch]; + for (let batch = -1; ++batch < this.parent.lengths.length;) { + const length = this.parent.lengths[batch]; // load batches - const columns = this.batches[batch]; + const columns = this.parent.batches[batch]; const predicate = this.predicate.bind(columns); // yield all indices