mascot-vis 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -2
- package/js/depGraphVis.js +0 -66
- package/src-new-ts/action/createElement.ts +0 -91
- package/src-new-ts/action/encode.js +0 -20
- package/src-new-ts/action/repeat.js +0 -128
- package/src-new-ts/action/traverseScene.js +0 -41
- package/src-new-ts/data/Network.js +0 -2
- package/src-new-ts/data/Scope.js +0 -135
- package/src-new-ts/data/Table.js +0 -263
- package/src-new-ts/data/Tree.js +0 -3
- package/src-new-ts/data/field.ts +0 -115
- package/src-new-ts/data/import.ts +0 -96
- package/src-new-ts/data/predicate.ts +0 -82
- package/src-new-ts/depgraph/DepGraph.js +0 -178
- package/src-new-ts/depgraph/Edge.js +0 -9
- package/src-new-ts/depgraph/SceneGraph2DepGraph.js +0 -110
- package/src-new-ts/depgraph/Signal.js +0 -12
- package/src-new-ts/depgraph/operator/BoundsEvaluator.js +0 -30
- package/src-new-ts/depgraph/operator/Dataflow.js +0 -41
- package/src-new-ts/depgraph/operator/DomainBuilder.js +0 -50
- package/src-new-ts/depgraph/updateDepGraph.js +0 -45
- package/src-new-ts/depgraph/variable/BoundsVar.js +0 -81
- package/src-new-ts/depgraph/variable/ChannelVar.js +0 -17
- package/src-new-ts/depgraph/variable/DataScopeVar.js +0 -12
- package/src-new-ts/depgraph/variable/DomainVar.js +0 -15
- package/src-new-ts/depgraph/variable/FieldVar.js +0 -17
- package/src-new-ts/depgraph/variable/LayoutParameter.js +0 -8
- package/src-new-ts/depgraph/variable/ScaleVar.js +0 -13
- package/src-new-ts/depgraph/variable/Variable.js +0 -39
- package/src-new-ts/element/gradient/LinearGradient.js +0 -37
- package/src-new-ts/element/group/Collection.js +0 -109
- package/src-new-ts/element/group/Group.js +0 -307
- package/src-new-ts/element/group/Scene.js +0 -98
- package/src-new-ts/element/mark/CircleMark.ts +0 -85
- package/src-new-ts/element/mark/Mark.ts +0 -233
- package/src-new-ts/element/mark/PathMark.js +0 -483
- package/src-new-ts/element/mark/Segment.js +0 -29
- package/src-new-ts/element/mark/Vertex.js +0 -118
- package/src-new-ts/encode/Scale.ts +0 -115
- package/src-new-ts/index.ts +0 -19
- package/src-new-ts/layout/Layout.ts +0 -3
- package/src-new-ts/render/CanvasRenderer.ts +0 -24
- package/src-new-ts/render/SVGRenderer.js +0 -316
- package/src-new-ts/util.ts +0 -3
- package/src-old/action/Classify.js +0 -53
- package/src-old/action/Densify.js +0 -199
- package/src-old/action/Partition.js +0 -531
- package/src-old/action/Repeat.js +0 -106
- package/src-old/action/Repopulate.js +0 -44
- package/src-old/action/Stratify.js +0 -156
- package/src-old/basic/Gradient.js +0 -37
- package/src-old/basic/Point.js +0 -51
- package/src-old/basic/Rectangle.js +0 -63
- package/src-old/bind/bindToAngle.js +0 -56
- package/src-old/bind/bindToAreaMark.js +0 -360
- package/src-old/bind/bindToColor.js +0 -114
- package/src-old/bind/bindToLink.js +0 -81
- package/src-old/bind/bindToPosition.js +0 -283
- package/src-old/bind/bindToRadialDistance.js +0 -62
- package/src-old/bind/bindToSize.js +0 -235
- package/src-old/bind/bindToText.js +0 -60
- package/src-old/bind/bindToThickness.js +0 -100
- package/src-old/constraint/AffixConstraint.js +0 -129
- package/src-old/constraint/AlignConstraint.js +0 -58
- package/src-old/core/Encoding.js +0 -336
- package/src-old/core/Scale.js +0 -322
- package/src-old/core/SceneLoader.js +0 -290
- package/src-old/core/SceneValidator.js +0 -232
- package/src-old/core/SpecExecutor.js +0 -113
- package/src-old/core/SpecGenerator.js +0 -350
- package/src-old/data/DataImporter.js +0 -64
- package/src-old/data/DataScope.js +0 -124
- package/src-old/data/DataTable.js +0 -338
- package/src-old/data/Network.js +0 -106
- package/src-old/data/Tree.js +0 -251
- package/src-old/data/transform/Bin.js +0 -46
- package/src-old/data/transform/Filter.js +0 -48
- package/src-old/data/transform/Groupby.js +0 -18
- package/src-old/data/transform/KDE.js +0 -58
- package/src-old/data/transform/Sort.js +0 -14
- package/src-old/data/transform/Split.js +0 -5
- package/src-old/data/transform/partition.js +0 -46
- package/src-old/history/UndoRedoStack +0 -0
- package/src-old/index.js +0 -271
- package/src-old/indexSVG.js +0 -259
- package/src-old/interaction/Interaction.js +0 -91
- package/src-old/interaction/MouseEvent.js +0 -8
- package/src-old/interaction/Selection.js +0 -9
- package/src-old/interaction/brush.js +0 -362
- package/src-old/item/Segment.js +0 -29
- package/src-old/item/Vertex.js +0 -118
- package/src-old/item/composite/Collection.js +0 -106
- package/src-old/item/composite/Glyph.js +0 -19
- package/src-old/item/composite/Group.js +0 -310
- package/src-old/item/composite/Scene.js +0 -1251
- package/src-old/item/mark/ArcPath.js +0 -181
- package/src-old/item/mark/AreaPath.js +0 -78
- package/src-old/item/mark/CirclePath.js +0 -102
- package/src-old/item/mark/EllipsePath.js +0 -5
- package/src-old/item/mark/Image.js +0 -101
- package/src-old/item/mark/LinkPath.js +0 -118
- package/src-old/item/mark/Mark.js +0 -163
- package/src-old/item/mark/Path.js +0 -494
- package/src-old/item/mark/PointText.js +0 -201
- package/src-old/item/mark/PolygonPath.js +0 -64
- package/src-old/item/mark/RectPath.js +0 -88
- package/src-old/item/mark/RingPath.js +0 -92
- package/src-old/item/refs/Axis.js +0 -362
- package/src-old/item/refs/EncodingAxis.js +0 -515
- package/src-old/item/refs/Gridlines.js +0 -144
- package/src-old/item/refs/LayoutAxis.js +0 -316
- package/src-old/item/refs/Legend.js +0 -273
- package/src-old/layout/Circular.js +0 -95
- package/src-old/layout/Force.js +0 -52
- package/src-old/layout/Grid.js +0 -423
- package/src-old/layout/Layout.js +0 -13
- package/src-old/layout/Packing.js +0 -56
- package/src-old/layout/Stack.js +0 -264
- package/src-old/layout/Strata.js +0 -88
- package/src-old/layout/Sugiyama.js +0 -59
- package/src-old/layout/TidyTree.js +0 -105
- package/src-old/layout/Treemap.js +0 -87
- package/src-old/renderer/SVGInteractionHandler.js +0 -241
- package/src-old/renderer/SVGRenderer.js +0 -325
- package/src-old/renderer/WebGLRenderer.js +0 -1097
- package/src-old/renderer/WebGLRenderer2.js +0 -249
- package/src-old/renderer/threejs/Line2.js +0 -18
- package/src-old/renderer/threejs/LineGeometry.js +0 -77
- package/src-old/renderer/threejs/LineMaterial.js +0 -605
- package/src-old/renderer/threejs/LineSegments2.js +0 -281
- package/src-old/renderer/threejs/LineSegmentsGeometry.js +0 -226
- package/src-old/renderer/threejs/Wireframe.js +0 -51
- package/src-old/renderer/threejs/WireframeGeometry2.js +0 -16
- package/src-old/scale/areaSize.js +0 -0
- package/src-old/scale/domain.js +0 -38
- package/src-old/util/Constants.js +0 -180
- package/src-old/util/DataUtil.js +0 -35
- package/src-old/util/ItemUtil.js +0 -586
- package/src-old/util/Numerical.js +0 -33
- package/tests/demo-tests/README.md +0 -80
- package/tests/demo-tests/SVG2PNG.js +0 -56
- package/tests/demo-tests/demos2CanvasPNGs.js +0 -69
- package/tests/demo-tests/demos2ScenesSVGs.js +0 -100
- package/tests/demo-tests/pathElementWorker.js +0 -91
- package/tests/demo-tests/pixelTest.js +0 -62
- package/tests/demo-tests/renderDemos.html +0 -132
- package/tests/demo-tests/serializationTest.js +0 -36
- package/tests/demo-tests/serializeDemos.html +0 -134
- package/tests/unit-tests/README.md +0 -4
- package/tests/unit-tests/jasmine-browser.json +0 -21
- package/tests/unit-tests/jasmine.json +0 -14
- package/tests/unit-tests/testSpec.js +0 -274
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import * as d3 from "d3";
|
|
2
|
-
import DataTable from "./DataTable.js";
|
|
3
|
-
import Tree from "./Tree.js";
|
|
4
|
-
import Network from "./Network.js";
|
|
5
|
-
|
|
6
|
-
function makeRequest(method, url){
|
|
7
|
-
return new Promise(function(resolve, reject){
|
|
8
|
-
let xhr = new XMLHttpRequest();
|
|
9
|
-
xhr.open(method, url);
|
|
10
|
-
xhr.onload = function() {
|
|
11
|
-
if (this.status >= 200 && this.status < 300) {
|
|
12
|
-
resolve(xhr.response);
|
|
13
|
-
} else {
|
|
14
|
-
reject({
|
|
15
|
-
status: this.status,
|
|
16
|
-
statusText: xhr.statusText
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
xhr.onerror = function() {
|
|
21
|
-
reject({
|
|
22
|
-
status: this.status,
|
|
23
|
-
statusText: xhr.statusText
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
xhr.send();
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function importCSV(url) {
|
|
31
|
-
let data = await makeRequest("GET", url);
|
|
32
|
-
let parsed = d3.csvParse(data.trim(), d3.autoType);
|
|
33
|
-
return new DataTable(parsed, url);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function importTreejson(url) {
|
|
37
|
-
let data = await makeRequest("GET", url);
|
|
38
|
-
return new Tree(JSON.parse(data), url);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export async function importGraphjson(url) {
|
|
42
|
-
let data = await makeRequest("GET", url);
|
|
43
|
-
return new Network(JSON.parse(data), url);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function validResponse(request) {
|
|
47
|
-
var type = request.responseType;
|
|
48
|
-
return type && type !== 'text' ?
|
|
49
|
-
request.response : // null on error
|
|
50
|
-
request.responseText; // '' on error
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function csvSync(url, callback) {
|
|
54
|
-
let async = callback? true : false;
|
|
55
|
-
var request = new XMLHttpRequest();
|
|
56
|
-
request.open('GET', url, async);
|
|
57
|
-
request.send();
|
|
58
|
-
if (!async && validResponse(request)) {
|
|
59
|
-
let data = d3.csvParse(request.responseText.trim(), d3.autoType);
|
|
60
|
-
return new DataTable(data, url);
|
|
61
|
-
} else {
|
|
62
|
-
//TODO: throw errors based on response
|
|
63
|
-
}
|
|
64
|
-
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import {Aggregator, atlas_rowId} from "../util/Constants";
|
|
2
|
-
import * as d3 from 'd3';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export default class DataScope {
|
|
6
|
-
|
|
7
|
-
constructor(datatable) {
|
|
8
|
-
this._field2value = {};
|
|
9
|
-
this._dt = datatable;
|
|
10
|
-
this._tuples = this._dt.data;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
toJSON() {
|
|
14
|
-
let json = {};
|
|
15
|
-
json.dt = this._dt.id;
|
|
16
|
-
json.f2v = Object.assign({}, this._field2value);
|
|
17
|
-
json.tuples = this._tuples.map(d => parseInt(d[atlas_rowId].substring(1)));
|
|
18
|
-
return json;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
isFullTable() {
|
|
22
|
-
return Object.keys(this._field2value).length === 0;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
isEmpty() {
|
|
26
|
-
return this._tuples.length == 0;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
get numTuples() {
|
|
30
|
-
return this._tuples.length;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
get fields() {
|
|
34
|
-
return Object.keys(this._field2value);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get dataTable() {
|
|
38
|
-
return this._dt;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get filters() {
|
|
42
|
-
return this._field2value;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
merge(ds) {
|
|
46
|
-
let r = new DataScope(this._dt);
|
|
47
|
-
for (let field in ds._field2value) {
|
|
48
|
-
r = r.cross(field, ds._field2value[field]);
|
|
49
|
-
}
|
|
50
|
-
for (let field in this._field2value) {
|
|
51
|
-
r = r.cross(field, this._field2value[field]);
|
|
52
|
-
}
|
|
53
|
-
return r;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
cross(field, value) {
|
|
57
|
-
let ds = this.clone();
|
|
58
|
-
ds._field2value[field] = value;
|
|
59
|
-
ds._updateTuples(field, value);
|
|
60
|
-
return ds;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
clone() {
|
|
64
|
-
let ds = new DataScope(this._dt);
|
|
65
|
-
ds._field2value = Object.assign({}, this._field2value);
|
|
66
|
-
ds._tuples = this._tuples.map(d => d);
|
|
67
|
-
return ds;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
getFieldValue(field) {
|
|
71
|
-
let values = this._tuples.map(d => d[field]);
|
|
72
|
-
values = [...new Set(values)];
|
|
73
|
-
if (values.length > 1){
|
|
74
|
-
//throw new Error(Errors.MULTIPLE_VALUES_PER_FIELD);
|
|
75
|
-
//TODO: how to handle this?
|
|
76
|
-
}
|
|
77
|
-
return values[0];
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
getUniqueFieldValues(field) {
|
|
81
|
-
let values = this._tuples.map(d => d[field]);
|
|
82
|
-
return [...new Set(values)];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
hasField(field) {
|
|
86
|
-
return (field in this._field2value);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
getFieldType(field) {
|
|
90
|
-
return this._dt.getFieldType(field);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
aggregateNumericalField(field, aggregator) {
|
|
94
|
-
let values = this._tuples.map(d => d[field]);
|
|
95
|
-
switch (aggregator) {
|
|
96
|
-
case Aggregator.Max:
|
|
97
|
-
return Math.max(...values);
|
|
98
|
-
case Aggregator.Min:
|
|
99
|
-
return Math.min(...values);
|
|
100
|
-
case Aggregator.Avg:
|
|
101
|
-
case Aggregator.Mean:
|
|
102
|
-
return d3.mean(values);
|
|
103
|
-
case Aggregator.Median:
|
|
104
|
-
return d3.median(values);
|
|
105
|
-
case Aggregator.Count:
|
|
106
|
-
return values.length;
|
|
107
|
-
case Aggregator.Percentile25:
|
|
108
|
-
return d3.quantile(values, 0.25);
|
|
109
|
-
case Aggregator.Percentile75:
|
|
110
|
-
return d3.quantile(values, 0.75);
|
|
111
|
-
case Aggregator.Sum:
|
|
112
|
-
default:
|
|
113
|
-
return d3.sum(values);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
_updateTuples(field, value) {
|
|
118
|
-
this._tuples = this._tuples.filter(d => d[field] == value);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
get tuples() {
|
|
122
|
-
return this._tuples;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
@@ -1,338 +0,0 @@
|
|
|
1
|
-
import * as d3 from "d3";
|
|
2
|
-
import bin from "./transform/Bin";
|
|
3
|
-
import {atlas_rowId, DataType, ItemType} from "../util/Constants";
|
|
4
|
-
import kde from "./transform/KDE";
|
|
5
|
-
import sort from "./transform/Sort";
|
|
6
|
-
import filter from "./transform/Filter";
|
|
7
|
-
import { ItemCounter } from "../util/ItemUtil";
|
|
8
|
-
|
|
9
|
-
export default class DataTable {
|
|
10
|
-
|
|
11
|
-
constructor(data, url, fTypes) {
|
|
12
|
-
this.url = url;
|
|
13
|
-
//this.name = _getFileName(url);
|
|
14
|
-
this.id = ItemType.DataTable + ItemCounter[ItemType.DataTable]++;
|
|
15
|
-
this.data = data;
|
|
16
|
-
this.rawData = JSON.parse(JSON.stringify(data));
|
|
17
|
-
//remember the original date values after parsing them
|
|
18
|
-
this._dateMap = new Map();
|
|
19
|
-
this._fields = Object.keys(this.data[0]);
|
|
20
|
-
this._newField = 0;
|
|
21
|
-
if (fTypes) {
|
|
22
|
-
this._fieldTypes = fTypes;
|
|
23
|
-
} else {
|
|
24
|
-
this._fieldTypes = {};
|
|
25
|
-
for (let f of this._fields) {
|
|
26
|
-
this._fieldTypes[f] = _inferType(this.data.map(d => d[f]));
|
|
27
|
-
if (f.toLowerCase() == "year" && this._fieldTypes[f] == DataType.Integer)
|
|
28
|
-
this._fieldTypes[f] = DataType.Date;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//fix null values, cast type and summarize
|
|
32
|
-
this._validate(this.data, this._fieldTypes);
|
|
33
|
-
|
|
34
|
-
this._fieldSummaries = {};
|
|
35
|
-
for (let f of this._fields) {
|
|
36
|
-
this._fieldSummaries[f] = _summarize(this.data.map(d => d[f]), this._fieldTypes[f]);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//add row id
|
|
40
|
-
if (this._fields.indexOf(atlas_rowId) < 0) {
|
|
41
|
-
this._addField(atlas_rowId, DataType.String, this.data.map((d, i) => "r" + i));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
get name () {
|
|
46
|
-
if (this.url)
|
|
47
|
-
return _getFileName(this.url);
|
|
48
|
-
else
|
|
49
|
-
return this.id;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
//only tracking one transform away
|
|
53
|
-
set sourceDataTable(dt) {
|
|
54
|
-
this._sourceDataTable = dt;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
get sourceDataTable() {
|
|
58
|
-
return this._sourceDataTable;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
getEncodableFields(channel) {
|
|
62
|
-
switch(channel) {
|
|
63
|
-
case "x":
|
|
64
|
-
case "y":
|
|
65
|
-
case "width":
|
|
66
|
-
case "height":
|
|
67
|
-
case "radius":
|
|
68
|
-
case "fillColor":
|
|
69
|
-
case "strokeColor":
|
|
70
|
-
case "text":
|
|
71
|
-
return this.numericFields.concat(this.nonNumericFields);
|
|
72
|
-
case "area":
|
|
73
|
-
case "strokeWidth":
|
|
74
|
-
default:
|
|
75
|
-
return this.numericFields;
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
//transform from the source table to this table
|
|
81
|
-
// set transform(t) {
|
|
82
|
-
// this._transform = t;
|
|
83
|
-
// }
|
|
84
|
-
|
|
85
|
-
// get transform() {
|
|
86
|
-
// return this._transform;
|
|
87
|
-
// }
|
|
88
|
-
|
|
89
|
-
toJSON(){
|
|
90
|
-
let json = {};
|
|
91
|
-
json.data = this.rawData;
|
|
92
|
-
json.fieldTypes = this._fieldTypes;
|
|
93
|
-
json.url = this.url;
|
|
94
|
-
json.id = this.id;
|
|
95
|
-
json.sourceDataTable = this._sourceDataTable;
|
|
96
|
-
json.transform = this._transform;
|
|
97
|
-
json.dateMap = {};
|
|
98
|
-
return json;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
transformField(f, callback, newf) {
|
|
102
|
-
let values = this.data.map(d => callback(d[f]));
|
|
103
|
-
let type = _inferType(values);
|
|
104
|
-
let name = newf ? newf : Date.now() + "_field" + this._newField++;
|
|
105
|
-
this._addField(name, type, values);
|
|
106
|
-
return name;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
setValueOrder(field, values) {
|
|
110
|
-
this._fieldSummaries[field].unique = values;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
_addField(name, type, values) {
|
|
114
|
-
this.data.forEach( (d, i) => d[name] = values[i]);
|
|
115
|
-
this._fieldTypes[name] = type;
|
|
116
|
-
this._fields.push(name);
|
|
117
|
-
this._fieldSummaries[name] = _summarize(values, type);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
getFieldType(f) {
|
|
121
|
-
return this._fieldTypes[f];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
get fields() {
|
|
125
|
-
return this._fields;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
getFieldSummary(f) {
|
|
129
|
-
return this._fieldSummaries[f];
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
getFieldValues(f) {
|
|
133
|
-
return this.data.map(d => d[f]);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
getUniqueFieldValues(f) {
|
|
137
|
-
return this._fieldSummaries[f].unique;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
getRowCount() {
|
|
141
|
-
return this.data.length;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
hasField(f) {
|
|
145
|
-
return this._fields.indexOf(f) >= 0;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
//date values are parsed and stored as number of milliseconds
|
|
149
|
-
parseFieldAsDate(field, format) {
|
|
150
|
-
//TODO: validate field and format
|
|
151
|
-
let parse = d3.timeParse(format);
|
|
152
|
-
for (let row of this.data) {
|
|
153
|
-
let v = row[field];
|
|
154
|
-
if (v == null || v == undefined) {
|
|
155
|
-
v = "";
|
|
156
|
-
row[field] = (new Date(1899, 11, 31)).getTime();
|
|
157
|
-
} else {
|
|
158
|
-
row[field] = parse(v).getTime();
|
|
159
|
-
}
|
|
160
|
-
this._dateMap.set(row[field], v);
|
|
161
|
-
}
|
|
162
|
-
this._fieldTypes[field] = DataType.Date;
|
|
163
|
-
this._fieldSummaries[field] = _summarize(this.data.map(d => d[field]), DataType.Date);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
//TODO: need to return the true raw value from the input file
|
|
167
|
-
getRawValue(col, v) {
|
|
168
|
-
if (this.getFieldType(col) === DataType.Date)
|
|
169
|
-
return this._dateMap.get(v).toString();
|
|
170
|
-
else
|
|
171
|
-
return v;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
static get RowID() {
|
|
175
|
-
return atlas_rowId;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
get nonNumericFields() {
|
|
179
|
-
let r = [];
|
|
180
|
-
for (let f in this._fieldTypes) {
|
|
181
|
-
if (this._fieldTypes[f] != DataType.Number && this._fieldTypes[f] != DataType.Integer && f != DataTable.RowID) {
|
|
182
|
-
r.push(f);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
r.sort((a,b) => this.getUniqueFieldValues(a).length - this.getUniqueFieldValues(b).length);
|
|
186
|
-
return r;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
get numericFields() {
|
|
190
|
-
let r = [];
|
|
191
|
-
for (let f in this._fieldTypes) {
|
|
192
|
-
if ((this._fieldTypes[f] === DataType.Number || this._fieldTypes[f] === DataType.Integer) && f != DataTable.RowID) {
|
|
193
|
-
r.push(f);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return r;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
getFieldsByType(t) {
|
|
200
|
-
let r = [];
|
|
201
|
-
for (let f in this._fieldTypes) {
|
|
202
|
-
if ((this._fieldTypes[f] === t) && f != DataTable.RowID) {
|
|
203
|
-
r.push(f);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return r;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
transform(type, fields, params) {
|
|
210
|
-
let args = params ? params : {};
|
|
211
|
-
switch (type) {
|
|
212
|
-
case "kde":
|
|
213
|
-
return kde(this, fields, args);
|
|
214
|
-
case "bin":
|
|
215
|
-
return bin(this, fields, args);
|
|
216
|
-
case "sort":
|
|
217
|
-
return sort(this, fields, args);
|
|
218
|
-
case "filter":
|
|
219
|
-
return filter(this, fields);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
summarize(){
|
|
224
|
-
for (let f of this._fields) {
|
|
225
|
-
this._fieldSummaries[f] = _summarize(this.data.map(d => d[f]), this._fieldTypes[f]);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
_validate(data, fieldTypes) {
|
|
230
|
-
//date values are parsed and stored as number of milliseconds
|
|
231
|
-
for (let row of data) {
|
|
232
|
-
for (let f in fieldTypes) {
|
|
233
|
-
let type = fieldTypes[f], v = row[f], realv = undefined;
|
|
234
|
-
if (row[f] == null || row[f] == undefined) {
|
|
235
|
-
switch (type) {
|
|
236
|
-
case DataType.Boolean:
|
|
237
|
-
realv = false;
|
|
238
|
-
break;
|
|
239
|
-
case DataType.Date:
|
|
240
|
-
realv = (new Date(1899, 11, 31)).getTime();
|
|
241
|
-
break;
|
|
242
|
-
case DataType.String:
|
|
243
|
-
realv = "";
|
|
244
|
-
break;
|
|
245
|
-
default:
|
|
246
|
-
realv = 0;
|
|
247
|
-
break;
|
|
248
|
-
}
|
|
249
|
-
} else {
|
|
250
|
-
switch (type) {
|
|
251
|
-
case DataType.Boolean:
|
|
252
|
-
realv = v;
|
|
253
|
-
break;
|
|
254
|
-
case DataType.Date:
|
|
255
|
-
if (Number.isInteger(v)){ //year
|
|
256
|
-
realv = (new Date(v, 0)).getTime();
|
|
257
|
-
} else {
|
|
258
|
-
realv = (new Date(v+"")).getTime();
|
|
259
|
-
}
|
|
260
|
-
this._dateMap.set(realv, v);
|
|
261
|
-
break;
|
|
262
|
-
case DataType.String:
|
|
263
|
-
realv = v.toString();
|
|
264
|
-
break;
|
|
265
|
-
default:
|
|
266
|
-
realv = v;
|
|
267
|
-
break;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
row[f] = realv;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
function _summarize(values, type) {
|
|
277
|
-
var s = {};
|
|
278
|
-
switch (type) {
|
|
279
|
-
case DataType.Boolean:
|
|
280
|
-
s.trueCount = values.filter(d => d).length;
|
|
281
|
-
s.falseCount = values.filter(d => !d).length;
|
|
282
|
-
break;
|
|
283
|
-
case DataType.Date:
|
|
284
|
-
s.min = d3.min(values);
|
|
285
|
-
s.max = d3.max(values);
|
|
286
|
-
s.extent = [s.min, s.max];
|
|
287
|
-
s.unique = [...new Set(values)];
|
|
288
|
-
break;
|
|
289
|
-
case DataType.String:
|
|
290
|
-
s.unique = [...new Set(values)];
|
|
291
|
-
break;
|
|
292
|
-
default:
|
|
293
|
-
s.min = d3.min(values);
|
|
294
|
-
s.max = d3.max(values);
|
|
295
|
-
s.extent = [s.min, s.max];
|
|
296
|
-
s.mean = d3.mean(values);
|
|
297
|
-
s.median = d3.median(values);
|
|
298
|
-
s.unique = [...new Set(values)];
|
|
299
|
-
break;
|
|
300
|
-
}
|
|
301
|
-
return s;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
var isValidType = {
|
|
305
|
-
boolean: function(x) { return x==='true' || x==='false' || x === true || x === false || toString.call(x) == '[object Boolean]'; },
|
|
306
|
-
integer: function(x) { return isValidType.number(x) && (x=+x) === ~~x; },
|
|
307
|
-
number: function(x) { return !isNaN(+x) && toString.call(x) != '[object Date]'; },
|
|
308
|
-
// date: function(x) { return !isNaN(Date.parse(x)); },
|
|
309
|
-
date: function(x) { let d = new Date(x); return d != undefined && !isNaN(d) },
|
|
310
|
-
// eslint-disable-next-line no-unused-vars
|
|
311
|
-
string: function(x) {return true}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
function _inferType(values) {
|
|
315
|
-
var types = Object.values(DataType);
|
|
316
|
-
for (let i = 0; i < values.length; i++) {
|
|
317
|
-
let v = values[i];
|
|
318
|
-
if (v == null) continue;
|
|
319
|
-
for (let j = 0; j < types.length; j++) {
|
|
320
|
-
if (!isValidType[types[j]](v)) {
|
|
321
|
-
types.splice(j, 1);
|
|
322
|
-
j -= 1;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
if (types.length == 1)
|
|
326
|
-
return types[0];
|
|
327
|
-
}
|
|
328
|
-
return types[0];
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
function _getFileName(url){
|
|
332
|
-
var startIndex = (url.indexOf('\\') >= 0 ? url.lastIndexOf('\\') : url.lastIndexOf('/'));
|
|
333
|
-
var filename = url.substring(startIndex);
|
|
334
|
-
if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) {
|
|
335
|
-
filename = filename.substring(1);
|
|
336
|
-
}
|
|
337
|
-
return filename;
|
|
338
|
-
}
|
package/src-old/data/Network.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import DataTable from "./DataTable";
|
|
2
|
-
import { nodeId } from "../util/Constants";
|
|
3
|
-
import partition from "./transform/partition";
|
|
4
|
-
|
|
5
|
-
export default class Network {
|
|
6
|
-
|
|
7
|
-
constructor(data, name) {
|
|
8
|
-
this._type = "network";
|
|
9
|
-
this._nodeTable = new DataTable(data["nodes"], "nodes");
|
|
10
|
-
this._linkTable = new DataTable(data["links"], "links");
|
|
11
|
-
this._nodeTable.graph = this;
|
|
12
|
-
this._linkTable.graph = this;
|
|
13
|
-
this._nodes = data["nodes"];
|
|
14
|
-
this._links = data["links"];
|
|
15
|
-
this._name = name;
|
|
16
|
-
this._nodeHash = {};
|
|
17
|
-
for (let n of data["nodes"]){
|
|
18
|
-
this._nodeHash[n[nodeId]] = n;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
get type() {
|
|
23
|
-
return this._type;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
get nodeTable() {
|
|
27
|
-
return this._nodeTable;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
get linkTable() {
|
|
31
|
-
return this._linkTable;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get nodes() {
|
|
35
|
-
return this._nodes;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
get links() {
|
|
39
|
-
return this._links;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
getNode(id) {
|
|
43
|
-
return this._nodeHash[id];
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
getSources(node) {
|
|
47
|
-
let id = node[nodeId];
|
|
48
|
-
let links = this._links["data"];
|
|
49
|
-
let nodes = this._nodes["data"];
|
|
50
|
-
let sources = [];
|
|
51
|
-
let sourceId;
|
|
52
|
-
|
|
53
|
-
for (let i in links) {
|
|
54
|
-
if (links[i]["target"] == id) {
|
|
55
|
-
sourceId = links[i]["source"]; // Get the index of source node
|
|
56
|
-
let index = nodes.findIndex(x => x[nodeId] === sourceId);
|
|
57
|
-
sources.push(nodes[index]);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return sources;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
getTargets(node) {
|
|
64
|
-
let id = node[nodeId];
|
|
65
|
-
let links = this._links["data"];
|
|
66
|
-
let nodes = this._nodes["data"];
|
|
67
|
-
let targets = [];
|
|
68
|
-
let targetId;
|
|
69
|
-
|
|
70
|
-
for (let i in links) {
|
|
71
|
-
if (links[i]["source"] == id) {
|
|
72
|
-
targetId = links[i]["target"];
|
|
73
|
-
let index = nodes.findIndex(x => x[nodeId] === targetId);
|
|
74
|
-
targets.push(nodes[index]);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return targets;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
transform(type, fields, params) {
|
|
81
|
-
let args = params ? params : {};
|
|
82
|
-
switch (type) {
|
|
83
|
-
case "partition":
|
|
84
|
-
return partition(this, fields, args);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
isLinear() {
|
|
89
|
-
let inDeg = {}, outDeg = {};
|
|
90
|
-
for (let l of this._links) {
|
|
91
|
-
if (!(l.source in outDeg))
|
|
92
|
-
outDeg[l.source] = 0;
|
|
93
|
-
if (!(l.target in inDeg))
|
|
94
|
-
inDeg[l.target] = 0;
|
|
95
|
-
outDeg[l.source]++;
|
|
96
|
-
inDeg[l.target]++;
|
|
97
|
-
}
|
|
98
|
-
for (let n in inDeg)
|
|
99
|
-
if (inDeg[n] > 1)
|
|
100
|
-
return false;
|
|
101
|
-
for (let n in outDeg)
|
|
102
|
-
if (outDeg[n] > 1)
|
|
103
|
-
return false;
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
}
|