Skip to content

Commit

Permalink
Merge pull request #154 from lineupjs/sgratzl/factorym
Browse files Browse the repository at this point in the history
Sgratzl/factorym
  • Loading branch information
sgratzl committed Apr 29, 2019
2 parents 6748a43 + 110b55d commit f8e2fe0
Show file tree
Hide file tree
Showing 45 changed files with 555 additions and 516 deletions.
7 changes: 4 additions & 3 deletions src/builder/column/NumberColumnBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {min, max} from '../../internal';
import {EAdvancedSortMethod, ESortMethod, INumberColumnDesc} from '../../model';
import {EAdvancedSortMethod, ESortMethod, INumberColumnDesc, ITypedDump} from '../../model';
import ColumnBuilder from './ColumnBuilder';
import {IScriptMappingFunctionType} from '../../model/MappingFunction';

export default class NumberColumnBuilder extends ColumnBuilder<INumberColumnDesc> {

Expand Down Expand Up @@ -36,7 +37,7 @@ export default class NumberColumnBuilder extends ColumnBuilder<INumberColumnDesc
return this.colorMapping(color);
}

colorMapping(type: string | ((v: number)=>string) | any) {
colorMapping(type: string | ((v: number)=>string) | ITypedDump) {
this.desc.colorMapping = type;
return this;
}
Expand All @@ -55,7 +56,7 @@ export default class NumberColumnBuilder extends ColumnBuilder<INumberColumnDesc
* @param {string} code the code to execute
* @param {[number , number]} domain the input data domain [min, max]
*/
scripted(code: string, domain: [number, number]) {
scripted(code: string | IScriptMappingFunctionType, domain: [number, number]) {
this.desc.map = {domain, code, type: 'script'};
return this;
}
Expand Down
4 changes: 2 additions & 2 deletions src/model/AnnotateColumn.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';
import {IDataRow} from './interfaces';
import {IDataRow, ITypeFactory} from './interfaces';
import StringColumn from './StringColumn';
import {IEventListener} from '../internal';
import ValueColumn, {dataLoaded} from './ValueColumn';
Expand Down Expand Up @@ -75,7 +75,7 @@ export default class AnnotateColumn extends StringColumn {
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);
if (!dump.annotations) {
return;
Expand Down
10 changes: 5 additions & 5 deletions src/model/BooleanColumn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import CategoricalColumn from './CategoricalColumn';
import Column, {widthChanged, labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, dirtyCaches} from './Column';
import ValueColumn, {dataLoaded} from './ValueColumn';
import {ICategoricalColumn, ICategory, ICategoricalColorMappingFunction} from './ICategoricalColumn';
import {IDataRow, ECompareValueType, IValueColumnDesc} from './interfaces';
import {IDataRow, ECompareValueType, IValueColumnDesc, ITypeFactory} from './interfaces';
import {IEventListener} from '../internal';
import {restoreCategoricalColorMapping, DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';

export interface IBooleanDesc {
/**
Expand Down Expand Up @@ -159,16 +159,16 @@ export default class BooleanColumn extends ValueColumn<boolean> implements ICate

dump(toDescRef: (desc: any) => any): any {
const r = super.dump(toDescRef);
r.colorMapping = this.colorMapping.dump();
r.colorMapping = this.colorMapping.toJSON();
if (this.currentFilter != null) {
r.filter = this.currentFilter;
}
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);
this.colorMapping = restoreCategoricalColorMapping(dump.colorMapping, this.categories);
this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);
if (typeof dump.filter !== 'undefined') {
this.currentFilter = dump.filter;
}
Expand Down
10 changes: 5 additions & 5 deletions src/model/BooleansColumn.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';
import {ISetColumn, ICategoricalColorMappingFunction} from './ICategoricalColumn';
import {IDataRow, DEFAULT_COLOR, ECompareValueType} from './interfaces';
import {IDataRow, DEFAULT_COLOR, ITypeFactory, ECompareValueType} from './interfaces';
import CategoricalColumn from './CategoricalColumn';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION, restoreCategoricalColorMapping} from './CategoricalColorMappingFunction';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';
import ValueColumn, {dataLoaded} from './ValueColumn';
import Column, {labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, widthChanged, dirtyCaches} from './Column';
import {IEventListener} from '../internal';
Expand Down Expand Up @@ -100,12 +100,12 @@ export default class BooleansColumn extends ArrayColumn<boolean> implements ISet

dump(toDescRef: (desc: any) => any): any {
const r = super.dump(toDescRef);
r.colorMapping = this.colorMapping.dump();
r.colorMapping = this.colorMapping.toJSON();
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);
this.colorMapping = restoreCategoricalColorMapping(dump.colorMapping, this.categories);
this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);
}
}
25 changes: 11 additions & 14 deletions src/model/BoxPlotColumn.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import {format} from 'd3-format';
import {IBoxPlotData, IEventListener} from '../internal';
import {Category, dialogAddons, SortByDefault, toolbar} from './annotations';
import {createColorMappingFunction, restoreColorMapping} from './ColorMappingFunction';
import Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';
import {IDataRow, ECompareValueType, IValueColumnDesc} from './interfaces';
import {IDataRow, ECompareValueType, IValueColumnDesc, ITypeFactory} from './interfaces';
import {ESortMethod, IBoxPlotColumn, INumberDesc, INumberFilter, IColorMappingFunction, IMappingFunction} from './INumberColumn';
import {createMappingFunction, restoreMapping, ScaleMappingFunction} from './MappingFunction';
import {restoreMapping} from './MappingFunction';
import NumberColumn from './NumberColumn';
import ValueColumn, {dataLoaded} from './ValueColumn';
import {DEFAULT_FORMATTER, noNumberFilter, toCompareBoxPlotValue, getBoxPlotNumber, isDummyNumberFilter, restoreNumberFilter} from './internalNumber';
Expand Down Expand Up @@ -73,11 +72,11 @@ export default class BoxPlotColumn extends ValueColumn<IBoxPlotData> implements
private currentFilter: INumberFilter = noNumberFilter();


constructor(id: string, desc: Readonly<IBoxPlotColumnDesc>) {
constructor(id: string, desc: Readonly<IBoxPlotColumnDesc>, factory: ITypeFactory) {
super(id, desc);
this.mapping = restoreMapping(desc);
this.mapping = restoreMapping(desc, factory);
this.original = this.mapping.clone();
this.colorMapping = restoreColorMapping(desc);
this.colorMapping = factory.colorMappingFunction(desc.colorMapping);

if (desc.numberFormat) {
this.numberFormat = format(desc.numberFormat);
Expand Down Expand Up @@ -192,26 +191,24 @@ export default class BoxPlotColumn extends ValueColumn<IBoxPlotData> implements
const r = super.dump(toDescRef);
r.sortMethod = this.getSortMethod();
r.filter = !isDummyNumberFilter(this.currentFilter) ? this.currentFilter : null;
r.map = this.mapping.dump();
r.colorMapping = this.colorMapping.dump();
r.map = this.mapping.toJSON();
r.colorMapping = this.colorMapping.toJSON();
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);
if (dump.sortMethod) {
this.sort = dump.sortMethod;
}
if (dump.filter) {
this.currentFilter = restoreNumberFilter(dump.filter);
}
if (dump.map) {
this.mapping = createMappingFunction(dump.map);
} else if (dump.domain) {
this.mapping = new ScaleMappingFunction(dump.domain, 'linear', dump.range || [0, 1]);
if (dump.map || dump.domain) {
this.mapping = restoreMapping(dump, factory);
}
if (dump.colorMapping) {
this.colorMapping = createColorMappingFunction(dump.colorMapping);
this.colorMapping = factory.colorMappingFunction(dump.colorMapping);
}
}

Expand Down
16 changes: 11 additions & 5 deletions src/model/CategoricalColorMappingFunction.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {ICategory, ICategoricalColorMappingFunction} from '.';
import {DEFAULT_COLOR} from './interfaces';
import {DEFAULT_COLOR, ITypedDump} from './interfaces';


export const DEFAULT_CATEGORICAL_COLOR_FUNCTION: ICategoricalColorMappingFunction = {
apply: (v) => v ? v.color : DEFAULT_COLOR,
dump: () => null,
toJSON: () => null,
clone: () => DEFAULT_CATEGORICAL_COLOR_FUNCTION,
eq: (other) => other === DEFAULT_CATEGORICAL_COLOR_FUNCTION
};
Expand All @@ -19,10 +19,13 @@ export class ReplacmentColorMappingFunction implements ICategoricalColorMappingF
return this.map.has(v.name) ? this.map.get(v.name)! : DEFAULT_CATEGORICAL_COLOR_FUNCTION.apply(v);
}

dump() {
toJSON() {
const r: any = {};
this.map.forEach((v, k) => r[k] = v);
return r;
return {
type: 'replace',
map: r
};
}

clone() {
Expand All @@ -40,6 +43,9 @@ export class ReplacmentColorMappingFunction implements ICategoricalColorMappingF
}

static restore(dump: any, categories: ICategory[]) {
if (dump.type === 'replace') { // new dump format
dump = dump.map;
}
const lookup = new Map(categories.map((d) => <[string, ICategory]>[d.name, d]));
const r = new Map<ICategory, string>();
for (const key of Object.keys(dump)) {
Expand All @@ -54,7 +60,7 @@ export class ReplacmentColorMappingFunction implements ICategoricalColorMappingF
/**
* @internal
*/
export function restoreCategoricalColorMapping(dump: any, categories: ICategory[]): ICategoricalColorMappingFunction {
export function restoreCategoricalColorMapping(dump: ITypedDump | null | undefined, categories: ICategory[]): ICategoricalColorMappingFunction {
if (!dump) {
return DEFAULT_CATEGORICAL_COLOR_FUNCTION;
}
Expand Down
10 changes: 5 additions & 5 deletions src/model/CategoricalColumn.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import {IEventListener, ISequence} from '../internal';
import {Category, toolbar} from './annotations';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION, restoreCategoricalColorMapping} from './CategoricalColorMappingFunction';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';
import Column, {dirty, dirtyCaches, dirtyHeader, dirtyValues, groupRendererChanged, labelChanged, metaDataChanged, rendererTypeChanged, summaryRendererChanged, visibilityChanged, widthChanged} from './Column';
import {ICategoricalColumn, ICategoricalColumnDesc, ICategoricalFilter, ICategory, ICategoricalColorMappingFunction} from './ICategoricalColumn';
import {IDataRow, IGroup, ICompareValue, DEFAULT_COLOR, ECompareValueType} from './interfaces';
import {IDataRow, IGroup, ICompareValue, DEFAULT_COLOR, ITypeFactory, ECompareValueType} from './interfaces';
import {missingGroup} from './missing';
import ValueColumn, {dataLoaded} from './ValueColumn';
import {toCategories, isCategoryIncluded, isEqualCategoricalFilter, toCompareCategoryValue, COMPARE_CATEGORY_VALUE_TYPES, toGroupCompareCategoryValue, COMPARE_GROUP_CATEGORY_VALUE_TYPES} from './internalCategorical';
Expand Down Expand Up @@ -142,14 +142,14 @@ export default class CategoricalColumn extends ValueColumn<string> implements IC
dump(toDescRef: (desc: any) => any): any {
const r = super.dump(toDescRef);
r.filter = this.currentFilter;
r.colorMapping = this.colorMapping.dump();
r.colorMapping = this.colorMapping.toJSON();
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);

this.colorMapping = restoreCategoricalColorMapping(dump.colorMapping, this.categories);
this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);

if ('filter' in dump) {
this.currentFilter = null;
Expand Down
10 changes: 5 additions & 5 deletions src/model/CategoricalMapColumn.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {ICategoricalDesc, ICategory, ICategoricalLikeColumn, ICategoricalColorMappingFunction} from './ICategoricalColumn';
import {IDataRow, DEFAULT_COLOR} from './interfaces';
import {IDataRow, DEFAULT_COLOR, ITypeFactory} from './interfaces';
import MapColumn, {IMapColumnDesc} from './MapColumn';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION, restoreCategoricalColorMapping} from './CategoricalColorMappingFunction';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';
import CategoricalColumn from './CategoricalColumn';
import ValueColumn, {dataLoaded} from './ValueColumn';
import Column, {labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, widthChanged, dirtyCaches} from './Column';
Expand Down Expand Up @@ -106,13 +106,13 @@ export default class CategoricalMapColumn extends MapColumn<string | null> imple

dump(toDescRef: (desc: any) => any): any {
const r = super.dump(toDescRef);
r.colorMapping = this.colorMapping.dump();
r.colorMapping = this.colorMapping.toJSON();
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);
this.colorMapping = restoreCategoricalColorMapping(dump.colorMapping, this.categories);
this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);
}

iterCategory(row: IDataRow) {
Expand Down
10 changes: 5 additions & 5 deletions src/model/CategoricalsColumn.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import ArrayColumn, {IArrayColumnDesc} from './ArrayColumn';
import {ICategoricalDesc, ICategory, ICategoricalColorMappingFunction, ICategoricalsColumn} from './ICategoricalColumn';
import {IDataRow, DEFAULT_COLOR} from './interfaces';
import {IDataRow, DEFAULT_COLOR, ITypeFactory} from './interfaces';
import {toolbar} from './annotations';
import CategoricalColumn from './CategoricalColumn';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION, restoreCategoricalColorMapping} from './CategoricalColorMappingFunction';
import {DEFAULT_CATEGORICAL_COLOR_FUNCTION} from './CategoricalColorMappingFunction';
import ValueColumn, {dataLoaded} from './ValueColumn';
import Column, {labelChanged, metaDataChanged, dirty, dirtyHeader, dirtyValues, rendererTypeChanged, groupRendererChanged, summaryRendererChanged, visibilityChanged, widthChanged, dirtyCaches} from './Column';
import {IEventListener} from '../internal';
Expand Down Expand Up @@ -96,12 +96,12 @@ export default class CategoricalsColumn extends ArrayColumn<string | null> imple

dump(toDescRef: (desc: any) => any): any {
const r = super.dump(toDescRef);
r.colorMapping = this.colorMapping.dump();
r.colorMapping = this.colorMapping.toJSON();
return r;
}

restore(dump: any, factory: (dump: any) => Column | null) {
restore(dump: any, factory: ITypeFactory) {
super.restore(dump, factory);
this.colorMapping = restoreCategoricalColorMapping(dump.colorMapping, this.categories);
this.colorMapping = factory.categoricalColorMappingFunction(dump.colorMapping, this.categories);
}
}
Loading

0 comments on commit f8e2fe0

Please sign in to comment.