Skip to content

Commit

Permalink
reimplement part of d3-array
Browse files Browse the repository at this point in the history
  • Loading branch information
sgratzl committed Dec 14, 2018
1 parent 9f0074b commit 0b58a79
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/builder/adapter/column.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {extent} from 'd3-array';
import {extent} from '../../internal';
import {
EAdvancedSortMethod,
IAction,
Expand Down
2 changes: 1 addition & 1 deletion src/builder/column/NumberColumnBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {min, max} from 'd3-array';
import {min, max} from '../../internal/math';
import {EAdvancedSortMethod, ESortMethod, INumberColumnDesc, IMapAbleDesc} from '../../model';
import ColumnBuilder from './ColumnBuilder';

Expand Down
55 changes: 53 additions & 2 deletions src/internal/math.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {ICategory, UIntTypedArray, IndicesArray} from '../model';
import {bisectLeft} from 'd3-array';
import {IForEachAble, isIndicesAble, ISequence} from './interable';
import {IPoorManWorkerScope, toFunctionBody} from './worker';
import {createWorkerCodeBlob} from '../provider/worker';
import {createWorkerCodeBlob} from './worker';

export interface INumberBin {
x0: number;
Expand Down Expand Up @@ -89,7 +89,58 @@ export interface IHistGenerator {
toBin(value: number): number;
}

function quantile(values: Float32Array, quantile: number, length = values.length) {
export function min<T>(values: T[], acc: (v: T) => number) {
let min = Number.POSITIVE_INFINITY;
for (const d of values) {
const v = acc(d);
if (v < min) {
min = v;
}
}
return min;
}

export function max<T>(values: T[], acc: (v: T) => number) {
let max = Number.NEGATIVE_INFINITY;
for (const d of values) {
const v = acc(d);
if (v > max) {
max = v;
}
}
return max;
}

export function extent<T>(values: T[], acc: (v: T) => number) {
let max = Number.NEGATIVE_INFINITY;
let min = Number.POSITIVE_INFINITY;
for (const d of values) {
const v = acc(d);
if (v < min) {
min = v;
}
if (v > max) {
max = v;
}
}
return [min, max];
}

export function range(length: number) {
const r: number[] = new Array(length);
for (let i = 0; i < length; ++i) {
r[i] = i;
}
return r;
}

export function empty(length: number) {
const r: null[] = new Array(length);
r.fill(null);
return r;
}

export function quantile(values: Float32Array, quantile: number, length = values.length) {
if (length === 0) {
return NaN;
}
Expand Down
4 changes: 2 additions & 2 deletions src/model/ArrayColumn.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {Category} from './annotations';
import ValueColumn, {IValueColumnDesc} from './ValueColumn';
import {range} from 'd3-array';
import {empty} from '../internal/math';
import {IArrayColumn} from './IArrayColumn';
import {IDataRow} from './interfaces';

Expand All @@ -24,7 +24,7 @@ export default class ArrayColumn<T> extends ValueColumn<T[]> implements IArrayCo
constructor(id: string, desc: Readonly<IArrayColumnDesc<T>>) {
super(id, desc);
this._dataLength = desc.dataLength == null || isNaN(desc.dataLength) ? null : desc.dataLength;
this.originalLabels = desc.labels || (range(this._dataLength == null ? 0 : this._dataLength).map((_d, i) => `Column ${i}`));
this.originalLabels = desc.labels || (empty(this._dataLength == null ? 0 : this._dataLength).map((_d, i) => `Column ${i}`));
}


Expand Down
2 changes: 1 addition & 1 deletion src/model/DatesColumn.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {timeFormat, timeParse} from 'd3-time-format';
import {median, min, max} from 'd3-array';
import {median, min, max} from '../internal/math';
import {dialogAddons, toolbar} from './annotations';
import ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';
import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, ECompareValueType, dirtyCaches} from './Column';
Expand Down
3 changes: 1 addition & 2 deletions src/model/OrdinalColumn.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import {extent} from 'd3-array';
import {equalArrays} from '../internal';
import {equalArrays, extent} from '../internal';
import {Category, toolbar} from './annotations';
import CategoricalColumn from './CategoricalColumn';
import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';
Expand Down
2 changes: 1 addition & 1 deletion src/model/ReduceColumn.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {median, quantile} from 'd3-array';
import {median, quantile} from '../internal/math';
import {toolbar} from './annotations';
import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';
import CompositeColumn, {addColumn, filterChanged, moveColumn, removeColumn} from './CompositeColumn';
Expand Down
3 changes: 1 addition & 2 deletions src/provider/utils.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import {extent, range} from 'd3-array';
import {isNumberColumn, isSupportType, isMapAbleColumn} from '../model';
import Column, {IColumnDesc} from '../model/Column';
import {colorPool, MAX_COLORS} from '../model/internal';
import Ranking from '../model/Ranking';
import {concat, equal} from '../internal';
import {concat, equal, extent, range} from '../internal';
import {timeParse} from 'd3-time-format';


Expand Down
9 changes: 5 additions & 4 deletions src/renderer/AggregateGroupRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import AggregateGroupColumn from '../model/AggregateGroupColumn';
import Column from '../model/Column';
import {AGGREGATE, CANVAS_HEIGHT} from '../styles';
import {default as IRenderContext, ICellRendererFactory} from './interfaces';
import {EAggregationState} from '../provider/interfaces';

/** @internal */
export default class AggregateGroupRenderer implements ICellRendererFactory {
Expand Down Expand Up @@ -59,12 +60,12 @@ export default class AggregateGroupRenderer implements ICellRendererFactory {
toggleAggregate.onclick = function (event) {
event.preventDefault();
event.stopPropagation();
col.setAggregated(group, isGroupOnly ? 'expand_top' : 'collapse');
col.setAggregated(group, isGroupOnly ? EAggregationState.EXPAND_TOP_N: EAggregationState.COLLAPSE);
};
toggleMore.onclick = function (event) {
event.preventDefault();
event.stopPropagation();
col.setAggregated(group, isShowAll ? 'expand_top' : 'expand');
col.setAggregated(group, isShowAll ? EAggregationState.EXPAND_TOP_N: EAggregationState.EXPAND);
};
}
};
Expand Down Expand Up @@ -109,7 +110,7 @@ export default class AggregateGroupRenderer implements ICellRendererFactory {

const meta = node.dataset.meta!;
node.dataset.meta = meta === 'first last' ? 'first top' : 'first last';
context.provider.aggregateAllOf(ranking, meta === 'first last' ? 'expand_top' : 'collapse');
context.provider.aggregateAllOf(ranking, meta === 'first last' ? EAggregationState.EXPAND_TOP_N : EAggregationState.COLLAPSE);
};
toggleMore.onclick = function (event) {
event.preventDefault();
Expand All @@ -121,7 +122,7 @@ export default class AggregateGroupRenderer implements ICellRendererFactory {

const meta = node.dataset.meta!;
node.dataset.meta = meta === 'first top' ? 'first' : 'first top';
context.provider.aggregateAllOf(ranking, meta === 'first top' ? 'expand' : 'expand_top');
context.provider.aggregateAllOf(ranking, meta === 'first top' ? EAggregationState.EXPAND : EAggregationState.EXPAND_TOP_N);
};
}
};
Expand Down
6 changes: 1 addition & 5 deletions src/ui/dialogs/RenameDialog.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import {IColumnMetaData} from '../../model';
import Column from '../../model/Column';
import ADialog, {IDialogContext} from './ADialog';
import {cssClass} from '../../styles/index';
import {uniqueId} from '../../renderer/utils';
import {schemeCategory10} from 'd3-scale-chromatic';
import {cssClass} from '../../styles';

/** @internal */
export default class RenameDialog extends ADialog {
Expand All @@ -19,9 +17,7 @@ export default class RenameDialog extends ADialog {

protected build(node: HTMLElement) {
node.classList.add(cssClass('dialog-rename'));
const id = uniqueId('col');
node.insertAdjacentHTML('beforeend', `
<datalist id="${id}L"><option value="${Column.DEFAULT_COLOR}"></option>${schemeCategory10.slice(1).map((d) => `<option>${d}</option>`).join('')}</datalist>
<input type="text" value="${this.column.label}" required autofocus placeholder="name">
<textarea rows="5" placeholder="description">${this.column.description}</textarea>`);
}
Expand Down

0 comments on commit 0b58a79

Please sign in to comment.