|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | Licensed to the Apache Software Foundation (ASF) under one | 
|  | or more contributor license agreements.  See the NOTICE file | 
|  | distributed with this work for additional information | 
|  | regarding copyright ownership.  The ASF licenses this file | 
|  | to you under the Apache License, Version 2.0 (the | 
|  | "License"); you may not use this file except in compliance | 
|  | with the License.  You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, | 
|  | software distributed under the License is distributed on an | 
|  | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | KIND, either express or implied.  See the License for the | 
|  | specific language governing permissions and limitations | 
|  | under the License. | 
|  | --> | 
|  |  | 
|  |  | 
|  | <html> | 
|  | <head> | 
|  | <meta charset="utf-8"> | 
|  | <meta name="viewport" content="width=device-width, initial-scale=1" /> | 
|  | <script src="lib/simpleRequire.js"></script> | 
|  | <script src="lib/config.js"></script> | 
|  | <script src="lib/jquery.min.js"></script> | 
|  | <script src="lib/facePrint.js"></script> | 
|  | <script src="lib/testHelper.js"></script> | 
|  | <!-- <script src="ut/lib/canteen.js"></script> --> | 
|  | <link rel="stylesheet" href="lib/reset.css" /> | 
|  | </head> | 
|  | <body> | 
|  | <style> | 
|  | </style> | 
|  |  | 
|  |  | 
|  |  | 
|  | <div id="main_simplest_pies"></div> | 
|  | <div id="main_pies_encode_price"></div> | 
|  | <div id="main_cartesian_parse_trim_time_reg"></div> | 
|  | <div id="main_cartesian_sort"></div> | 
|  | <div id="main_update_condition"></div> | 
|  | <div id="main_update_source_no_dim_inside_data"></div> | 
|  | <div id="main_no_dimension_defined"></div> | 
|  | <div id="main_fromTransformResult"></div> | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | var FOOD_SALES_PRICE_HEADER = | 
|  | ['Product', 'Sales', 'Price', 'Year']; | 
|  | var FOOD_SALES_PRICE_NO_HEADER = [ | 
|  | ['Cake', 123, 32.12, 2011], | 
|  | ['Cereal', 231, 14.41, 2011], | 
|  | ['Tofu', 235, 5.14, 2011], | 
|  | ['Dumpling', 341, 25.53, 2011], | 
|  | ['Biscuit', 122, 29.36, 2011], | 
|  | ['Cake', 143, 30.21, 2012], | 
|  | ['Cereal', 201, 19.85, 2012], | 
|  | ['Tofu', 255, 7.61, 2012], | 
|  | ['Dumpling', 241, 27.89, 2012], | 
|  | ['Biscuit', 102, 34.53, 2012], | 
|  | ['Cake', 153, 28.82, 2013], | 
|  | ['Cereal', 181, 21.16, 2013], | 
|  | ['Tofu', 295, 4.24, 2013], | 
|  | ['Dumpling', 281, 31.66, 2013], | 
|  | ['Biscuit', 92, 39.82, 2013], | 
|  | ['Cake', 223, 29.22, 2014], | 
|  | ['Cereal', 211, 17.88, 2014], | 
|  | ['Tofu', 345, 3.09, 2014], | 
|  | ['Dumpling', 211, 35.05, 2014], | 
|  | ['Biscuit', 72, 24.19, 2014] | 
|  | ]; | 
|  | var FOOD_SALES_PRICE_WITH_HEADER = | 
|  | [FOOD_SALES_PRICE_HEADER] | 
|  | .concat(FOOD_SALES_PRICE_NO_HEADER); | 
|  |  | 
|  | var NAME_SCORE_DIM = { | 
|  | Name: 0, | 
|  | Age: 1, | 
|  | Profession: 2, | 
|  | Score: 3, | 
|  | Date: 4, | 
|  | DirtyNumber: 5, | 
|  | Numeric: 6, | 
|  | HasEmpty: 7, | 
|  | Percent: 8 | 
|  | }; | 
|  | var NAME_SCORE_DIRTY_DATA_HEADER = | 
|  | ['Name', 'Age', 'Profession', 'Score', 'Date', 'DirtyNumber', 'Numeric', 'HasEmpty', 'Percent']; | 
|  | var NAME_SCORE_DIRTY_DATA_NO_HEADER = [ | 
|  | // This is for trim testing. | 
|  | [' Jobs Mat ', 41, 'Designer', 314, '2011-02-12', '13', ' 91000 ', 45, ' 12% ' ], | 
|  | // This is for edge testing (03-01, 20) | 
|  | ['Hottlyuipe Xu ', 20, 'Engineer', 351, '2011-03-01', 44, ' 83000 ', 13, '44%' ], | 
|  | [' Jone Mat ', 52, 'Designer', 287, '2011-02-14', null, ' 43000 ', null, '15%' ], | 
|  | ['Uty Xu', 19, 'Designer', 219, '2011-02-18', undefined, ' 63000 ', 81, '94%' ], | 
|  | ['Tatum von Godden', 25, null, 301, '2011-04-02', '-', ' 13000 ', undefined, '61%' ], | 
|  | ['Must Godden', 31, 'Engineer', 235, '2011-03-19', ' 454', '-', 32, '' ], | 
|  | ['Caoas Xu', 71, 'Designer', 318, '2011-02-24', NaN, ' 73000 ', '-', '76%' ], | 
|  | ['Malise Mat', 67, 'Engineer', 366, '2011-03-12', '232a', ' 23000 ', 19, '26%' ] | 
|  | ]; | 
|  | var NAME_SCORE_DIRTY_DATA_WITH_HEADER = | 
|  | [NAME_SCORE_DIRTY_DATA_HEADER] | 
|  | .concat(NAME_SCORE_DIRTY_DATA_NO_HEADER); | 
|  |  | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <!-- ------------------------------- --> | 
|  | <!-- ------------------------------- --> | 
|  | <!-- ------------------------------- --> | 
|  | <!-- ------------------------------- --> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var option = { | 
|  | dataset: [{ | 
|  | source: FOOD_SALES_PRICE_WITH_HEADER | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Year', value: 2011 } | 
|  | } | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Year', value: 2012 } | 
|  | } | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Year', value: 2013 } | 
|  | } | 
|  | }], | 
|  | tooltip: {}, | 
|  | series: [{ | 
|  | type: 'pie', | 
|  | datasetIndex: 1, | 
|  | radius: 50, | 
|  | center: ['25%', '50%'] | 
|  | }, { | 
|  | type: 'pie', | 
|  | datasetIndex: 2, | 
|  | radius: 50, | 
|  | center: ['50%', '50%'] | 
|  | }, { | 
|  | type: 'pie', | 
|  | datasetIndex: 3, | 
|  | radius: 50, | 
|  | center: ['75%', '50%'] | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_simplest_pies', { | 
|  | title: [ | 
|  | '**3 pies** should shoud **Sales data** (interger about hundreds)', | 
|  | 'Pie by "Year", Sector by "Product"' | 
|  | ], | 
|  | height: 300, | 
|  | option: option | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var option = { | 
|  | dataset: [{ | 
|  | source: FOOD_SALES_PRICE_WITH_HEADER | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Product', value: 'Tofu' } | 
|  | } | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Product', value: 'Biscuit' } | 
|  | } | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Product', value: 'Dumpling' } | 
|  | } | 
|  | }], | 
|  | series: [{ | 
|  | type: 'pie', | 
|  | datasetIndex: 1, | 
|  | center: ['25%', '50%'], | 
|  | radius: 50, | 
|  | encode: { itemName: 'Year', value: 'Price' }, | 
|  | }, { | 
|  | type: 'pie', | 
|  | datasetIndex: 2, | 
|  | center: ['50%', '50%'], | 
|  | radius: 50, | 
|  | encode: { itemName: 'Year', value: 'Price' } | 
|  | }, { | 
|  | type: 'pie', | 
|  | datasetIndex: 3, | 
|  | center: ['75%', '50%'], | 
|  | radius: 50, | 
|  | encode: { itemName: 'Year', value: 'Price' } | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_pies_encode_price', { | 
|  | title: [ | 
|  | '**3 pies** should shoud **Prices data** (float like xx.xx)', | 
|  | 'Pie by "Product", Sector by "Year"' | 
|  | ], | 
|  | height: 300, | 
|  | option: option | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var option = { | 
|  | dataset: [{ source: NAME_SCORE_DIRTY_DATA_WITH_HEADER }], | 
|  | tooltip: {}, | 
|  | grid: [], | 
|  | xAxis: [], | 
|  | yAxis: [], | 
|  | series: [] | 
|  | }; | 
|  |  | 
|  | var leftStart = 50; | 
|  | var leftBase = leftStart; | 
|  | var topBase = 30; | 
|  | var gridWidth = 100; | 
|  | var gridHeight = 100; | 
|  | var gapWidth = 70; | 
|  | var gapHeight = 80; | 
|  | var chartWidth = 800; | 
|  |  | 
|  | function addCartesian(opt) { | 
|  | option.grid.push({ | 
|  | left: leftBase, | 
|  | top: topBase, | 
|  | width: gridWidth, | 
|  | height: gridHeight | 
|  | }); | 
|  |  | 
|  | leftBase += gridWidth + gapWidth; | 
|  | if (leftBase + gridWidth > chartWidth) { | 
|  | leftBase = leftStart; | 
|  | topBase += gridHeight + gapHeight; | 
|  | } | 
|  |  | 
|  | option.xAxis.push({ | 
|  | name: opt.xAxis.name, | 
|  | type: 'category', | 
|  | nameLocation: 'middle', | 
|  | nameGap: 30, | 
|  | gridIndex: option.grid.length - 1 | 
|  | }); | 
|  | option.yAxis.push({ | 
|  | gridIndex: option.grid.length - 1 | 
|  | }); | 
|  |  | 
|  | var series = opt.series; | 
|  |  | 
|  | series.type = 'scatter'; | 
|  | series.xAxisIndex = option.xAxis.length - 1; | 
|  | series.yAxisIndex = option.yAxis.length - 1; | 
|  | series.label = { show: true, position: 'bottom' }; | 
|  | series.encode = { | 
|  | x: NAME_SCORE_DIM.Date, | 
|  | y: NAME_SCORE_DIM.Score, | 
|  | label: series.encode && series.encode.label || [NAME_SCORE_DIM.Name], | 
|  | tooltip: [ | 
|  | NAME_SCORE_DIM.Name, | 
|  | NAME_SCORE_DIM.Date, | 
|  | NAME_SCORE_DIM.Score, | 
|  | NAME_SCORE_DIM.Profession, | 
|  | NAME_SCORE_DIM.Age, | 
|  | NAME_SCORE_DIM.DirtyNumber | 
|  | ] | 
|  | }; | 
|  | option.series.push(series); | 
|  | } | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'a', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Name, eq: 'Jobs Mat', parser: 'trim' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'a' | 
|  | }, | 
|  | xAxis: { name: 'Only show "Jobs Mat"' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'b', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Date, lt: '2011-03', gte: '2011-02', parser: 'time' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'b' | 
|  | }, | 
|  | xAxis: { name: 'Show four points\nDate in 2011-02' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'c', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Date, lte: '2011-03', gte: '2011-02-29', parser: 'time' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'c' | 
|  | }, | 
|  | xAxis: { name: 'Show "Hottlyuipe Xu"' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'd', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Name, reg: /\sXu$/, parser: 'trim' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'd' | 
|  | }, | 
|  | xAxis: { name: 'Show three points\nname reg /sXu$/' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'e', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Profession, ne: 'Designer', parser: 'trim' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'e', | 
|  | encode: { label: [NAME_SCORE_DIM.Profession] } | 
|  | }, | 
|  | xAxis: { name: 'Show four points\n!Designer' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'f', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { | 
|  | and: [ | 
|  | { dimension: NAME_SCORE_DIM.Profession, eq: 'Designer', parser: 'trim' }, | 
|  | { dimension: NAME_SCORE_DIM.Score, '>': 300 } | 
|  | ] | 
|  | } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'f', | 
|  | encode: { label: [NAME_SCORE_DIM.Profession] } | 
|  | }, | 
|  | xAxis: { name: 'Show two points\nDesigner > 300' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'g', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { | 
|  | and: [ | 
|  | { dimension: NAME_SCORE_DIM.Profession, eq: 'Engineer' }, | 
|  | { | 
|  | or: [ | 
|  | { dimension: NAME_SCORE_DIM.Age, '>=': 20, '<=': 30 }, | 
|  | { dimension: NAME_SCORE_DIM.Age, '>=': 60 } | 
|  | ] | 
|  | } | 
|  | ] | 
|  | } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'g', | 
|  | encode: { label: [NAME_SCORE_DIM.Profession] } | 
|  | }, | 
|  | xAxis: { name: 'Show three points\nEngineer && (20-30 || 60)' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'h', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { | 
|  | not: { | 
|  | and: [ | 
|  | { dimension: NAME_SCORE_DIM.Profession, eq: 'Engineer' }, | 
|  | { | 
|  | or: [ | 
|  | { dimension: NAME_SCORE_DIM.Age, '>=': 20, '<=': 30 }, | 
|  | { dimension: NAME_SCORE_DIM.Age, '>=': 60 } | 
|  | ] | 
|  | } | 
|  | ] | 
|  | } | 
|  | } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'h', | 
|  | encode: { label: [NAME_SCORE_DIM.Profession] } | 
|  | }, | 
|  | xAxis: { name: 'Show six points\n!(Engineer && (20-30 || 60))' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'i', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: true | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'i', | 
|  | encode: { label: [NAME_SCORE_DIM.Profession] } | 
|  | }, | 
|  | xAxis: { name: 'Show all eight points\nconfig: true' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'j', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | // print: true, | 
|  | config: { | 
|  | or: [{ | 
|  | dimension: NAME_SCORE_DIM.DirtyNumber, | 
|  | eq: 454 | 
|  | }, { | 
|  | dimension: NAME_SCORE_DIM.DirtyNumber, | 
|  | eq: 232 | 
|  | }] | 
|  | } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'j', | 
|  | encode: { label: [NAME_SCORE_DIM.DirtyNumber] } | 
|  | }, | 
|  | xAxis: { name: 'Show only "Must Godden"' } | 
|  | }); | 
|  |  | 
|  |  | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_cartesian_parse_trim_time_reg', { | 
|  | title: [ | 
|  | 'Check each cartesians.', | 
|  | 'The expectationa are below each cartesian.' | 
|  | ], | 
|  | width: chartWidth, | 
|  | height: 600, | 
|  | option: option | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var option = { | 
|  | dataset: [{ source: NAME_SCORE_DIRTY_DATA_WITH_HEADER }], | 
|  | tooltip: {}, | 
|  | grid: [], | 
|  | xAxis: [], | 
|  | yAxis: [], | 
|  | series: [] | 
|  | }; | 
|  |  | 
|  | var leftStart = 50; | 
|  | var leftBase = leftStart; | 
|  | var topBase = 30; | 
|  | var gridWidth = 200; | 
|  | var gridHeight = 100; | 
|  | var gapWidth = 70; | 
|  | var gapHeight = 80; | 
|  | var chartWidth = 800; | 
|  |  | 
|  | function addCartesian(opt) { | 
|  | option.grid.push({ | 
|  | left: leftBase, | 
|  | top: topBase, | 
|  | width: gridWidth, | 
|  | height: gridHeight | 
|  | }); | 
|  |  | 
|  | leftBase += gridWidth + gapWidth; | 
|  | if (leftBase + gridWidth > chartWidth) { | 
|  | leftBase = leftStart; | 
|  | topBase += gridHeight + gapHeight; | 
|  | } | 
|  |  | 
|  | option.xAxis.push({ | 
|  | name: opt.xAxis.name, | 
|  | type: 'category', | 
|  | nameLocation: 'middle', | 
|  | nameGap: 30, | 
|  | gridIndex: option.grid.length - 1 | 
|  | }); | 
|  | option.yAxis.push({ | 
|  | gridIndex: option.grid.length - 1 | 
|  | }); | 
|  |  | 
|  | var series = opt.series; | 
|  |  | 
|  | series.type = 'bar'; | 
|  | series.xAxisIndex = option.xAxis.length - 1; | 
|  | series.yAxisIndex = option.yAxis.length - 1; | 
|  | series.label = { | 
|  | show: true, | 
|  | position: 'insideBottom', | 
|  | rotate: 90, | 
|  | align: 'left', | 
|  | verticalAlign: 'middle' | 
|  | }; | 
|  | series.encode = { | 
|  | x: NAME_SCORE_DIM.Date, | 
|  | y: NAME_SCORE_DIM.Score, | 
|  | label: series.encode && series.encode.label || [NAME_SCORE_DIM.Name], | 
|  | tooltip: [ | 
|  | NAME_SCORE_DIM.Name, | 
|  | NAME_SCORE_DIM.Date, | 
|  | NAME_SCORE_DIM.Score, | 
|  | NAME_SCORE_DIM.Profession, | 
|  | NAME_SCORE_DIM.Age, | 
|  | NAME_SCORE_DIM.DirtyNumber, | 
|  | NAME_SCORE_DIM.Numeric, | 
|  | NAME_SCORE_DIM.HasEmpty, | 
|  | NAME_SCORE_DIM.Percent, | 
|  | ] | 
|  | }; | 
|  | option.series.push(series); | 
|  | } | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'a', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Score, order: 'asc' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.Score }, | 
|  | datasetId: 'a' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\norder by Score asc' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'b', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | // print: true, | 
|  | config: { dimension: NAME_SCORE_DIM.Age, order: 'desc' } | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'b', | 
|  | encode: { label: NAME_SCORE_DIM.Age } | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\norder by Age desc' } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'c', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | // print: true, | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.Profession, order: 'asc' }, | 
|  | { dimension: NAME_SCORE_DIM.Score, order: 'desc' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | datasetId: 'c', | 
|  | encode: { label: [NAME_SCORE_DIM.Profession, NAME_SCORE_DIM.Score] } | 
|  | }, | 
|  | xAxis: { | 
|  | name: [ | 
|  | 'Show eight bars (empty Profession last)', | 
|  | 'Profession asc (all Engineer left)', | 
|  | 'Score desc in each Profession' | 
|  | ].join('\n') | 
|  | } | 
|  | }); | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'd', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | // print: true, | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.Date, order: 'asc', parser: 'time' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.Date }, | 
|  | datasetId: 'd' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\nDate asc' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'e', | 
|  | transform: [{ | 
|  | type: 'filter', | 
|  | config: { dimension: NAME_SCORE_DIM.Age, lte: 40, gte: 20 } | 
|  | }, { | 
|  | type: 'sort', | 
|  | config: { dimension: NAME_SCORE_DIM.Score, order: 'asc' } | 
|  | }] | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: [NAME_SCORE_DIM.Age, NAME_SCORE_DIM.Score] }, | 
|  | datasetId: 'e' | 
|  | }, | 
|  | xAxis: { name: 'Show three bars\nFilter by Age 20-40\nOrder by Score asc' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'f', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.DirtyNumber, order: 'desc', parser: 'number' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.DirtyNumber }, | 
|  | datasetId: 'f' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\nOrder by DirtyNumber desc' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'g', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.Numeric, order: 'asc' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.Numeric }, | 
|  | datasetId: 'g' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\nOrder by Numeric asc\nOnly one empty at right' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'h', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.HasEmpty, order: 'desc' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.HasEmpty }, | 
|  | datasetId: 'h' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\nOrder by HasEmpty desc\nempty at right' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'i', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.HasEmpty, order: 'desc', incomparable: 'max' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.HasEmpty }, | 
|  | datasetId: 'i' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\nOrder by HasEmpty desc\nempty at left' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | option.dataset.push({ | 
|  | id: 'j', | 
|  | transform: { | 
|  | type: 'sort', | 
|  | config: [ | 
|  | { dimension: NAME_SCORE_DIM.Percent, order: 'desc', parse: 'number' } | 
|  | ] | 
|  | } | 
|  | }); | 
|  | addCartesian({ | 
|  | series: { | 
|  | encode: { label: NAME_SCORE_DIM.Percent }, | 
|  | datasetId: 'j' | 
|  | }, | 
|  | xAxis: { name: 'Show all eight bars\nOrder by Percent desc\nempty at right' } | 
|  | }); | 
|  |  | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_cartesian_sort', { | 
|  | title: [ | 
|  | 'Test sort transform. Check each cartesians.', | 
|  | 'The expectationa are below each cartesian.', | 
|  | 'Ordered dimension is on **bar label **' | 
|  | ], | 
|  | width: chartWidth, | 
|  | height: 800, | 
|  | option: option | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var currentYear = 2011 | 
|  | var option = { | 
|  | title: { | 
|  | text: currentYear, | 
|  | left: 'center' | 
|  | }, | 
|  | dataset: [{ | 
|  | source: FOOD_SALES_PRICE_WITH_HEADER | 
|  | }, { | 
|  | id: 'one_year', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Year', value: currentYear } | 
|  | } | 
|  | }], | 
|  | tooltip: {}, | 
|  | xAxis: { type: 'category' }, | 
|  | yAxis: {}, | 
|  | series: [{ | 
|  | name: 'one year', | 
|  | type: 'bar', | 
|  | datasetIndex: 1, | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_update_condition', { | 
|  | title: [ | 
|  | 'click "next year", check the bar change.' | 
|  | ], | 
|  | height: 300, | 
|  | option: option, | 
|  | buttons: [{ | 
|  | text: 'next year', | 
|  | onclick: function () { | 
|  | currentYear++; | 
|  | if (currentYear >= 2014) { | 
|  | currentYear = 2011 | 
|  | } | 
|  | chart.setOption({ | 
|  | title: { | 
|  | text: currentYear | 
|  | }, | 
|  | dataset: { | 
|  | id: 'one_year', | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 'Year', value: currentYear } | 
|  | } | 
|  | } | 
|  | }); | 
|  | } | 
|  | }] | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var currData = FOOD_SALES_PRICE_NO_HEADER; | 
|  |  | 
|  | var option = { | 
|  | dataset: [{ | 
|  | id: 'all_data', | 
|  | dimensions: FOOD_SALES_PRICE_HEADER, | 
|  | source: currData | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | print: true, | 
|  | config: { dimension: 'Price', '<': 40 } | 
|  | } | 
|  | }], | 
|  | tooltip: {}, | 
|  | legend: {}, | 
|  | xAxis: { type: 'category' }, | 
|  | yAxis: { scale: true }, | 
|  | series: [{ | 
|  | name: 'all data', | 
|  | type: 'scatter', | 
|  | symbolSize: 15, | 
|  | encode: { | 
|  | itemId: 'Product', | 
|  | y: 'Price', | 
|  | label: [0, 1, 2, 3] | 
|  | }, | 
|  | itemStyle: { | 
|  | color: '#999' | 
|  | } | 
|  | }, { | 
|  | name: 'Price < 40', | 
|  | type: 'scatter', | 
|  | encode: { | 
|  | itemId: 'Product', | 
|  | x: 0, | 
|  | y: 'Price', | 
|  | label: [0, 1, 2, 3] | 
|  | }, | 
|  | datasetIndex: 1 | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_update_source_no_dim_inside_data', { | 
|  | title: [ | 
|  | 'Init: all items that Price < 40', | 
|  | 'click "add price 10", check the bar change.' | 
|  | ], | 
|  | height: 300, | 
|  | option: option, | 
|  | buttons: [{ | 
|  | text: 'add price 10', | 
|  | onclick: function () { | 
|  | currData = echarts.util.clone(currData); | 
|  | echarts.util.each(currData, function (line) { | 
|  | line[2] += 10; | 
|  | }); | 
|  |  | 
|  | chart.setOption({ | 
|  | dataset: { | 
|  | id: 'all_data', | 
|  | source: currData | 
|  | } | 
|  | }); | 
|  | } | 
|  | }] | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var option = { | 
|  | dataset: [{ | 
|  | source: FOOD_SALES_PRICE_NO_HEADER | 
|  | }, { | 
|  | transform: { | 
|  | type: 'filter', | 
|  | config: { dimension: 3, value: 2011 } | 
|  | } | 
|  | }, { | 
|  | transform: [{ | 
|  | type: 'filter', | 
|  | config: { dimension: 3, value: 2012 } | 
|  | }, { | 
|  | type: 'sort', | 
|  | config: { dimension: 2, order: 'asc' } | 
|  | }] | 
|  | }], | 
|  | tooltip: {}, | 
|  | series: [{ | 
|  | type: 'pie', | 
|  | datasetIndex: 1, | 
|  | radius: 50, | 
|  | center: ['35%', '50%'] | 
|  | }, { | 
|  | type: 'pie', | 
|  | datasetIndex: 2, | 
|  | radius: 50, | 
|  | center: ['65%', '50%'] | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_no_dimension_defined', { | 
|  | title: [ | 
|  | '**2 pies** should shoud **Sales data** (interger about hundreds)', | 
|  | ], | 
|  | height: 300, | 
|  | option: option | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts', 'data/Michelson-Morley.json.js'], function (echarts, rawData) { | 
|  | var option = { | 
|  | dataset: [{ | 
|  | source: rawData | 
|  | }, { | 
|  | transform: { | 
|  | type: 'boxplot', | 
|  | config: { itemNameFormatter: 'expr {value}' } | 
|  | } | 
|  | }, { | 
|  | fromDatasetIndex: 1, | 
|  | fromTransformResult: 1 | 
|  | }, { | 
|  | fromDatasetIndex: 1, | 
|  | fromTransformResult: 1, | 
|  | transform: { | 
|  | type: 'sort', | 
|  | config: { dimension: 0, order: 'desc' } | 
|  | } | 
|  | }], | 
|  | tooltip: {}, | 
|  | xAxis: { | 
|  | type: 'category' | 
|  | }, | 
|  | yAxis: { | 
|  | }, | 
|  | series: [{ | 
|  | type: 'boxplot', | 
|  | datasetIndex: 1 | 
|  | }, { | 
|  | type: 'scatter', | 
|  | symbolSize: 30, | 
|  | datasetIndex: 2 | 
|  | }, { | 
|  | type: 'line', | 
|  | z: 100, | 
|  | datasetIndex: 3 | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'main_fromTransformResult', { | 
|  | title: [ | 
|  | '**boxplot** and **outlier scatter (green)** and **line** (yellow) should be displayed.', | 
|  | ], | 
|  | height: 400, | 
|  | option: option | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | </body> | 
|  | </html> | 
|  |  |