• English
  • measures

    add-measure

    Add a measure

    Loading...
    import { VBI, VBIChartBuilder } from '@visactor/vbi'
    import { DEMO_CONNECTOR_ID, VSeedRender } from '@components'
    import { useEffect, useState } from 'react'
    
    export default () => {
      const [result, setResult] = useState<any>(null)
    
      useEffect(() => {
        const run = async () => {
          const builder = VBI.chart.create({
            ...{
              "connectorId": "demoSupermarket",
              "chartType": "table",
              "dimensions": [],
              "measures": [],
              "whereFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "havingFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "theme": "light",
              "locale": "en-US",
              "version": 1,
              "limit": 20
            },
            connectorId: DEMO_CONNECTOR_ID,
          })
          const applyBuilder = (builder: VBIChartBuilder) => {
      builder.measures.add('sales', node => {
        node.setAlias('Original Sales')
      })
      const measureId = builder.measures.find(node => node.getField() === 'sales')?.getId()
      if (measureId) {
        builder.measures.update(measureId, node => {
          node.setAlias('Sales').setAggregate({ func: 'sum' })
        })
      }
    }
          applyBuilder(builder)
          setResult(await builder.buildVSeed())
        }
        run()
      }, [])
    
      if (!result) return <div>Loading...</div>
    
      return <VSeedRender vseed={result} />
    }

    add-measure-encoding

    Add a measure and set encoding

    Loading...
    import { VBI, VBIChartBuilder } from '@visactor/vbi'
    import { DEMO_CONNECTOR_ID, VSeedRender } from '@components'
    import { useEffect, useState } from 'react'
    
    export default () => {
      const [result, setResult] = useState<any>(null)
    
      useEffect(() => {
        const run = async () => {
          const builder = VBI.chart.create({
            ...{
              "connectorId": "demoSupermarket",
              "chartType": "table",
              "dimensions": [],
              "measures": [],
              "whereFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "havingFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "theme": "light",
              "locale": "en-US",
              "version": 1,
              "limit": 20
            },
            connectorId: DEMO_CONNECTOR_ID,
          })
          const applyBuilder = (builder: VBIChartBuilder) => {
      builder.measures.add('sales', n => n.setAlias('Sales'))
      const measureId = builder.measures.find(node => node.getField() === 'sales')?.getId()
      if (measureId) {
        builder.measures.update(measureId, n => n.setEncoding('yAxis').setAggregate({ func: 'sum' }))
      }
    }
          applyBuilder(builder)
          setResult(await builder.buildVSeed())
        }
        run()
      }, [])
    
      if (!result) return <div>Loading...</div>
    
      return <VSeedRender vseed={result} />
    }

    measure-with-custom-and-auto-format

    Measure formatting: sales uses a custom ten-thousand-unit format (¥ prefix, two decimals), profit margin uses automatic formatting, and discount uses percentage formatting

    Loading...
    import { VBI, VBIChartBuilder } from '@visactor/vbi'
    import { DEMO_CONNECTOR_ID, VSeedRender } from '@components'
    import { useEffect, useState } from 'react'
    
    export default () => {
      const [result, setResult] = useState<any>(null)
    
      useEffect(() => {
        const run = async () => {
          const builder = VBI.chart.create({
            ...{
              "connectorId": "demoSupermarket",
              "chartType": "table",
              "dimensions": [
                {
                  "field": "product_type",
                  "alias": "Category"
                }
              ],
              "measures": [],
              "whereFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "havingFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "theme": "light",
              "locale": "en-US",
              "version": 1,
              "limit": 20
            },
            connectorId: DEMO_CONNECTOR_ID,
          })
          const applyBuilder = (builder: VBIChartBuilder) => {
      builder.measures
        .add('sales', node => {
          node.setAlias('Sales (10K)')
            .setAggregate({ func: 'sum' })
            .setEncoding('column')
            .setFormat({
              type: 'number',
              ratio: 10000,
              symbol: '10K',
              prefix: '¥',
              fractionDigits: 2
            });
        })
        .add('profit', node => {
          node.setAlias('Profit')
            .setAggregate({ func: 'sum' })
            .setEncoding('column')
            .setFormat({ autoFormat: true });
        })
        .add('discount', node => {
          node.setAlias('Avg Discount')
            .setAggregate({ func: 'avg' })
            .setEncoding('column')
            .setFormat({
              type: 'percent',
              fractionDigits: 1
            });
        });
    }
          applyBuilder(builder)
          setResult(await builder.buildVSeed())
        }
        run()
      }, [])
    
      if (!result) return <div>Loading...</div>
    
      return <VSeedRender vseed={result} />
    }

    remove-measure

    Remove a measure

    Loading...
    import { VBI, VBIChartBuilder } from '@visactor/vbi'
    import { DEMO_CONNECTOR_ID, VSeedRender } from '@components'
    import { useEffect, useState } from 'react'
    
    export default () => {
      const [result, setResult] = useState<any>(null)
    
      useEffect(() => {
        const run = async () => {
          const builder = VBI.chart.create({
            ...{
              "connectorId": "demoSupermarket",
              "chartType": "table",
              "dimensions": [],
              "measures": [
                {
                  "field": "sales",
                  "alias": "Sales",
                  "aggregate": {
                    "func": "sum"
                  },
                  "encoding": "yAxis"
                },
                {
                  "field": "profit",
                  "alias": "Profit",
                  "aggregate": {
                    "func": "sum"
                  },
                  "encoding": "yAxis"
                }
              ],
              "whereFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "havingFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "theme": "light",
              "locale": "en-US",
              "version": 1,
              "limit": 20
            },
            connectorId: DEMO_CONNECTOR_ID,
          })
          const applyBuilder = (builder: VBIChartBuilder) => {
      const measureId = builder.measures.toJSON().find(item => item.field === 'sales')?.id
      if (measureId) {
        builder.measures.update(measureId, n => n.setAlias('Sales to Remove'))
        builder.measures.remove(measureId)
      }
    }
          applyBuilder(builder)
          setResult(await builder.buildVSeed())
        }
        run()
      }, [])
    
      if (!result) return <div>Loading...</div>
    
      return <VSeedRender vseed={result} />
    }

    update-measure

    Update a measure

    Loading...
    import { VBI, VBIChartBuilder } from '@visactor/vbi'
    import { DEMO_CONNECTOR_ID, VSeedRender } from '@components'
    import { useEffect, useState } from 'react'
    
    export default () => {
      const [result, setResult] = useState<any>(null)
    
      useEffect(() => {
        const run = async () => {
          const builder = VBI.chart.create({
            ...{
              "connectorId": "demoSupermarket",
              "chartType": "table",
              "dimensions": [],
              "measures": [
                {
                  "field": "sales",
                  "alias": "Original Sales",
                  "aggregate": {
                    "func": "sum"
                  },
                  "encoding": "yAxis"
                }
              ],
              "whereFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "havingFilter": {
                "id": "root",
                "op": "and",
                "conditions": []
              },
              "theme": "light",
              "locale": "en-US",
              "version": 1,
              "limit": 20
            },
            connectorId: DEMO_CONNECTOR_ID,
          })
          const applyBuilder = (builder: VBIChartBuilder) => {
      const measureId = builder.measures.toJSON().find(item => item.field === 'sales')?.id
      if (measureId) {
        const measure = builder.measures.find((node) => node.getId() === measureId)
        if (measure) {
          measure.setAlias('Sales to Update').setEncoding('yAxis')
        }
        builder.measures.update(measureId, n => n.setAlias('New Sales').setAggregate({ func: 'avg' }))
      }
    }
          applyBuilder(builder)
          setResult(await builder.buildVSeed())
        }
        run()
      }, [])
    
      if (!result) return <div>Loading...</div>
    
      return <VSeedRender vseed={result} />
    }