function()

in src/plugins/vis_type_table/public/agg_table/agg_table.js [121:258]


        function () {
          const { table, exportTitle, percentageCol } = $scope;
          const showPercentage = percentageCol !== '';

          if (!table) {
            $scope.rows = null;
            $scope.formattedColumns = null;
            $scope.splitRow = null;
            return;
          }

          self.csv.filename = (exportTitle || table.title || 'unsaved') + '.csv';
          $scope.rows = table.rows;
          $scope.formattedColumns = [];

          if (typeof $scope.dimensions === 'undefined') return;

          const { buckets, metrics, splitColumn, splitRow } = $scope.dimensions;

          $scope.formattedColumns = table.columns
            .map(function (col, i) {
              const isBucket = buckets.find((bucket) => bucket.accessor === i);
              const isSplitColumn = splitColumn
                ? splitColumn.find((splitColumn) => splitColumn.accessor === i)
                : undefined;
              const isSplitRow = splitRow
                ? splitRow.find((splitRow) => splitRow.accessor === i)
                : undefined;
              const dimension =
                isBucket || isSplitColumn || metrics.find((metric) => metric.accessor === i);

              const formatter = dimension
                ? getFormatService().deserialize(dimension.format)
                : undefined;

              const formattedColumn = {
                id: col.id,
                title: col.name,
                formatter: formatter,
                filterable: !!isBucket,
              };

              if (isSplitRow) {
                $scope.splitRow = formattedColumn;
              }

              if (!dimension) return;

              const last = i === table.columns.length - 1;

              if (last || !isBucket) {
                formattedColumn.class = 'visualize-table-right';
              }

              const isDate =
                dimension.format?.id === 'date' || dimension.format?.params?.id === 'date';
              const allowsNumericalAggregations = formatter?.allowsNumericalAggregations;

              let { totalFunc } = $scope;
              if (typeof totalFunc === 'undefined' && showPercentage) {
                totalFunc = 'sum';
              }

              if (allowsNumericalAggregations || isDate || totalFunc === 'count') {
                const sum = (tableRows) => {
                  return _.reduce(
                    tableRows,
                    function (prev, curr) {
                      // some metrics return undefined for some of the values
                      // derivative is an example of this as it returns undefined in the first row
                      if (curr[col.id] === undefined) return prev;
                      return prev + curr[col.id];
                    },
                    0
                  );
                };

                formattedColumn.sumTotal = sum(table.rows);
                switch (totalFunc) {
                  case 'sum': {
                    if (!isDate) {
                      const total = formattedColumn.sumTotal;
                      formattedColumn.formattedTotal = formatter.convert(total);
                      formattedColumn.total = formattedColumn.sumTotal;
                    }
                    break;
                  }
                  case 'avg': {
                    if (!isDate) {
                      const total = sum(table.rows) / table.rows.length;
                      formattedColumn.formattedTotal = formatter.convert(total);
                      formattedColumn.total = total;
                    }
                    break;
                  }
                  case 'min': {
                    const total = _.chain(table.rows).map(col.id).min().value();
                    formattedColumn.formattedTotal = formatter.convert(total);
                    formattedColumn.total = total;
                    break;
                  }
                  case 'max': {
                    const total = _.chain(table.rows).map(col.id).max().value();
                    formattedColumn.formattedTotal = formatter.convert(total);
                    formattedColumn.total = total;
                    break;
                  }
                  case 'count': {
                    const total = table.rows.length;
                    formattedColumn.formattedTotal = total;
                    formattedColumn.total = total;
                    break;
                  }
                  default:
                    break;
                }
              }

              return formattedColumn;
            })
            .filter((column) => column);

          if (showPercentage) {
            const insertAtIndex = _.findIndex($scope.formattedColumns, { title: percentageCol });

            // column to show percentage for was removed
            if (insertAtIndex < 0) return;

            const { cols, rows } = addPercentageCol(
              $scope.formattedColumns,
              percentageCol,
              table.rows,
              insertAtIndex
            );
            $scope.rows = rows;
            $scope.formattedColumns = cols;
          }
        }