@visactor/vgrammar-core 0.8.0 → 0.8.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.
Files changed (105) hide show
  1. package/cjs/component/datazoom.js +4 -4
  2. package/cjs/component/datazoom.js.map +1 -1
  3. package/cjs/component/label.js +12 -7
  4. package/cjs/component/label.js.map +1 -1
  5. package/cjs/graph/animation/animate.d.ts +1 -0
  6. package/cjs/graph/animation/animate.js +4 -0
  7. package/cjs/graph/animation/animate.js.map +1 -1
  8. package/cjs/graph/element.js +7 -9
  9. package/cjs/graph/element.js.map +1 -1
  10. package/cjs/graph/glyph-element.js +2 -3
  11. package/cjs/graph/glyph-element.js.map +1 -1
  12. package/cjs/index.d.ts +1 -1
  13. package/cjs/index.js +1 -1
  14. package/cjs/index.js.map +1 -1
  15. package/cjs/theme/common/component.d.ts +2 -1
  16. package/cjs/theme/common/component.js +13 -1
  17. package/cjs/theme/common/component.js.map +1 -1
  18. package/cjs/theme/dark.js.map +1 -1
  19. package/cjs/transforms/data/sampling.d.ts +2 -0
  20. package/cjs/transforms/data/sampling.js +111 -0
  21. package/cjs/transforms/data/sampling.js.map +1 -0
  22. package/cjs/transforms/index.d.ts +1 -1
  23. package/cjs/transforms/index.js +6 -6
  24. package/cjs/transforms/index.js.map +1 -1
  25. package/cjs/transforms/util/util.d.ts +4 -0
  26. package/cjs/transforms/util/util.js +20 -2
  27. package/cjs/transforms/util/util.js.map +1 -1
  28. package/cjs/types/animate.d.ts +1 -0
  29. package/cjs/types/animate.js.map +1 -1
  30. package/cjs/types/theme.d.ts +2 -1
  31. package/cjs/types/theme.js.map +1 -1
  32. package/cjs/types/transform.d.ts +5 -5
  33. package/cjs/types/transform.js.map +1 -1
  34. package/cjs/types/view.d.ts +1 -0
  35. package/cjs/types/view.js.map +1 -1
  36. package/cjs/view/View.js +3 -2
  37. package/cjs/view/View.js.map +1 -1
  38. package/cjs/view/dataflow.d.ts +1 -0
  39. package/cjs/view/dataflow.js +9 -4
  40. package/cjs/view/dataflow.js.map +1 -1
  41. package/es/component/datazoom.js +4 -4
  42. package/es/component/datazoom.js.map +1 -1
  43. package/es/component/label.js +12 -7
  44. package/es/component/label.js.map +1 -1
  45. package/es/graph/animation/animate.d.ts +1 -0
  46. package/es/graph/animation/animate.js +4 -0
  47. package/es/graph/animation/animate.js.map +1 -1
  48. package/es/graph/element.js +7 -9
  49. package/es/graph/element.js.map +1 -1
  50. package/es/graph/glyph-element.js +2 -3
  51. package/es/graph/glyph-element.js.map +1 -1
  52. package/es/index.d.ts +1 -1
  53. package/es/index.js +1 -1
  54. package/es/index.js.map +1 -1
  55. package/es/interactions/brush-filter.js +1 -2
  56. package/es/interactions/element-highlight-by-group.js +2 -1
  57. package/es/interactions/index.js +1 -2
  58. package/es/interactions/legend-filter.js +1 -1
  59. package/es/interactions/player-filter.js +1 -1
  60. package/es/interactions/roll-up.js +1 -1
  61. package/es/interactions/scrollbar-filter.js +1 -1
  62. package/es/interactions/slider-filter.js +1 -1
  63. package/es/interactions/tooltip.js +1 -1
  64. package/es/interactions/view-drag-mixin.js +1 -1
  65. package/es/parse/coordinate.js +1 -1
  66. package/es/parse/event.js +1 -1
  67. package/es/parse/mark.js +1 -1
  68. package/es/parse/option.js +1 -1
  69. package/es/parse/scale.js +2 -1
  70. package/es/parse/transform.js +1 -1
  71. package/es/parse/util.js +1 -1
  72. package/es/parse/view.js +1 -1
  73. package/es/theme/common/component.d.ts +2 -1
  74. package/es/theme/common/component.js +14 -0
  75. package/es/theme/common/component.js.map +1 -1
  76. package/es/theme/dark.js.map +1 -1
  77. package/es/transforms/data/sampling.d.ts +2 -0
  78. package/es/transforms/data/sampling.js +105 -0
  79. package/es/transforms/data/sampling.js.map +1 -0
  80. package/es/transforms/index.d.ts +1 -1
  81. package/es/transforms/index.js +4 -4
  82. package/es/transforms/index.js.map +1 -1
  83. package/es/transforms/util/util.d.ts +4 -0
  84. package/es/transforms/util/util.js +17 -0
  85. package/es/transforms/util/util.js.map +1 -1
  86. package/es/types/animate.d.ts +1 -0
  87. package/es/types/animate.js.map +1 -1
  88. package/es/types/theme.d.ts +2 -1
  89. package/es/types/theme.js.map +1 -1
  90. package/es/types/transform.d.ts +5 -5
  91. package/es/types/transform.js.map +1 -1
  92. package/es/types/view.d.ts +1 -0
  93. package/es/types/view.js.map +1 -1
  94. package/es/view/View.js +2 -2
  95. package/es/view/View.js.map +1 -1
  96. package/es/view/dataflow.d.ts +1 -0
  97. package/es/view/dataflow.js +9 -4
  98. package/es/view/dataflow.js.map +1 -1
  99. package/package.json +9 -9
  100. package/cjs/transforms/mark/lttb-sample.d.ts +0 -2
  101. package/cjs/transforms/mark/lttb-sample.js +0 -68
  102. package/cjs/transforms/mark/lttb-sample.js.map +0 -1
  103. package/es/transforms/mark/lttb-sample.d.ts +0 -2
  104. package/es/transforms/mark/lttb-sample.js +0 -60
  105. package/es/transforms/mark/lttb-sample.js.map +0 -1
@@ -105,9 +105,10 @@ export default class Dataflow {
105
105
  this.logger.canLogInfo() && (dt = Date.now(), this.logger.debug(`-- START PROPAGATION (${this._updateCounter}) -----`)),
106
106
  this._beforeEvaluate();
107
107
  try {
108
- for (;this._heap.size() > 0; ) grammar = this._heap.pop(), grammar.rank === grammar.qrank ? (next = grammar.run(),
109
- next && next.then && (next = yield next), this._logGrammarRunInfo(grammar), this._enqueueTargets(grammar),
110
- count += 1) : this._enqueue(grammar);
108
+ for (;this._heap.size() > 0; ) if (grammar = this._heap.pop(), grammar.rank === grammar.qrank) {
109
+ if (next = grammar.run(), next && next.then && (next = yield next), !this._isRunning) return !1;
110
+ this._logGrammarRunInfo(grammar), this._enqueueTargets(grammar), count += 1;
111
+ } else this._enqueue(grammar);
111
112
  } catch (err) {
112
113
  this._heap.clear(), error = err;
113
114
  }
@@ -128,6 +129,9 @@ export default class Dataflow {
128
129
  this.logger.info(`> ${count} grammars updated; ${dt} ms`)), this._afterRunner && this._afterRunner(this),
129
130
  this._finishFirstRender = !0, !0;
130
131
  }
132
+ stop() {
133
+ this._isRunning && (this._isRunning = !1);
134
+ }
131
135
  runBefore(callback) {
132
136
  this._beforeRunner = callback;
133
137
  }
@@ -135,7 +139,8 @@ export default class Dataflow {
135
139
  this._afterRunner = callback;
136
140
  }
137
141
  release() {
138
- this._heap && (this._heap.clear(), this._heap = null), this.logger = null, this._committed = null;
142
+ this.stop(), this._heap && (this._heap.clear(), this._heap = null), this.logger = null,
143
+ this._committed = null;
139
144
  }
140
145
  }
141
146
  //# sourceMappingURL=dataflow.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/view/dataflow.ts"],"names":[],"mappings":"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","file":"dataflow.js","sourcesContent":["import type { ILogger } from '@visactor/vutils';\nimport type { IDataflow } from '../types/dataflow';\nimport { isNil, Logger } from '@visactor/vutils';\nimport { Heap } from '../util/grammar-heap';\nimport { UniqueList } from '../util/unique-list';\nimport type { IDataflowCallback, IGrammarBase } from '../types';\n\n/**\n * A dataflow to run all the grammar elements\n */\nexport default class Dataflow implements IDataflow {\n logger: ILogger;\n private grammars: IGrammarBase[] = [];\n /** 当前排序 */\n private _curRank: number;\n /** 发生了变更的元素 */\n private _committed?: UniqueList<IGrammarBase>;\n private _heap?: Heap;\n private _beforeRunner?: IDataflowCallback;\n private _afterRunner?: IDataflowCallback;\n /** 正在运行dataflow */\n private _isRunning?: boolean;\n private _updateCounter: number;\n /** 是否完成初次渲染 */\n private _finishFirstRender?: boolean;\n\n constructor() {\n this.logger = Logger.getInstance();\n\n this._curRank = 0;\n\n this._committed = new UniqueList(grammar => grammar.uid);\n\n this._heap = new Heap((a, b) => a.qrank - b.qrank);\n this._beforeRunner = null;\n this._afterRunner = null;\n this._isRunning = false;\n this._updateCounter = 0;\n this._finishFirstRender = false;\n }\n\n async asyncCallback(callback: (context: IDataflow) => any) {\n try {\n await callback(this);\n } catch (err) {\n this.logger.error(err);\n }\n }\n\n add(grammar: IGrammarBase) {\n if (!grammar) {\n return;\n }\n this._setRankOfGrammar(grammar);\n this.commit(grammar);\n if (!this.grammars.includes(grammar)) {\n this.grammars.push(grammar);\n\n return true;\n }\n\n return false;\n }\n\n remove(grammar: IGrammarBase) {\n if (grammar) {\n this._committed.remove(grammar);\n this._heap.remove(grammar);\n this.grammars = this.grammars.filter(storedGrammar => storedGrammar !== grammar);\n }\n }\n\n private _setRankOfGrammar(grammar?: IGrammarBase) {\n grammar.rank = ++this._curRank;\n }\n\n private _reRank(grammar?: IGrammarBase) {\n const queue = [grammar];\n\n while (queue.length) {\n const cur = queue.pop();\n this._setRankOfGrammar(cur);\n const list = cur.targets;\n\n if (list) {\n list.forEach((entry: IGrammarBase) => {\n queue.push(entry);\n if (entry === grammar) {\n this.logger.error('Cycle detected in dataflow graph.');\n }\n });\n }\n }\n }\n\n private _enqueue(grammar: IGrammarBase) {\n (grammar as any).qrank = grammar.rank;\n // push and reRank in the heap\n this._heap.push(grammar);\n }\n\n private _logGrammarRunInfo(grammar: IGrammarBase) {\n if (this.logger.canLogError()) {\n const debugInfos = [\n { key: 'id', value: grammar.id() },\n { key: 'name', value: grammar.name() }\n ];\n const debugStr = debugInfos.reduce((str, entry, index) => {\n if (!isNil(entry.value)) {\n return `${str}${index ? ' , ' : ''}${entry.key}: ${entry.value}`;\n }\n\n return str;\n }, '');\n\n this.logger.debug('Run Operator: ', grammar, debugStr);\n }\n }\n\n hasCommitted() {\n return !!this._committed.length;\n }\n\n // OPERATOR UPDATES\n commit(grammar: IGrammarBase) {\n if (this._isRunning) {\n // this may lead to a problem, the same op may be added to the queue multiple times\n // if in midst of propagation, add to priority queue\n this._enqueue(grammar);\n } else {\n // otherwise, queue for next propagation\n this._committed.add(grammar);\n }\n\n return this;\n }\n\n private _beforeEvaluate() {\n // reRank grammar element which has higher rank than its targets\n this.grammars.forEach(grammar => {\n if (grammar.targets.some(target => target.rank < grammar.rank)) {\n this._reRank(grammar);\n }\n });\n // initialize priority queue, reset committed grammars\n this._committed.forEach(grammar => this._enqueue(grammar));\n this._committed = new UniqueList(grammar => grammar.uid);\n }\n\n private _enqueueTargets(grammar: IGrammarBase) {\n if (grammar.targets && grammar.targets.length && this._finishFirstRender) {\n grammar.targets.forEach((target: IGrammarBase) => this._enqueue(target));\n }\n }\n\n async evaluate() {\n // invoke prerun function, if provided\n if (this._beforeRunner) {\n await this.asyncCallback(this._beforeRunner);\n }\n\n // exit early if there are no updates\n if (!this._committed.length) {\n this.logger.info('Dataflow invoked, but nothing to do.');\n return false;\n }\n\n this._isRunning = true;\n this._updateCounter += 1;\n let count = 0;\n let grammar;\n let next;\n let dt;\n let error;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now();\n this.logger.debug(`-- START PROPAGATION (${this._updateCounter}) -----`);\n }\n\n this._beforeEvaluate();\n\n try {\n while (this._heap.size() > 0) {\n // dequeue grammar with highest priority\n grammar = this._heap.pop();\n\n // re-queue if rank changed\n if (grammar.rank !== grammar.qrank) {\n this._enqueue(grammar);\n continue;\n }\n\n next = grammar.run();\n\n // await if grammar returned a promise\n if (next && next.then) {\n next = await next;\n }\n\n this._logGrammarRunInfo(grammar);\n this._enqueueTargets(grammar);\n count += 1;\n }\n } catch (err) {\n this._heap.clear();\n error = err;\n }\n\n this._isRunning = false;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now() - dt;\n this.logger.info(`> ${count} grammars; ${dt} ms`);\n }\n\n if (error) {\n this.logger.error(error);\n } else if (this._afterRunner) {\n // invoke callbacks queued via runAfter\n await this.asyncCallback(this._afterRunner);\n }\n\n this._finishFirstRender = true;\n\n return true;\n }\n\n evaluateSync() {\n // invoke prerun function, if provided\n if (this._beforeRunner) {\n this._beforeRunner(this);\n }\n\n // exit early if there are no updates\n if (!this._committed.length) {\n this.logger.info('Dataflow invoked, but nothing to do.');\n return false;\n }\n\n this._isRunning = true;\n this._updateCounter += 1;\n let count = 0;\n let grammar;\n let dt;\n let error;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now();\n this.logger.debug(`-- START PROPAGATION (${this._updateCounter}) -----`);\n }\n\n this._beforeEvaluate();\n\n while (this._heap.size() > 0) {\n // dequeue grammar with highest priority\n grammar = this._heap.pop();\n\n // re-queue if rank changed\n if (grammar.rank !== grammar.qrank) {\n this._enqueue(grammar);\n continue;\n }\n\n grammar.runSync();\n\n this._logGrammarRunInfo(grammar);\n this._enqueueTargets(grammar);\n count += 1;\n }\n\n this._isRunning = false;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now() - dt;\n this.logger.info(`> ${count} grammars updated; ${dt} ms`);\n }\n\n if (error) {\n this.logger.error(error);\n } else if (this._afterRunner) {\n this._afterRunner(this);\n }\n\n this._finishFirstRender = true;\n\n return true;\n }\n\n runBefore(callback?: IDataflowCallback) {\n this._beforeRunner = callback;\n }\n\n runAfter(callback?: IDataflowCallback) {\n this._afterRunner = callback;\n }\n\n release() {\n if (this._heap) {\n this._heap.clear();\n this._heap = null;\n }\n\n this.logger = null;\n this._committed = null;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/view/dataflow.ts"],"names":[],"mappings":"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","file":"dataflow.js","sourcesContent":["import type { ILogger } from '@visactor/vutils';\nimport type { IDataflow } from '../types/dataflow';\nimport { isNil, Logger } from '@visactor/vutils';\nimport { Heap } from '../util/grammar-heap';\nimport { UniqueList } from '../util/unique-list';\nimport type { IDataflowCallback, IGrammarBase } from '../types';\n\n/**\n * A dataflow to run all the grammar elements\n */\nexport default class Dataflow implements IDataflow {\n logger: ILogger;\n private grammars: IGrammarBase[] = [];\n /** 当前排序 */\n private _curRank: number;\n /** 发生了变更的元素 */\n private _committed?: UniqueList<IGrammarBase>;\n private _heap?: Heap;\n private _beforeRunner?: IDataflowCallback;\n private _afterRunner?: IDataflowCallback;\n /** 正在运行dataflow */\n private _isRunning?: boolean;\n private _updateCounter: number;\n /** 是否完成初次渲染 */\n private _finishFirstRender?: boolean;\n\n constructor() {\n this.logger = Logger.getInstance();\n\n this._curRank = 0;\n\n this._committed = new UniqueList(grammar => grammar.uid);\n\n this._heap = new Heap((a, b) => a.qrank - b.qrank);\n this._beforeRunner = null;\n this._afterRunner = null;\n this._isRunning = false;\n this._updateCounter = 0;\n this._finishFirstRender = false;\n }\n\n async asyncCallback(callback: (context: IDataflow) => any) {\n try {\n await callback(this);\n } catch (err) {\n this.logger.error(err);\n }\n }\n\n add(grammar: IGrammarBase) {\n if (!grammar) {\n return;\n }\n this._setRankOfGrammar(grammar);\n this.commit(grammar);\n if (!this.grammars.includes(grammar)) {\n this.grammars.push(grammar);\n\n return true;\n }\n\n return false;\n }\n\n remove(grammar: IGrammarBase) {\n if (grammar) {\n this._committed.remove(grammar);\n this._heap.remove(grammar);\n this.grammars = this.grammars.filter(storedGrammar => storedGrammar !== grammar);\n }\n }\n\n private _setRankOfGrammar(grammar?: IGrammarBase) {\n grammar.rank = ++this._curRank;\n }\n\n private _reRank(grammar?: IGrammarBase) {\n const queue = [grammar];\n\n while (queue.length) {\n const cur = queue.pop();\n this._setRankOfGrammar(cur);\n const list = cur.targets;\n\n if (list) {\n list.forEach((entry: IGrammarBase) => {\n queue.push(entry);\n if (entry === grammar) {\n this.logger.error('Cycle detected in dataflow graph.');\n }\n });\n }\n }\n }\n\n private _enqueue(grammar: IGrammarBase) {\n (grammar as any).qrank = grammar.rank;\n // push and reRank in the heap\n this._heap.push(grammar);\n }\n\n private _logGrammarRunInfo(grammar: IGrammarBase) {\n if (this.logger.canLogError()) {\n const debugInfos = [\n { key: 'id', value: grammar.id() },\n { key: 'name', value: grammar.name() }\n ];\n const debugStr = debugInfos.reduce((str, entry, index) => {\n if (!isNil(entry.value)) {\n return `${str}${index ? ' , ' : ''}${entry.key}: ${entry.value}`;\n }\n\n return str;\n }, '');\n\n this.logger.debug('Run Operator: ', grammar, debugStr);\n }\n }\n\n hasCommitted() {\n return !!this._committed.length;\n }\n\n // OPERATOR UPDATES\n commit(grammar: IGrammarBase) {\n if (this._isRunning) {\n // this may lead to a problem, the same op may be added to the queue multiple times\n // if in midst of propagation, add to priority queue\n this._enqueue(grammar);\n } else {\n // otherwise, queue for next propagation\n this._committed.add(grammar);\n }\n\n return this;\n }\n\n private _beforeEvaluate() {\n // reRank grammar element which has higher rank than its targets\n this.grammars.forEach(grammar => {\n if (grammar.targets.some(target => target.rank < grammar.rank)) {\n this._reRank(grammar);\n }\n });\n // initialize priority queue, reset committed grammars\n this._committed.forEach(grammar => this._enqueue(grammar));\n this._committed = new UniqueList(grammar => grammar.uid);\n }\n\n private _enqueueTargets(grammar: IGrammarBase) {\n if (grammar.targets && grammar.targets.length && this._finishFirstRender) {\n grammar.targets.forEach((target: IGrammarBase) => this._enqueue(target));\n }\n }\n\n async evaluate() {\n // invoke prerun function, if provided\n if (this._beforeRunner) {\n await this.asyncCallback(this._beforeRunner);\n }\n\n // exit early if there are no updates\n if (!this._committed.length) {\n this.logger.info('Dataflow invoked, but nothing to do.');\n return false;\n }\n\n this._isRunning = true;\n this._updateCounter += 1;\n let count = 0;\n let grammar;\n let next;\n let dt;\n let error;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now();\n this.logger.debug(`-- START PROPAGATION (${this._updateCounter}) -----`);\n }\n\n this._beforeEvaluate();\n\n try {\n while (this._heap.size() > 0) {\n // dequeue grammar with highest priority\n grammar = this._heap.pop();\n\n // re-queue if rank changed\n if (grammar.rank !== grammar.qrank) {\n this._enqueue(grammar);\n continue;\n }\n\n next = grammar.run();\n\n // await if grammar returned a promise\n if (next && next.then) {\n next = await next;\n }\n\n // finish evaluation if dataflow is stopped during asynchronous process\n if (!this._isRunning) {\n return false;\n }\n\n this._logGrammarRunInfo(grammar);\n this._enqueueTargets(grammar);\n count += 1;\n }\n } catch (err) {\n this._heap.clear();\n error = err;\n }\n\n this._isRunning = false;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now() - dt;\n this.logger.info(`> ${count} grammars; ${dt} ms`);\n }\n\n if (error) {\n this.logger.error(error);\n } else if (this._afterRunner) {\n // invoke callbacks queued via runAfter\n await this.asyncCallback(this._afterRunner);\n }\n\n this._finishFirstRender = true;\n\n return true;\n }\n\n evaluateSync() {\n // invoke prerun function, if provided\n if (this._beforeRunner) {\n this._beforeRunner(this);\n }\n\n // exit early if there are no updates\n if (!this._committed.length) {\n this.logger.info('Dataflow invoked, but nothing to do.');\n return false;\n }\n\n this._isRunning = true;\n this._updateCounter += 1;\n let count = 0;\n let grammar;\n let dt;\n let error;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now();\n this.logger.debug(`-- START PROPAGATION (${this._updateCounter}) -----`);\n }\n\n this._beforeEvaluate();\n\n while (this._heap.size() > 0) {\n // dequeue grammar with highest priority\n grammar = this._heap.pop();\n\n // re-queue if rank changed\n if (grammar.rank !== grammar.qrank) {\n this._enqueue(grammar);\n continue;\n }\n\n grammar.runSync();\n\n this._logGrammarRunInfo(grammar);\n this._enqueueTargets(grammar);\n count += 1;\n }\n\n this._isRunning = false;\n\n if (this.logger.canLogInfo()) {\n dt = Date.now() - dt;\n this.logger.info(`> ${count} grammars updated; ${dt} ms`);\n }\n\n if (error) {\n this.logger.error(error);\n } else if (this._afterRunner) {\n this._afterRunner(this);\n }\n\n this._finishFirstRender = true;\n\n return true;\n }\n\n private stop() {\n if (!this._isRunning) {\n return;\n }\n this._isRunning = false;\n }\n\n runBefore(callback?: IDataflowCallback) {\n this._beforeRunner = callback;\n }\n\n runAfter(callback?: IDataflowCallback) {\n this._afterRunner = callback;\n }\n\n release() {\n // stop asynchronous evaluation\n this.stop();\n\n if (this._heap) {\n this._heap.clear();\n this._heap = null;\n }\n\n this.logger = null;\n this._committed = null;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vgrammar-core",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "VGrammar is a visual grammar library",
5
5
  "keywords": [
6
6
  "grammar",
@@ -24,14 +24,14 @@
24
24
  "dist"
25
25
  ],
26
26
  "dependencies": {
27
- "@visactor/vgrammar-coordinate": "0.8.0",
28
- "@visactor/vgrammar-util": "0.8.0",
29
- "@visactor/vscale": "~0.16.4",
30
- "@visactor/vrender-core": "~0.16.1",
31
- "@visactor/vrender-kits": "~0.16.1",
32
- "@visactor/vrender-components": "~0.16.1",
33
- "@visactor/vutils": "~0.16.4",
34
- "@visactor/vdataset": "~0.16.4"
27
+ "@visactor/vgrammar-coordinate": "0.8.1",
28
+ "@visactor/vgrammar-util": "0.8.1",
29
+ "@visactor/vscale": "~0.16.5",
30
+ "@visactor/vrender-core": "~0.16.8",
31
+ "@visactor/vrender-kits": "~0.16.8",
32
+ "@visactor/vrender-components": "~0.16.8",
33
+ "@visactor/vutils": "~0.16.5",
34
+ "@visactor/vdataset": "~0.16.5"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@rushstack/eslint-patch": "~1.1.4",
@@ -1,2 +0,0 @@
1
- import type { IElement, LttbSampleTransformOptions } from '../../types';
2
- export declare const transform: (options: LttbSampleTransformOptions, upstreamData: IElement[]) => IElement[];
@@ -1,68 +0,0 @@
1
- "use strict";
2
-
3
- function lttb(size, array, isGroup, yfield) {
4
- const frameSize = Math.floor(array.length / size), newIndices = [], len = array.length;
5
- let maxArea, area, nextIndex, currentIndex = 0, sampledIndex = 0;
6
- newIndices[sampledIndex++] = currentIndex;
7
- for (let i = 1; i < len - 1; i += frameSize) {
8
- const nextFrameStart = Math.min(i + frameSize, len - 1), nextFrameEnd = Math.min(i + 2 * frameSize, len), avgX = (nextFrameEnd + nextFrameStart) / 2;
9
- let avgY = 0;
10
- for (let idx = nextFrameStart; idx < nextFrameEnd; idx++) {
11
- const y = isGroup ? array[idx].y : array[idx][yfield];
12
- Number.isNaN(y) || (avgY += y);
13
- }
14
- avgY /= nextFrameEnd - nextFrameStart;
15
- const frameStart = i, frameEnd = Math.min(i + frameSize, len), pointAX = i - 1, pointAY = isGroup ? array[currentIndex].y : array[currentIndex][yfield];
16
- maxArea = -1, nextIndex = frameStart;
17
- for (let idx = frameStart; idx < frameEnd; idx++) {
18
- const y = isGroup ? array[idx].y : array[idx][yfield];
19
- Number.isNaN(y) || (area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)),
20
- area > maxArea && (maxArea = area, nextIndex = idx));
21
- }
22
- newIndices[sampledIndex++] = nextIndex, currentIndex = nextIndex;
23
- }
24
- newIndices[sampledIndex - 1] !== len - 1 && (newIndices[sampledIndex++] = len - 1);
25
- return newIndices.map((i => isGroup ? array[i].i : i));
26
- }
27
-
28
- Object.defineProperty(exports, "__esModule", {
29
- value: !0
30
- }), exports.transform = void 0;
31
-
32
- const transform = (options, upstreamData) => {
33
- let size = options.size;
34
- const factor = options.factor || 1;
35
- if (Array.isArray(size) && (size = Math.floor(size[1] - size[0])), size *= factor,
36
- size <= 0) return [];
37
- if (upstreamData.length <= size) return upstreamData;
38
- if (options.skipfirst) return upstreamData.slice(0, 1);
39
- const {yfield: yfield, groupBy: groupBy} = options;
40
- if (upstreamData.length) {
41
- const groups = {};
42
- if (groupBy) {
43
- for (let i = 0, n = upstreamData.length; i < n; i++) {
44
- const datum = upstreamData[i], groupId = datum[groupBy];
45
- groups[groupId] || (groups[groupId] = []), groups[groupId].push({
46
- y: datum[yfield],
47
- i: i
48
- });
49
- }
50
- let rawIndice = [];
51
- return Object.keys(groups).forEach((groupName => {
52
- const group = groups[groupName];
53
- if (group.length <= size) {
54
- const indices = group.map((datum => datum.i));
55
- rawIndice = rawIndice.concat(indices);
56
- } else {
57
- const indices = lttb(size, group, !0);
58
- rawIndice = rawIndice.concat(indices);
59
- }
60
- })), rawIndice.sort(((a, b) => a - b)), rawIndice.map((index => upstreamData[index]));
61
- }
62
- return lttb(size, upstreamData, !1, yfield).map((index => upstreamData[index]));
63
- }
64
- return [];
65
- };
66
-
67
- exports.transform = transform;
68
- //# sourceMappingURL=lttb-sample.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/transforms/mark/lttb-sample.ts"],"names":[],"mappings":"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","file":"lttb-sample.js","sourcesContent":["import type { IElement, LttbSampleTransformOptions } from '../../types';\n\nfunction lttb(size: number, array: any[], isGroup: boolean, yfield?: string) {\n const frameSize = Math.floor(array.length / size);\n const newIndices = [];\n const len = array.length;\n\n let currentIndex = 0;\n let sampledIndex = 0;\n let maxArea;\n let area;\n let nextIndex;\n\n // First frame use the first data.\n newIndices[sampledIndex++] = currentIndex;\n\n for (let i = 1; i < len - 1; i += frameSize) {\n const nextFrameStart = Math.min(i + frameSize, len - 1);\n const nextFrameEnd = Math.min(i + frameSize * 2, len);\n\n const avgX = (nextFrameEnd + nextFrameStart) / 2;\n let avgY = 0;\n\n for (let idx = nextFrameStart; idx < nextFrameEnd; idx++) {\n const y = isGroup ? array[idx].y : array[idx][yfield];\n if (Number.isNaN(y)) {\n continue;\n }\n avgY += y;\n }\n avgY /= nextFrameEnd - nextFrameStart;\n\n const frameStart = i;\n const frameEnd = Math.min(i + frameSize, len);\n\n const pointAX = i - 1;\n const pointAY = isGroup ? array[currentIndex].y : array[currentIndex][yfield];\n\n maxArea = -1;\n\n nextIndex = frameStart;\n // Find a point from current frame that construct a triangel with largest area with previous selected point\n // And the average of next frame.\n for (let idx = frameStart; idx < frameEnd; idx++) {\n const y = isGroup ? array[idx].y : array[idx][yfield];\n if (Number.isNaN(y)) {\n continue;\n }\n // Calculate triangle area over three buckets\n area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY));\n if (area > maxArea) {\n maxArea = area;\n nextIndex = idx; // Next a is this b\n }\n }\n\n newIndices[sampledIndex++] = nextIndex;\n\n currentIndex = nextIndex; // This a is the next a (chosen b)\n }\n\n // First frame use the last data.\n if (newIndices[sampledIndex - 1] !== len - 1) {\n newIndices[sampledIndex++] = len - 1;\n }\n\n // output newly added tuples\n const newRawIndices = newIndices.map(i => (isGroup ? array[i].i : i));\n return newRawIndices;\n}\n\n/**\n * Samples tuples passing through this operator.\n * Uses lttb sampling to maintain a trend-maintained sample.\n * @constructor\n * @param {object} options - The parameters for this operator.\n * @param {number} [options.size=1000] - The maximum number of samples.\n * @param {string} [options.xfield] - The xfield string of data.\n * @param {string} [options.yfield] - The yfield string of data.\n * @param {string} [options.groupBy] - The groupBy string of data.\n */\n\nexport const transform = (options: LttbSampleTransformOptions, upstreamData: IElement[]) => {\n let size = options.size;\n const factor = options.factor || 1;\n\n if (Array.isArray(size)) {\n size = Math.floor(size[1] - size[0]);\n }\n\n size *= factor;\n\n // size<=0的特殊情况不采样,返回空\n if (size <= 0) {\n return [];\n }\n\n // 数据<size的情况,不进行采样,保留所有数据\n if (upstreamData.length <= size) {\n return upstreamData;\n }\n\n const skipfirst = options.skipfirst;\n // 如果是ChartSpace的第一次数据流(evaluateAsync),不需要采样,返回一条数据供布局使用\n // 这里需要依据this.value.length判断是不是第一次数据流,\n // 以避免点击图例,updateChartData等操作清空所有label\n if (skipfirst) {\n return upstreamData.slice(0, 1);\n }\n\n const { yfield, groupBy } = options;\n\n // 处理数据source,source为采样前的原始数据\n if (upstreamData.length) {\n // 如果有groupBy,数据分组\n const groups = {};\n if (groupBy) {\n for (let i = 0, n = upstreamData.length; i < n; i++) {\n const datum = upstreamData[i];\n const groupId = datum[groupBy];\n if (groups[groupId]) {\n groups[groupId].push({ y: datum[yfield], i });\n } else {\n groups[groupId] = [];\n groups[groupId].push({ y: datum[yfield], i });\n }\n }\n\n // 分组采样\n let rawIndice: any[] = [];\n\n Object.keys(groups).forEach(groupName => {\n const group = groups[groupName];\n if (group.length <= size) {\n const indices = group.map((datum: any) => {\n return datum.i;\n });\n rawIndice = rawIndice.concat(indices);\n } else {\n const indices = lttb(size, group, true);\n rawIndice = rawIndice.concat(indices);\n }\n });\n\n // 采样后,整合分组数据,按照原始顺序排序\n rawIndice.sort((a, b) => a - b);\n\n return rawIndice.map((index: number) => upstreamData[index]);\n }\n // 非分组数据同理\n return lttb(size, upstreamData, false, yfield).map(index => upstreamData[index]);\n }\n\n return [];\n};\n"]}
@@ -1,2 +0,0 @@
1
- import type { IElement, LttbSampleTransformOptions } from '../../types';
2
- export declare const transform: (options: LttbSampleTransformOptions, upstreamData: IElement[]) => IElement[];
@@ -1,60 +0,0 @@
1
- function lttb(size, array, isGroup, yfield) {
2
- const frameSize = Math.floor(array.length / size), newIndices = [], len = array.length;
3
- let maxArea, area, nextIndex, currentIndex = 0, sampledIndex = 0;
4
- newIndices[sampledIndex++] = currentIndex;
5
- for (let i = 1; i < len - 1; i += frameSize) {
6
- const nextFrameStart = Math.min(i + frameSize, len - 1), nextFrameEnd = Math.min(i + 2 * frameSize, len), avgX = (nextFrameEnd + nextFrameStart) / 2;
7
- let avgY = 0;
8
- for (let idx = nextFrameStart; idx < nextFrameEnd; idx++) {
9
- const y = isGroup ? array[idx].y : array[idx][yfield];
10
- Number.isNaN(y) || (avgY += y);
11
- }
12
- avgY /= nextFrameEnd - nextFrameStart;
13
- const frameStart = i, frameEnd = Math.min(i + frameSize, len), pointAX = i - 1, pointAY = isGroup ? array[currentIndex].y : array[currentIndex][yfield];
14
- maxArea = -1, nextIndex = frameStart;
15
- for (let idx = frameStart; idx < frameEnd; idx++) {
16
- const y = isGroup ? array[idx].y : array[idx][yfield];
17
- Number.isNaN(y) || (area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY)),
18
- area > maxArea && (maxArea = area, nextIndex = idx));
19
- }
20
- newIndices[sampledIndex++] = nextIndex, currentIndex = nextIndex;
21
- }
22
- newIndices[sampledIndex - 1] !== len - 1 && (newIndices[sampledIndex++] = len - 1);
23
- return newIndices.map((i => isGroup ? array[i].i : i));
24
- }
25
-
26
- export const transform = (options, upstreamData) => {
27
- let size = options.size;
28
- const factor = options.factor || 1;
29
- if (Array.isArray(size) && (size = Math.floor(size[1] - size[0])), size *= factor,
30
- size <= 0) return [];
31
- if (upstreamData.length <= size) return upstreamData;
32
- if (options.skipfirst) return upstreamData.slice(0, 1);
33
- const {yfield: yfield, groupBy: groupBy} = options;
34
- if (upstreamData.length) {
35
- const groups = {};
36
- if (groupBy) {
37
- for (let i = 0, n = upstreamData.length; i < n; i++) {
38
- const datum = upstreamData[i], groupId = datum[groupBy];
39
- groups[groupId] || (groups[groupId] = []), groups[groupId].push({
40
- y: datum[yfield],
41
- i: i
42
- });
43
- }
44
- let rawIndice = [];
45
- return Object.keys(groups).forEach((groupName => {
46
- const group = groups[groupName];
47
- if (group.length <= size) {
48
- const indices = group.map((datum => datum.i));
49
- rawIndice = rawIndice.concat(indices);
50
- } else {
51
- const indices = lttb(size, group, !0);
52
- rawIndice = rawIndice.concat(indices);
53
- }
54
- })), rawIndice.sort(((a, b) => a - b)), rawIndice.map((index => upstreamData[index]));
55
- }
56
- return lttb(size, upstreamData, !1, yfield).map((index => upstreamData[index]));
57
- }
58
- return [];
59
- };
60
- //# sourceMappingURL=lttb-sample.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/transforms/mark/lttb-sample.ts"],"names":[],"mappings":"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","file":"lttb-sample.js","sourcesContent":["import type { IElement, LttbSampleTransformOptions } from '../../types';\n\nfunction lttb(size: number, array: any[], isGroup: boolean, yfield?: string) {\n const frameSize = Math.floor(array.length / size);\n const newIndices = [];\n const len = array.length;\n\n let currentIndex = 0;\n let sampledIndex = 0;\n let maxArea;\n let area;\n let nextIndex;\n\n // First frame use the first data.\n newIndices[sampledIndex++] = currentIndex;\n\n for (let i = 1; i < len - 1; i += frameSize) {\n const nextFrameStart = Math.min(i + frameSize, len - 1);\n const nextFrameEnd = Math.min(i + frameSize * 2, len);\n\n const avgX = (nextFrameEnd + nextFrameStart) / 2;\n let avgY = 0;\n\n for (let idx = nextFrameStart; idx < nextFrameEnd; idx++) {\n const y = isGroup ? array[idx].y : array[idx][yfield];\n if (Number.isNaN(y)) {\n continue;\n }\n avgY += y;\n }\n avgY /= nextFrameEnd - nextFrameStart;\n\n const frameStart = i;\n const frameEnd = Math.min(i + frameSize, len);\n\n const pointAX = i - 1;\n const pointAY = isGroup ? array[currentIndex].y : array[currentIndex][yfield];\n\n maxArea = -1;\n\n nextIndex = frameStart;\n // Find a point from current frame that construct a triangel with largest area with previous selected point\n // And the average of next frame.\n for (let idx = frameStart; idx < frameEnd; idx++) {\n const y = isGroup ? array[idx].y : array[idx][yfield];\n if (Number.isNaN(y)) {\n continue;\n }\n // Calculate triangle area over three buckets\n area = Math.abs((pointAX - avgX) * (y - pointAY) - (pointAX - idx) * (avgY - pointAY));\n if (area > maxArea) {\n maxArea = area;\n nextIndex = idx; // Next a is this b\n }\n }\n\n newIndices[sampledIndex++] = nextIndex;\n\n currentIndex = nextIndex; // This a is the next a (chosen b)\n }\n\n // First frame use the last data.\n if (newIndices[sampledIndex - 1] !== len - 1) {\n newIndices[sampledIndex++] = len - 1;\n }\n\n // output newly added tuples\n const newRawIndices = newIndices.map(i => (isGroup ? array[i].i : i));\n return newRawIndices;\n}\n\n/**\n * Samples tuples passing through this operator.\n * Uses lttb sampling to maintain a trend-maintained sample.\n * @constructor\n * @param {object} options - The parameters for this operator.\n * @param {number} [options.size=1000] - The maximum number of samples.\n * @param {string} [options.xfield] - The xfield string of data.\n * @param {string} [options.yfield] - The yfield string of data.\n * @param {string} [options.groupBy] - The groupBy string of data.\n */\n\nexport const transform = (options: LttbSampleTransformOptions, upstreamData: IElement[]) => {\n let size = options.size;\n const factor = options.factor || 1;\n\n if (Array.isArray(size)) {\n size = Math.floor(size[1] - size[0]);\n }\n\n size *= factor;\n\n // size<=0的特殊情况不采样,返回空\n if (size <= 0) {\n return [];\n }\n\n // 数据<size的情况,不进行采样,保留所有数据\n if (upstreamData.length <= size) {\n return upstreamData;\n }\n\n const skipfirst = options.skipfirst;\n // 如果是ChartSpace的第一次数据流(evaluateAsync),不需要采样,返回一条数据供布局使用\n // 这里需要依据this.value.length判断是不是第一次数据流,\n // 以避免点击图例,updateChartData等操作清空所有label\n if (skipfirst) {\n return upstreamData.slice(0, 1);\n }\n\n const { yfield, groupBy } = options;\n\n // 处理数据source,source为采样前的原始数据\n if (upstreamData.length) {\n // 如果有groupBy,数据分组\n const groups = {};\n if (groupBy) {\n for (let i = 0, n = upstreamData.length; i < n; i++) {\n const datum = upstreamData[i];\n const groupId = datum[groupBy];\n if (groups[groupId]) {\n groups[groupId].push({ y: datum[yfield], i });\n } else {\n groups[groupId] = [];\n groups[groupId].push({ y: datum[yfield], i });\n }\n }\n\n // 分组采样\n let rawIndice: any[] = [];\n\n Object.keys(groups).forEach(groupName => {\n const group = groups[groupName];\n if (group.length <= size) {\n const indices = group.map((datum: any) => {\n return datum.i;\n });\n rawIndice = rawIndice.concat(indices);\n } else {\n const indices = lttb(size, group, true);\n rawIndice = rawIndice.concat(indices);\n }\n });\n\n // 采样后,整合分组数据,按照原始顺序排序\n rawIndice.sort((a, b) => a - b);\n\n return rawIndice.map((index: number) => upstreamData[index]);\n }\n // 非分组数据同理\n return lttb(size, upstreamData, false, yfield).map(index => upstreamData[index]);\n }\n\n return [];\n};\n"]}