Skip to content

Commit

Permalink
continue migrate to tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
sgratzl committed Dec 6, 2018
1 parent bfcf136 commit d4a6ef2
Show file tree
Hide file tree
Showing 15 changed files with 158 additions and 135 deletions.
8 changes: 4 additions & 4 deletions src/model/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,15 @@ export function colorPool() {


/** @internal */
export function medianIndex(rows: ISequence<IDataRow>, col: INumberColumn): number {
export function medianIndex(rows: ISequence<IDataRow>, col: INumberColumn) {
//return the median row
const data = rows.map((r, i) => ({i, v: col.getNumber(r)}));
const data = rows.map((r, i) => ({r, i, v: col.getNumber(r)}));
const sorted = Array.from(data.filter((r) => !isNaN(r.v))).sort((a, b) => numberCompare(a.v, b.v));
const index = sorted[Math.floor(sorted.length / 2.0)];
if (index === undefined) {
return 0; //error case
return {index: 0, row: sorted[0]!.r}; //error case
}
return index.i;
return {index: index.i, row: index.r};
}

/** @internal */
Expand Down
14 changes: 9 additions & 5 deletions src/renderer/AAggregatedGroupRenderer.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import {IDataRow, IGroup, toGroupMeta} from '../model';
import {IDataRow, IGroupMeta, IOrderedGroup} from '../model';
import Column from '../model/Column';
import {
default as IRenderContext, ERenderMode, ICellRenderer, ICellRendererFactory, IGroupCellRenderer,
IImposer
} from './interfaces';
import {noRenderer} from './utils';
import {ISequence} from '../internal/interable';

/**
* helper class that renders a group renderer as a selected (e.g. median) single item
Expand All @@ -17,15 +18,18 @@ export abstract class AAggregatedGroupRenderer<T extends Column> implements ICel

abstract create(col: T, context: IRenderContext, imposer?: IImposer): ICellRenderer;

protected abstract aggregatedIndex(rows: IDataRow[], col: T): number;
protected abstract aggregatedIndex(rows: ISequence<IDataRow>, col: T): {row: IDataRow, index: number};

createGroup(col: T, context: IRenderContext, imposer?: IImposer): IGroupCellRenderer {
const single = this.create(col, context, imposer);
return {
template: `<div>${single.template}</div>`,
update: (node: HTMLElement, group: IGroup, rows: IDataRow[]) => {
const aggregate = this.aggregatedIndex(rows, col);
single.update(<HTMLElement>node.firstElementChild!, rows[aggregate], aggregate, group, toGroupMeta(aggregate, rows.length));
update: (node: HTMLElement, group: IOrderedGroup, groupMeta: IGroupMeta) => {
return context.tasks.groupRows(col, group, (rows) => {
return this.aggregatedIndex(rows, col);
}, (data) => {
single.update(<HTMLElement>node.firstElementChild!, data.row, data.index, group, groupMeta);
});
}
};
}
Expand Down
26 changes: 17 additions & 9 deletions src/renderer/ANumbersCellRenderer.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import {LazyBoxPlotData} from '../internal';
import {IDataRow, IGroup} from '../model';
import {IDataRow, IOrderedGroup} from '../model';
import {INumbersColumn} from '../model/INumberColumn';
import {default as IRenderContext, IImposer} from './interfaces';
import {renderMissingCanvas, renderMissingDOM} from './missing';
import {ISequence} from '../internal/interable';

/** @internal */
export abstract class ANumbersCellRenderer {
Expand All @@ -15,8 +16,14 @@ export abstract class ANumbersCellRenderer {
render: (ctx: CanvasRenderingContext2D, data: number[], d: IDataRow) => void,
};

static choose(col: INumbersColumn, rows: IDataRow[]) {
const data = rows.map((r) => ({n: col.getNumbers(r), raw: col.getRawNumbers(r)}));
static choose(col: INumbersColumn, rows: ISequence<IDataRow>) {
let row: IDataRow | null = null;
const data = rows.map((r, i) => {
if (i === 0) {
row = r;
}
return {n: col.getNumbers(r), raw: col.getRawNumbers(r)};
});
const cols = col.dataLength!;
const normalized = <number[]>[];
const raw = <number[]>[];
Expand All @@ -33,10 +40,10 @@ export abstract class ANumbersCellRenderer {
raw.push(boxRaw[col.getSortMethod()]);
}
}
return {normalized, raw};
return {normalized, raw, row};
}

create(col: INumbersColumn, context: IRenderContext, _hist: any, imposer?: IImposer) {
create(col: INumbersColumn, context: IRenderContext, imposer?: IImposer) {
const width = context.colWidth(col);
const {templateRow, render, update, clazz} = this.createContext(col, context, imposer);
return {
Expand All @@ -56,14 +63,15 @@ export abstract class ANumbersCellRenderer {
};
}

createGroup(col: INumbersColumn, context: IRenderContext, _hist: any, imposer?: IImposer) {
createGroup(col: INumbersColumn, context: IRenderContext, imposer?: IImposer) {
const {templateRow, update, clazz} = this.createContext(col, context, imposer);
return {
template: `<div class="${clazz}">${templateRow}</div>`,
update: (n: HTMLDivElement, _group: IGroup, rows: IDataRow[]) => {
update: (n: HTMLDivElement, group: IOrderedGroup) => {
// render a heatmap
const {normalized, raw} = ANumbersCellRenderer.choose(col, rows);
update(n, normalized, raw, rows[0]);
return context.tasks.groupRows(col, group, (rows) => ANumbersCellRenderer.choose(col, rows), (data) => {
update(n, data.normalized, data.raw, data.row!);
});
}
};
}
Expand Down
2 changes: 1 addition & 1 deletion src/renderer/AggregateGroupRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export default class AggregateGroupRenderer implements ICellRendererFactory {
createGroup(col: AggregateGroupColumn) {
return {
template: `<div title="Expand Group"></div>`,
update(node: HTMLElement, group: IGroup, _rows: IDataRow[], meta: IGroupMeta) {
update(node: HTMLElement, group: IGroup, meta: IGroupMeta) {
if (!meta) {
delete node.dataset.meta;
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/renderer/BoxplotCellRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ export default class BoxplotCellRenderer implements ICellRendererFactory {
return {
template: isMapAbleColumn(col) ? MAPPED_BOXPLOT : BOXPLOT,
update: (n: HTMLElement) => {
return context.tasks.rankingBoxPlotStats(col, (data: IAdvancedBoxPlotData) => {
return context.tasks.summaryBoxPlotStats(col, (data: IAdvancedBoxPlotData) => {
if (data == null) {
n.classList.add(cssClass('missing'));
return;
Expand Down
4 changes: 2 additions & 2 deletions src/renderer/CategoricalCellRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ function staticSummary(col: ISetColumn, context: IRenderContext, interactive: bo
return {
template: `${template}</div>`,
update: (n: HTMLElement) => {
return context.tasks.rankingCategoricalStats(col, (hist) => {
return context.tasks.summaryCategoricalStats(col, (hist) => {
n.classList.toggle(cssClass('missing'), !hist);
if (!hist) {
return;
Expand All @@ -89,7 +89,7 @@ function interactiveSummary(col: HasCategoricalFilter, context: IRenderContext,
if (!filterUpdate) {
filterUpdate = interactiveHist(col, n);
}
return context.tasks.rankingCategoricalStats(col, (hist, gHist) => {
return context.tasks.summaryCategoricalStats(col, (hist, gHist) => {
filterUpdate((interactive && gHist) ? gHist.missing : (hist ? hist.missing : 0), col);

n.classList.toggle(cssClass('missing'), !hist);
Expand Down
4 changes: 2 additions & 2 deletions src/renderer/CategoricalStackedDistributionlCellRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ function staticSummary(col: ICategoricalColumn, context: IRenderContext) {
return {
template: `${template}</div>`,
update: (n: HTMLElement) => {
return context.tasks.rankingCategoricalStats(col, (hist) => {
return context.tasks.summaryCategoricalStats(col, (hist) => {
n.classList.toggle(cssClass('missing'), !hist);
if (!hist) {
return;
Expand All @@ -64,7 +64,7 @@ function interactiveSummary(col: HasCategoricalFilter, context: IRenderContext,
if (!filterUpdate) {
filterUpdate = interactiveHist(col, n);
}
return context.tasks.rankingCategoricalStats(col, (hist, gHist) => {
return context.tasks.summaryCategoricalStats(col, (hist, gHist) => {
const missing = interactive && gHist ? gHist.missing : (hist ? hist.missing : 0);
filterUpdate(missing, col);

Expand Down
27 changes: 13 additions & 14 deletions src/renderer/HeatmapCellRenderer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {IDataRow} from '../model';
import {IDataRow, IOrderedGroup} from '../model';
import Column from '../model/Column';
import {DEFAULT_FORMATTER, INumbersColumn, isNumbersColumn} from '../model/INumberColumn';
import {CANVAS_HEIGHT, cssClass} from '../styles';
Expand All @@ -7,7 +7,6 @@ import {toHeatMapColor} from './BrightnessCellRenderer';
import IRenderContext, {ICellRendererFactory, IImposer} from './interfaces';
import {renderMissingValue, renderMissingDOM} from './missing';
import {noop, wideEnough} from './utils';
import {IGroup} from '../model/interfaces';

const GUESSED_HEIGHT = 20;

Expand All @@ -19,7 +18,7 @@ export default class HeatmapCellRenderer implements ICellRendererFactory {
return isNumbersColumn(col) && Boolean(col.dataLength);
}

private createContext(col: INumbersColumn, context: IRenderContext, _hist: any, imposer?: IImposer) {
private createContext(col: INumbersColumn, context: IRenderContext, imposer?: IImposer) {
const width = context.colWidth(col);
const cellDimension = width / col.dataLength!;
const labels = col.labels;
Expand Down Expand Up @@ -47,7 +46,7 @@ export default class HeatmapCellRenderer implements ICellRendererFactory {
}

create(col: INumbersColumn, context: IRenderContext, _hist: any, imposer?: IImposer) {
const {template, render, mover, width} = this.createContext(col, context, _hist, imposer);
const {template, render, mover, width} = this.createContext(col, context, imposer);
return {
template,
update: (n: HTMLElement, d: IDataRow) => {
Expand All @@ -69,18 +68,18 @@ export default class HeatmapCellRenderer implements ICellRendererFactory {
}

createGroup(col: INumbersColumn, context: IRenderContext, imposer?: IImposer) {
const {template, render, mover, width} = this.createContext(col, context, _hist, imposer);
const {template, render, mover, width} = this.createContext(col, context, imposer);
return {
template,
update: (n: HTMLElement, _group: IGroup) => {
// render a heatmap
const {normalized, raw} = ANumbersCellRenderer.choose(col, rows);
const ctx = (<HTMLCanvasElement>n).getContext('2d')!;
ctx.canvas.width = width;
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
n.onmousemove = mover(n, raw.map(DEFAULT_FORMATTER));
n.onmouseleave = () => n.title = '';
render(ctx, normalized, rows[0], GUESSED_HEIGHT);
update: (n: HTMLElement, group: IOrderedGroup) => {
return context.tasks.groupRows(col, group, (rows) => ANumbersCellRenderer.choose(col, rows), (data) => {
const ctx = (<HTMLCanvasElement>n).getContext('2d')!;
ctx.canvas.width = width;
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
n.onmousemove = mover(n, data.raw.map(DEFAULT_FORMATTER));
n.onmouseleave = () => n.title = '';
render(ctx, data.normalized, data.row!, GUESSED_HEIGHT);
});
}
};
}
Expand Down
Loading

0 comments on commit d4a6ef2

Please sign in to comment.