<!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/esl.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'], 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>

