function getAllColumnsAndFields(x, yPred, yTrue, modelsMeta) {
  const {classLabels, nModels, nClasses} = modelsMeta;
  const {columns: columnsX, fields: fieldsX} = columnsAndFieldsFromX(x);
  const {
    columns: columnsYPred,
    fields: fieldsYPred,
  } = columnsAndFieldsFromYPred(yPred, classLabels);
  const {
    columns: columnsYTrue,
    fields: fieldsYTrue,
  } = columnsAndFieldsFromYTrue(yTrue);
  const {
    columns: columnsScore,
    fields: fieldsScore,
  } = columnsAndFieldsFromScore(columnsYPred, columnsYTrue, modelsMeta);

  const columns = [].concat.apply(
    [],
    [columnsX, columnsYPred, columnsYTrue, columnsScore]
  );
  const fields = [].concat.apply(
    [],
    [fieldsX, fieldsYPred, fieldsYTrue, fieldsScore]
  );

  // add a uuid column
  columns.unshift(dotRange(yTrue.length).map(makeUuid));
  fields.unshift({
    name: UUID_NAME,
    type: FEATURE_TYPE.UUID,
    role: FIELD_ROLE.UUID,
    dataType: DATA_TYPE.STRING,
  });
  // reassign tableFieldIndex
  fields.forEach((f, i) => {
    f.tableFieldIndex = i + 1;
  });

  const numFeatures = fieldsX.length;
  const numPredCols = nModels * nClasses;
  return {
    data: {columns, fields},
    columnTypeRanges: {
      [UUID_NAME]: [0, 1],
      x: [1, numFeatures + 1],
      yPred: [numFeatures + 1, numFeatures + numPredCols + 1],
      yTrue: [numFeatures + numPredCols + 1, numFeatures + numPredCols + 2],
      score: [numFeatures + numPredCols + 2, columns.length],
    },
  };
}
merge x, yPred, yTrue into one array of arrays; compute column metadata
@param {Array<Object>} x feature data, objects are rows, object keys are feature names
@param {Array<Array<Object>} yPred prediction data of multiple models, each sub array represent predictions from one model, each object has keys representing class names
@param {Array<Number|String>} yTrue ground truth
@param {Array<String>} classLabels
@return {Object} {data: {columns, fields}, collumnTypeRanges: {uuid, x, yPred, yTrue}}
columns: array of array of columns
fields: array of field metadata
collumnTypeRanges: map from "column type" (x, yPred, etc) to array of 2 elements indicating the start and end index of that column type in dataset