whole_func_string: function pivotTable(dataset) {
          var column_names = [];
          var xvalues = [];
          var values = {};
          var rows = {};
          for (rn in dataset.data) {
              // at first run fill the existing data (rows/columns/values)
              if (rn == 0) {
                  // skip first row as it contains column names we don't need for pivot
                  continue;
              }
              var val1 = dataset.data[rn][0];
              var val2 = dataset.data[rn][1];
              if (column_names.indexOf(val2) == -1) {
                  column_names.push(val2);
              }
              if (xvalues.indexOf(val1) == -1) {
                  xvalues.push(val1);
              }
              if (!(val1 in values)) {
                  values[val1] = [];
              }
              values[val1][val2] = dataset.data[rn][2];
          }
  
          for (n in xvalues) {
              // at second run fill the missing values with nulls
              var val1 = xvalues[n];
              rows[val1] = [];
              for (m in column_names) {
                  var val2 = column_names[m];
                  if (val1 in values && val2 in values[val1]) {
                      rows[val1].push(values[val1][val2]);
                  } else {
                      rows[val1].push(null);
                  }
              }
          }
  
          var res = [];
          column_names.unshift(dataset.fields[0].name);
          res.push(column_names); // first row is pivot column names
          xvalues.forEach(function (item) {
              var r = [item].concat(rows[item]);
              res.push(r);
          });
  
          return res;
      }
func_code_string: function pivotTable(dataset) {
          var column_names = [];
          var xvalues = [];
          var values = {};
          var rows = {};
          for (rn in dataset.data) {
              // at first run fill the existing data (rows/columns/values)
              if (rn == 0) {
                  // skip first row as it contains column names we don't need for pivot
                  continue;
              }
              var val1 = dataset.data[rn][0];
              var val2 = dataset.data[rn][1];
              if (column_names.indexOf(val2) == -1) {
                  column_names.push(val2);
              }
              if (xvalues.indexOf(val1) == -1) {
                  xvalues.push(val1);
              }
              if (!(val1 in values)) {
                  values[val1] = [];
              }
              values[val1][val2] = dataset.data[rn][2];
          }
  
          for (n in xvalues) {
              // at second run fill the missing values with nulls
              var val1 = xvalues[n];
              rows[val1] = [];
              for (m in column_names) {
                  var val2 = column_names[m];
                  if (val1 in values && val2 in values[val1]) {
                      rows[val1].push(values[val1][val2]);
                  } else {
                      rows[val1].push(null);
                  }
              }
          }
  
          var res = [];
          column_names.unshift(dataset.fields[0].name);
          res.push(column_names); // first row is pivot column names
          xvalues.forEach(function (item) {
              var r = [item].concat(rows[item]);
              res.push(r);
          });
  
          return res;
      }
func_documentation_string: return a pivot data for a dataset